【问题标题】:MSP430 use DMA to transfer float var stored in RAMMSP430 使用 DMA 传输存储在 RAM 中的 float var
【发布时间】:2015-11-27 09:45:11
【问题描述】:

我会尽量说得更清楚: 我需要将在 RAM 内存中计算的 3 个浮点 var 传输到存储在 RAM 内存中不同位置的缓冲区中:我编写了一个代码来执行此操作,但缓冲区没有以正确的方式填充:我只能读取一个值。这是 RAM 中计算 var 的函数

#pragma CODE_SECTION(Calculatevar,".FLASHCODE")
void Calculatevar(volatile signed char *a,volatile signed char *b,volatile signed char *c)
{
float axg, ayg, azg; // x, y, and z axis readings of the accelerometer
volatile unsigned char a_x,a_y,a_z;

axg = (ax + 2083)/16131.0;
ayg = (ay + 208)/16131.0;
azg = (az + 204)/16131.0;

*a=axg*126;
*b=ayg*126;
*c=azg*126;
}

在 main() 中我写了 Calculatevar(&a,&b,&c);定义 volatile 有符号字符 a、b、c; 这是DMA函数:

   unsigned char DMA_transfer(buffer *pointer_buffer) //DATA WRITE/PUSH
{ int next = pointer_buffer->head + 1;
   if (next >= pointer_buffer->Num_Samples)
    next = 0;
   //buffer is full
    DMA0SZ =pointer_buffer->Num_Samples;
//    __data20_write_long((unsigned long) &DMA0SA,(unsigned long) &d1);
    __data20_write_long((unsigned long) &DMA0SA,(unsigned long) & a);
    __data20_write_long((unsigned long) &DMA0DA,(unsigned long) &pointer_buffer->buffer[pointer_buffer->head]);
    DMA0CTL |= DMAEN +DMAIE;                         // Enable DMA0
    DMA0CTL |= DMAREQ;                      // Trigger block transfer
    pointer_buffer->head = next;
    return 0;
}

我错过了什么?

【问题讨论】:

  • 什么是aNum_Samples 是什么?
  • a 是我需要获取的 var 之一,而 Num_samples 是存储在缓冲区中的字符数,定义为:typedef struct { volatile signed char * const buffer; int head; int tail; const int Num_Samples; }buffer;
  • 显示a的定义。
  • a,b,c 被定义为volatile signed char a,b,c; 作为一个全局变量
  • abc的地址是什么? (查看地图文件。)

标签: floating-point ram msp430 dma


【解决方案1】:

对于初学者来说,第一个 sn-p 与 DMA 无关,并显示存储了 3 个字符而不是浮点数。

其次,没有代码设置块传输、源/目标地址更改或字节(相对于字)传输。

如果没有其他代码配置 DMA0,则一个字的默认单传输模式将仅说明正确传输的一个值,因为在每次 DMA0SZ 传输次数后,源地址和目标地址都不会增加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2022-06-11
    • 2019-04-26
    • 2017-08-26
    • 1970-01-01
    • 2014-06-27
    • 2018-05-03
    相关资源
    最近更新 更多