MSP430 использует DMA для передачи переменной с плавающей запятой, хранящейся в ОЗУ.

Я постараюсь быть более ясным: мне нужно передать 3 числа с плавающей запятой, вычисленные в оперативной памяти, в буфер, хранящийся в другом месте в оперативной памяти: я написал код для этого, но буфер не заполнен правильно способ: я могу прочитать только одно значение. Это функция в оперативной памяти, которая вычисляет переменную

#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;
}

Что мне не хватает??


person Dodz    schedule 27.11.2015    source источник
comment
Что такое a? Что такое Num_Samples?   -  person CL.    schedule 27.11.2015
comment
a - это одна из переменных, которую мне нужно получить, а Num_samples - это количество символов, хранящихся в буфере, определяемом как: typedef struct { volatile signed char * const buffer; int head; int tail; const int Num_Samples; }buffer;   -  person Dodz    schedule 27.11.2015
comment
Покажите определение a.   -  person CL.    schedule 27.11.2015
comment
a,b,c определены как volatile signed char a,b,c; как глобальная переменная   -  person Dodz    schedule 27.11.2015
comment
Каковы адреса a, b и c? (Загляните в файл карты.)   -  person CL.    schedule 27.11.2015
comment
Я решил избежать переключения арифметики с плавающей запятой на подписанный char. У меня все еще возникают проблемы при передаче данных ... но я думаю, что теперь это не по теме, поскольку это не так близко к первоначальному вопросу. В любом случае адрес: a=0x001C25 b=0x001C26 c=0x001C27   -  person Dodz    schedule 02.12.2015
comment
Это работает с chars?   -  person CL.    schedule 02.12.2015


Ответы (1)


Во-первых, первый фрагмент не имеет отношения к DMA и показывает, что вместо чисел с плавающей запятой хранятся 3 символа.

Во-вторых, нет кода, устанавливающего блочные передачи, изменение адреса источника/получателя или передачу байтов (а не слов).

Если нет другого кода, конфигурирующего DMA0, режим одиночной передачи одного слова по умолчанию будет учитывать только одно правильно переданное значение, поскольку ни адрес источника, ни адрес назначения не увеличиваются после каждой из передач DMA0SZ.

person Michael Kusch    schedule 30.12.2015