
每次使用串口通信的时候,碰到设置串口通信的波特率时就在想,USART通信速度太慢,占用了太多的CPU时间。如设置波特率为9600时,发送一个字节,8位需要的时间将近1ms,如果采用等待的方式,CPU非常浪费,尤其是在连续发送一段数据的时候,CPU就完全停滞不能干任何其他的东西。于是就萌生了为USART建立一个FIFO缓存区,当缓存区非空时,自动调用串口发送中断将数据发送出去。这样CPU就能从等待中解放出来做其他事情。3 H- G) o' o7 _! S* g 算法思路:模仿ST官方例程USB建立缓存区的方法,分配一个缓存区,大小由USART_Tx_DATA_SIZE定义,具体值由应用决定。( F, {# V5 E: P( | i/ p8 e9 M 下面给出几个主要参数的说明: uint8_t USART_Tx_Buffer[USART_Tx_DATA_SIZE];//分配缓存区 uint8_t USART_Tx_flag = 0;//标记缓存区是否有数据# {8 l) y7 T" J. S% I+ Z) @8 e uint32_t USART_Tx_ptr_in = 0;//发送队列尾指针0 m6 k; e! o' V8 B8 H) Q% \6 h uint32_t USART_Tx_ptr_out = 0;//发送队列头指针,即将被发送的数据地址5 ~+ f: u F0 K- E uint32_t USART_Tx_length = 0;//发送区为发送的数据长度5 ]9 I: `) D) O# n: B5 _ 经过这样分配之后,通过串口发送数据变成了向缓存区队列写入数据,中断函数完成数据的发送。除执行中断函数外,其他时间,CPU可以干任何其他事情。这就解决了发送串口数据占用时间过长的问题。 源代码在附件中,使用的MCU是stm32f103vct6。实际使用过程中,其稳定性还是挺高的,只是会频繁的产生中断。其中的不足是,当工程中有USB bulk通信和串口一起通信时,USB中断会干扰串口,导致串口乱码,具体是怎么导致的未研究。有兴趣的大虾可以研究下。" o( @$ l8 P# X$ _ 本人学生一枚,经济实力有限,又非常想学f4,望斑斑沐紫大姐垂青。 ![]() . ]3 Q& Z3 g+ z J' l |
STM32VC_USART_FIFO.rar
下载270.23 KB, 下载次数: 1352
RE:【MCU实战经验】+为USART建立一个FIFO
回复:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
回复:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
回复:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO
RE:【MCU实战经验】+为USART建立一个FIFO