Перейти к содержанию
    

UART через DMA

Добрый день. Помогите разобраться с работой DMA, и настройкой работы UART через него в частности.

Контроллер MSP430F5438, среда IAR.

 

На данный момент, посмотрел работу проекта с сайта техаса, все работает, но как пытаюсь делать что-то свое, то не получается. В целом, не могу понять почему, если UART1 сгонфигурировать на работу с DMA0, то все отлично, если тоже самое проделать, но для работы с DMA1, то ничего не работает.

 

Теперь немного выдержек из кода:

Конфигурация USCI для работы в режиме UART:

 
/* 1. Reset the USCI. */
UCA0CTL1 |= UCSWRST;
    
/* 2. Initialize USCI registers. */
// No parity bit, one stop bit, 8-bit data, no echo, UART Mode, no multiprocessor mode
UCA0CTL0 = 0x00;                   
    
// Normal clocking scheme, SMCLK, start edge feature off, chars are data
UCA0CTL1 |= UCSSEL1;                       
    
/* Set the baudrate based on clock speed:
** 0x8A -> 57600Bd @ 8MHz CLK
** 0x9c -> 115200Bd @ 18MHz CLK
** 0x8B -> 115200Bd @ 16MHz CLK 
*/
UCA0BR0 = 0x9c;
UCA0BR1 = 0x00; 
    
// Set the modulation.
UCA0MCTL = UCBRS_3 + UCBRF_0;           
    
/* 3. Configure ports. */
// Set the port pins P3.4, P3.5 for '1' as the peripherial function.
P3SEL |= BIT5 + BIT4;                        
    
// Configure P3.5 as ouptut and other pins as input.
// In fact it's not nessary operation, because we have the default values.
P3DIR |= BIT5;
    
/* 4. Release the USCI for the operations. */
UCA0CTL1 &= ~UCSWRST;

Сам код отправки:

DMACTL0 = DMA0TSEL_17;
__data16_write_addr( ( unsigned short )&DMA0SA, ( unsigned long )pSendingString );
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &UCA0TXBUF);
DMA0SZ = sizeof( pSendingString - 1 );
DMA0CTL = DMADT_0 + DMASRCINCR_3 + DMASBDB + DMAEN;
UCA0IFG &= ~UCTXIFG;                      
UCA0IFG |= UCTXIFG;

 

С Texas работую впервые, в целом с контроллерами тоже недавно, потому хотелось узнать несколько моментов по-поводу кода, так как некоторые моменты взял из примеров и в принципе не особо понимаю, что они означают в частности:

// Set the modulation.
UCA0MCTL = UCBRS_3 + UCBRF_0;

Прочитав документацию на контроллер, тоже не совсем ясно исходя из чего нужно выбирать полосу пропускания и как для выбранной частоты высчитывать множитель для регистра UCA0BR0.

Так же было бы неплохо, если бы указали возможные недочеты в коде и пути исправления :)

 

И напоследок, дабы не создавать нового топика вопрос архитектурного плана: работу UART через DMA я решил сделать, прочитав рекомeндации создателей FreeRTOS, так как именно для нее в дальнейшем это и понадобиться. В связи с этим вопрос: как лучше организовать в данном случае архитектуру, если предполагается около 4-5 UART устройств взаимодействующих с данным контроллером, и стоит ли городить весь UART через DMA, или же достаточно только RX части?

 

Большое спасибо за любую оказанную помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выскажу свое личное мнение по поводу использования DMA. У MSP430 модуль DMA использует ту же шину, что и ядро процессора. Поэтому выигрыша в быстродействии DMA не дает, т.к. ядро в это время простаивает. Конечно использование DMA по сравнению с использованием прерываний позволяет сэкономить несколько тактов на сохранении/восстановлении контекста при входе/выходе из прерывания. Но поскольку добавляется процедура конфигурирования DMA и таймауты шины во время когда DMA занимает ее для трансфера данных (как минимум 2 такта MCLK на трансфер каждого байта/слова), то этот эффект сказывается лишь на сравнительно больших пакетах.

По поводу использования USCI. Почитайте описание этого модуля в руководстве по MSP430X2xx серии. Модуль в этой серии по функциональности точно такой же, что и в серии MSP430F5xxx. Перевод указанного руководства на русский язык есть в библиотечке фирмы Компэл. Но читайте осторожно, т.к. в переводе возможны опечатки!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, тогда действительно не стоит с ним забивать себе голову, так как пакеты не большие, их просто много.

 

А как тогда реализовывать работу UART, видел что вроде делают через Circular Buffers? Или, может знакомы с FreeRTOS, как туда сразу приспособить для более удобной работы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, тогда действительно не стоит с ним забивать себе голову, так как пакеты не большие, их просто много.

 

А как тогда реализовывать работу UART, видел что вроде делают через Circular Buffers? Или, может знакомы с FreeRTOS, как туда сразу приспособить для более удобной работы?

С FreeRTOS я не знаком, а циклический буфер организовать это вовсе не сложно. Вот тут и вот в этой теме я когда-то Дарье про них объяснял.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...