串口收发,在应用层通常都是直接调度UART_READ和UART_WRITE,不用去管中断的事。如果这两个函数没做好,发送的时候会多发,少发或者顺序颠倒,接收也会有这种问题。
我的一种思路。就是用DMA来模拟FIFO,STM32和GD32的UART,有个TC中断和一个IDLE中断,和FIFO的TX中断,RX_TIMEOUT中断类型。
发送的时候,设置一个软件FIFO,有push,pop,count。在调度UART_WRITE的时候,先获取count,再用PUSH来计数,函数结速的时候,count加上填入的值,开TC中断。TC中断会立即触发,在中断服务中发送DMA,DMA以POP为头,count为长度,设置DMA,不能超界。
因为TC中断在复位的时候就有标志位,而且在清除标志位后,必须等到DMA发完才能重新设置标志位。
|