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