请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
(代码仓库地址:https://gitee.com/luobing4365/yie002-explorer
具体参考博客:YIE002开发探索-Gitee代码仓库说明)
用轮询的方式获取串口数据,是一种非常低效的方法。本篇尝试使用中断的方式,来实现串口的通信。
1 STM32的串口中断
在上一篇中,简单介绍过STM32的串口。轮询方式的编码中,只需要了解相关API的用法就可以了,编写相对简单。
对中断编程而言,这种程度的背景知识是不够的。STM32的Cube Library构建了完整的串口中断编程架构,也提供了相应的API函数供调用。不过,从我的角度来看,这个架构有点难以理解。需要使用者从原理上去了解,才可能自如的使用这些函数。
因此,建议开发人员对串口的寄存器、中断事件等,有了基本的了解后,仔细阅读Cube Library提供的串口函数的实现,再去构建代码较好。
1.1 STM32的中断事件和寄存器
以下的内容基本来自于《STM32参考手册》,详细的内容可以在原文档中查找,我主要是将需要的内容进行了整理。
STM32的USART中断请求事情比较丰富,如表1所示。
表1 USART中断请求
中断事件 | 事件标志 | 使能位 |
---|---|---|
发送数据寄存器空 | TXE | TXEIE |
CTS标志 | CTS | CTSIE |
发送完成 | TC | TCIE |
接收数据就绪可读 | TXNE | TXNEIE |
检测到数据溢出 | ORE | IDELIE |
检测到空闲线路 | IDLE | IDELIE |
奇偶检验错 | PE | PEIE |
断开标志 | LBD | LBDIE |
噪声标志,多缓冲通信中的溢出错误和帧错误 | NE或ORT或FE | EIE |
表中的EIE标志位,仅当使用DMA接收数据时,才会使用。
USART的各种中断事件,被连接到同一中断向量,表中的中断事件大致可分为发送期间产生的中断事件和接收期间发生的中断事件。也即:
1)发送期间:发送完成、清除发送、发送数据寄存器空。
2)接收期间:空闲总线检测、溢出错误、接收数据寄存器非空、校验错误、 LIN断开符号检测、噪音标志(仅在多缓冲器通信)和帧错误(仅在多缓冲器通信)。
在实际的编程中,大部分的中断事件,是不需要关注的。编程中,主要关注的是接收数据就绪可读(也即接收数据寄存器非空)、发送完成以及检测到空闲线路。
当然,为了熟悉这些中断事件,对USART的寄存器也必须了解。图1给出了我绘制的思维导图,只对我关系的寄存器位进行了整理,更详细的资料,请参考《STM32参考手册》。
继续阅读“YIE002开发探索06-串口(中断)”1,021 total views, no views today