打印
[综合信息]

带硬件FIFO的串口驱动程序设计思路

[复制链接]
2822|42
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2023-8-24 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口具有硬件FIFO可以降低中断频率,对于需要高波特率数据传输,MCU本身速度比较慢,或有更高级优先级中断需要及时处理的场合就显得比较重要。通常,即便串口本身带硬件FIFO,在编写串口驱动程序时,仍然需要在上层在加一层软件FIFO(或RingBuffer),本文在串口中断的基础上介绍带硬件FIFO的串口驱动程序设计。

1.串口发送

串口发送有上层应用主动发起,设计起来相对简单。

中断开启:开启硬件FIFO空中断或发送完成(TXC)中断(初始化时关闭,在发送函数中打开)。

1)发送接口

函数原型:

uint32_t UART_SendBuf(uint8_t *pData, uint32_t nLength);
思路:

a)首次数据传输,将数据丢入软件FIFO中,从软件FIFO中取最大为硬件FIFO深度的的数据丢入硬件FIFO,置位数据传输标志,开启串口传输完成中断(TXC),返回。

b)正在数据传输中(ISR TXC已开启),将数据丢入软件FIFO中,返回。

2)发送ISR

a)从软件FIFO中取最大为硬件FIFO深度的数据丢入硬件FIFO,返回。

b)若从软件FIFO中取数据为空,关闭串口传输完成中断,返回。

2.串口接收

串口接受由外部数据传入,因此由ISR驱动。

中断开启:开启硬件FIFO Level中断,Timeout中断。

1)接收接口

函数原型:

uint32_t UART_RecvBuf(uint8_t *pData, uint32_t nLength);
思路:

软件FIFO不空,读取指定长度数据,返回。

2)接收ISR(硬件FIFO达到Level中断)

a)检查硬件Level中断标志位,读取硬件FIFO中所有数据,丢入软件FIFO中,返回。

b)检查硬件Timeout中断标志位,读取硬件FIFO中所有数据,丢入软件FIFO中,返回。这一步主要是考虑到接收数据未达到Level时的情况。

总结:本文介绍了带硬件FIFO的串口驱动程序设计思路,对于需要使用硬件FIFO的串口驱动程序可以参考。
————————————————
版权声明:本文为CSDN博主「propor」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/propor/article/details/131239937

使用特权

评论回复

相关帖子

沙发
chenho| | 2023-8-25 22:27 | 只看该作者
需要高波特率数据传输时有用

使用特权

评论回复
板凳
updownq| | 2023-9-5 11:18 | 只看该作者
从软件FIFO中取最大为硬件FIFO深度的数据丢入硬件FIFO,置位数据传输标志

使用特权

评论回复
地板
adolphcocker| | 2023-9-5 11:41 | 只看该作者
在配置串口之后,需要实现数据在硬件FIFO和串口之间的传输过程。这包括数据准备、数据传输、数据完成等步骤。在数据传输过程中,需要使用硬件FIFO来保证数据的顺序和完整性。

使用特权

评论回复
5
biechedan| | 2023-9-5 12:08 | 只看该作者
中断处理程序负责处理接收和发送中断。在接收中断处理程序中,需要从硬件FIFO中取出数据并存入接收数据缓存区;在发送中断处理程序中,需要检查发送数据缓存区中是否有数据待发送,如果有则从发送数据缓存区中取出数据并写入硬件FIFO。

使用特权

评论回复
6
sheflynn| | 2023-9-5 12:21 | 只看该作者
通过合理的设计,可以实现高速、可靠的串口通信,满足实际应用需求。

使用特权

评论回复
7
sdlls| | 2023-9-5 12:34 | 只看该作者
需要考虑数据在硬件FIFO和串口之间的传输过程,包括数据准备、数据传输、数据完成等步骤。

使用特权

评论回复
8
modesty3jonah| | 2023-9-5 12:42 | 只看该作者
在程序运行过程中,需要对可能出现的异常情况进行处理。包括硬件FIFO异常、串口异常等问题。可以实现相应的异常处理机制,如通过打印错误信息等方式来处理异常情况。

使用特权

评论回复
9
cashrwood| | 2023-9-5 12:58 | 只看该作者
上层应用通过驱动程序提供的接口函数,将要发送的数据写入发送数据缓存区,并将数据传输给硬件FIFO。如果当前硬件FIFO不满,驱动程序将直接将数据写入硬件FIFO;如果硬件FIFO已满,驱动程序将等待接收中断处理程序从硬件FIFO中取出数据后再写入。

使用特权

评论回复
10
dspmana| | 2023-9-5 13:13 | 只看该作者
需要考虑异常处理的问题,包括硬件FIFO异常、串口异常等问题。

使用特权

评论回复
11
sheflynn| | 2023-9-5 13:28 | 只看该作者
提供读取接收FIFO缓冲区数据的接口函数。应该支持按字节或按缓冲区块读取数据,并确保从FIFO缓冲区读取的数据不会导致数据溢出。

使用特权

评论回复
12
mollylawrence| | 2023-9-5 13:35 | 只看该作者
在进行串口通信时,需要先将需要发送的数据写入FIFO中,然后通过串口控制寄存器启动串口通信,将数据发送到外设中。

使用特权

评论回复
13
pixhw| | 2023-9-5 13:50 | 只看该作者
在数据传输过程中,需要考虑数据同步的问题。包括主从设备的数据同步、同时写入数据等问题。这可以通过使用硬件锁存器等方法来实现。

使用特权

评论回复
14
mnynt121| | 2023-9-5 14:01 | 只看该作者
在程序启动时,需要对硬件FIFO进行初始化,包括配置FIFO参数、初始化硬件设备等。

使用特权

评论回复
15
hearstnorman323| | 2023-9-5 14:15 | 只看该作者
在进行串口通信时,外设会将接收到的数据写入FIFO中,因此在串口通信结束后,可以从FIFO中读取接收到的数据。

使用特权

评论回复
16
deliahouse887| | 2023-9-5 14:32 | 只看该作者
从硬件FIFO中读取数据并将其存储到接收缓冲区中(对于接收数据)。
从发送缓冲区中获取数据并将其写入硬件FIFO以进行传输(对于发送数据)。

使用特权

评论回复
17
51xlf| | 2023-9-5 14:40 | 只看该作者
需要考虑数据同步的问题,包括主从设备的数据同步、同时写入数据等问题。

使用特权

评论回复
18
wwppd| | 2023-9-5 14:52 | 只看该作者
带硬件FIFO的串口驱动程序的设计思路需要考虑硬件FIFO的配置、串口参数设置、数据传输过程、数据同步以及异常处理等因素。

使用特权

评论回复
19
timfordlare| | 2023-9-5 15:07 | 只看该作者
中断处理程序负责处理接收和发送中断。在接收中断处理程序中,需要从硬件FIFO中取出数据并存入接收数据缓存区;在发送中断处理程序中,需要检查发送数据缓存区中是否有数据待发送,如果有则从发送数据缓存区中取出数据并写入硬件FIFO。

使用特权

评论回复
20
iyoum| | 2023-9-5 15:14 | 只看该作者
创建两个FIFO缓冲区,一个用于存储接收到的数据,另一个用于存储待发送的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

3317

帖子

4

粉丝