开篇分割线,我们在上一篇讲过了uart相关的ops函数集,还有个更重要的就是uart中断,发送你可以不用,但是接收什么时候来数据,数据能不能及时的进行处理,这都离不开中断的作用,所以一般应用中中断接收是必选项。
我们在写uart驱动的时候,就需要考虑如何将中断事件(有接收数据到达)通知给uart设备驱动框架(也就是serial层),怎么发通知呢,当然是调用uart设备驱动框架提供的rt_hw_serial_isr函数,设备框架才能知道中断到底发生了什么事。函数原型如下:
serial:串口设备句柄,来自于哪个串口设备的中断,对应的句柄就是谁。
event:中断事件类型。
接下来看一下stm32——uart设备中断处理的真实操作:
这段代码是uart_isr 的一部分专门处理接收中断触发的数据,作用很简单,如果读数据寄存器不为空,且RXNE为中断使能状态,则调用rt_hw_serial_isr触发读数据操作,关于该函数的响应事件类型如下:
接下来我们看下框架提供的代码都做了哪些工作?
当触发事件为接收一个字符是,那么就开启读取一个字符,在进行数据存储时防止数据出现异常,关闭硬件中断,写入成功后再次开启终端,再中断关闭时,中断标记位是有效的,也就是说连续来的数据可能已经写入到了DR寄存器中,所以这个时候就可以连续读DR寄存器,直到ch返回-1。这个时候代表这当前已无数据,判断当前回调函数是否为空,不为空则更新缓冲区新存入数据长度(这个过程依旧是关中断执行)。得到正确的数据长度后,调用回调函数读取数据,到这里关于uart设备驱动的全部内容就结束了,当然关于发送中断、DMA中断部分内容并没有深入去讲解,感兴趣的小伙伴可以自己尝试分析分析该部分代码的实现逻辑。
接下来是我们更感兴趣的serial层数据的处理,筒子们下期再见~!