
每次使用串口通信的时候,碰到设置串口通信的波特率时就在想,USART通信速度太慢,占用了太多的CPU时间。如设置波特率为9600时,发送一个字节,8位需要的时间将近1ms,如果采用等待的方式,CPU非常浪费,尤其是在连续发送一段数据的时候,CPU就完全停滞不能干任何其他的东西。于是就萌生了为USART建立一个FIFO缓存区,当缓存区非空时,自动调用串口发送中断将数据发送出去。这样CPU就能从等待中解放出来做其他事情。 算法思路:模仿ST官方例程USB建立缓存区的方法,分配一个缓存区,大小由USART_Tx_DATA_SIZE定义,具体值由应用决定。* h; M- |0 a, k }5 P 下面给出几个主要参数的说明: 4 O% B5 d- Y/ T. N1 \2 ^5 G5 f5 t+ G* U uint8_t USART_Tx_Buffer[USART_Tx_DATA_SIZE];//分配缓存区; S' Z2 l- c* Q6 i uint8_t USART_Tx_flag = 0;//标记缓存区是否有数据 uint32_t USART_Tx_ptr_in = 0;//发送队列尾指针 uint32_t USART_Tx_ptr_out = 0;//发送队列头指针,即将被发送的数据地址+ }7 j' \! i, J& d& a* @( c uint32_t USART_Tx_length = 0;//发送区为发送的数据长度6 c! a, k3 H2 I7 L0 p 经过这样分配之后,通过串口发送数据变成了向缓存区队列写入数据,中断函数完成数据的发送。除执行中断函数外,其他时间,CPU可以干任何其他事情。这就解决了发送串口数据占用时间过长的问题。 源代码在附件中,使用的MCU是stm32f103vct6。实际使用过程中,其稳定性还是挺高的,只是会频繁的产生中断。其中的不足是,当工程中有USB bulk通信和串口一起通信时,USB中断会干扰串口,导致串口乱码,具体是怎么导致的未研究。有兴趣的大虾可以研究下。+ c/ L- q2 V; p& d2 p 本人学生一枚,经济实力有限,又非常想学f4,望斑斑沐紫大姐垂青。 ![]() $ L3 R8 J; U# l2 n j. | |
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