项目开发中使用AT32F415的串口DMA+空闲中断接收不定长数据,由于AT32的库类似STM32的标准库,外设的使用上并没有STM32 HAL库那么方便直接一个函数搞定,收发处理需要自己写。网上有非常多的STM32标准库的串口DMA+空闲中断接收不定长数据代码,直接搬过来,但实际上碰到了一些问题,并不能直接用。
主要遇到的问题:
- 串口的帧错误标志位被置1
- 触发空闲中断后DMA只传了1个字符
- 串口助手返回的前几个字符不对
- 回环测试中收发字符数不相等
解决方法:
- 对于第一个问题,帧错误标志位被置1说明串口接收波形出错导致不能正确识别到停止位,检查出来的原因是接收引脚的GPIO模式被设成了上拉输入,改成浮空输入后,帧错误标志位正常。
- 第二个问题原本设置的波特率是921600,波特率降到115200后可以正常接收全部数据,最后查出来原因是系统时钟错了,外部晶振本来是8M的,后来换成了25M,但程序里还是按照8M设置的系统时钟,导致串口外设时钟和实际计算出的波特率也跟着错了。
- 第3、4个问题是串口助手有bug,换一个就好了。