Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART через DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
devfom
Добрый день. Помогите разобраться с работой 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.
Так же было бы неплохо, если бы указали возможные недочеты в коде и пути исправления sm.gif

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

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

А как тогда реализовывать работу UART, видел что вроде делают через Circular Buffers? Или, может знакомы с FreeRTOS, как туда сразу приспособить для более удобной работы?
rezident
Цитата(devfom @ Jun 16 2011, 00:07) *
Спасибо, тогда действительно не стоит с ним забивать себе голову, так как пакеты не большие, их просто много.

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

С FreeRTOS я не знаком, а циклический буфер организовать это вовсе не сложно. Вот тут и вот в этой теме я когда-то Дарье про них объяснял.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.