主题思想:
接收:配置串口DMA接收,打开串口的空闲中断,但是配置DMA接收的长度一定要合适,小了的话容易溢出。然后在串口的空闲中断里,关闭DMA的接收,且取出DMA数据,转存也好,直接处理也好。完了之后,再次配置DMA接收,把地址指向DMA接受数组的开始。
发送:DMA发送时,置位标记,需等发送完成中断里清零标记,防止连续调用DMA发送,造成上次没发完,这次直接更改了DMA发送的指针。导致发送不完整。
一、CubeMX配置(图不是一个工程的,仅作参考)
- 配置串口,可配置多个串口,方式相同
- 配置完成后,根据使用习惯生成代码
二、改写代码(代码是F103,用了Uart1和Uart3)
- 打开MDK,修改DMA处void MX_DMA_Init(void) 里,无需DMA接收中断,注释掉DMA接收中断,具体注释掉通道几,根据芯片来
void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel2_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0)