CCS配置MSPM0G3507(六) DMA串口发送
·
一.sysconfig
(1)Basci Config
1.选择 BUSCLK 时钟源
2.选择8分频
3.设置为8位数据位、无校验位、一位停止位
(2)Advanced Config
1.选择Nromal UART
2.选择通信方向位TX和RX
3.Oversampling(过采样) 选择为16
4.RX FIFO contains >= 1 entry
4.TX FIFO contains 1 entry
5.其余默认
(3)Interrupt Config
使能DMA done transit 和 End of transmission
(4)DMA Config
1.选择UART TX interrupt
2.地址模式设置为 块地址(用户)到固定地址(UART->TX_)
3.设置源长度为一个字节
4.源地址方向为自加 Increment
5.目标长度为一个字节
6.转换模式Transfer Mode 设置为 Single
7.Source Address Increment Do not change address
8.Destination Address Increment Do not change address
9.选择DMA通道
(5).Pin Mux
1.选择使用哪个DMA
2.选择串口的引脚
二.代码
1.重要代码
//设置源地址
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(data));
//设置目标地址
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->TXDATA));
//设置要搬运的字节数
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, size);
//使能DMA通道
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
2.编写DMA串口发送函数
void UART0_Console_write(uint8_t *data, uint16_t size)
{
//当串口发送完毕后,才可再次发送
if(gConsoleTxTransmitted)
{
//设置源地址
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(data));
//设置目标地址
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->TXDATA));
//设置要搬运的字节数
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, size);
//使能DMA通道
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
gConsoleTxTransmitted = false;
gConsoleTxDMATransmitted = false;
}
}
3.主函数
volatile bool gConsoleTxDMATransmitted = false;
volatile bool gConsoleTxTransmitted = true;
int main(void)
{
SYSCFG_DL_init();
//开启UART中断
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
//使能DMA通道
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
while (1)
{
//用户编写的DMA串口发送函数
UART0_Console_write("hello\r\n",7);
delay_cycles(3200000);
}
}
4.编写串口中断服务函数
void UART_0_INST_IRQHandler(void)
{
switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
//串口发送完成
case DL_UART_MAIN_IIDX_EOT_DONE:
gConsoleTxTransmitted = true;
break;
//DMA搬运完成
case DL_UART_MAIN_IIDX_DMA_DONE_TX:
gConsoleTxDMATransmitted = true;
break;
default:
break;
}
}
更多推荐
已为社区贡献8条内容
所有评论(0)