Контроллер 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;
__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;
UCA0MCTL = UCBRS_3 + UCBRF_0;
Прочитав документацию на контроллер, тоже не совсем ясно исходя из чего нужно выбирать полосу пропускания и как для выбранной частоты высчитывать множитель для регистра UCA0BR0.
Так же было бы неплохо, если бы указали возможные недочеты в коде и пути исправления

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