关于STM32F207中串口使用DMA及串口接收中断实现接收不定长数据
最近在做一个项目,刚好用到串口。并且需要接收不定长的数据。
1、串口接收不定长数据有两种方式,一种是串口接收中断和空闲接收中断配合,串口接收中断不断接收传输过来的数据,当一帧数据接受到时,空闲中断触发,在空闲中断中把接收完成标志位置位。
*注意:空闲中断的标志位的清除是通过读状态位及数据位操作后,软件自动清除。
2、第二种方式就是使用到DMA接收和空闲中断配合。
*注意:在使用DMA接收方式时,如果是需要不断接收数据时,需要使能循环模式。每次接收完一帧数据后需要执行:失能DMA通道,然后设置缓冲区的大小,最后使能DMA通道。
先睡觉了有时间再补全代码和细节。最近天天加班到十点。太难了…
继续上一年没有完成的事情。。。。
2021/3/2
一、上一年所做的项目使用的是国产兆易创新的GD32F207芯片,由于ST的固件库无法通用到这款国产芯片,所以也只能使用兆易官网的固件库进行开发,这就导致许多的许多的函数及操作是不相同的。但是只需要搞清楚底层寄存器的操作,那么都是大同小异的。
二、上一年的项目中使用串口空闲中断和DMA进行配合接收不定长的数据,而发送则使用的是堵塞的方式。其中比较需要注意的点也已经说过了。还有特别需要注意的就是在实际的开发项目中,需要设置缓存区,因为在接收数据时数据传输过快时导致数据丢失是比较严重的BUG。所以在串口中断中先把数据从DMA设置的FIFO中提取到缓冲区后在进行处理。
三、在年初的时候又做了一个类似的项目,其中也用到了串口的空闲中断和DMA接收不定长数据,但是这次使用的是F407这款芯片,在照搬上面的操作过去发现并不能完美实现功能,其中问题在于在进行失能DMA通道、然后设置缓冲区的大小、最后使能DMA通道这些操作后,DMA停止工作了,花了一些时间去看了芯片手册后发现,使能DMA操作之前需要把全接受完成的那个标志位清除才行。