MSP430使用DMA传输存储在RAM中的浮点变量



我会尽量说得更清楚:我需要将RAM内存中计算的3个浮点变量转移到存储在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);定义易失性有符号字符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;
}

我缺少什么??

对于初学者来说,第一个片段与DMA没有关系,并且显示了存储的3个字符,而不是浮点。

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

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

最新更新