1.从轮询到中断
很多同学都不喜欢用中断,而偏爱用轮询的操作方式。
这是不是和我们的天性有关呢?每个人都喜欢一切尽在掌握中,肯定都不喜欢被打断。我们常常都有这样的经验:正在跟别人说一件事,然后突然有个电话打进来,Call打完后突然记不起来刚才讲到哪了!这种糟糕的体验对我们影响是如此深刻,以至于我们认定机器可能也是这样吧,频繁的中断会不会把事情搞乱呢?好在机器虽然大部分时间都比人笨一些,但在处理这种问题上却能做到一丝不苟。机器在中断来的时候总会老老实实地先把当前正在做的记录下来,然后转去处理中断事件,中断处理完后分毫不差地恢复原来的工作。
仔细想一想,我们是不是也可以在接电话前先用个小本儿记录一下正在讲的事情呢?我们为什么没有这么做呢?一个原因可能手头正好没有笔,再一个我们可能过于自信比机器聪明了吧,当然最有可能的就是我们大多数时候都讲的都是很无聊的话题,哈哈。
我们用 Keil 打开下面这个工程:
STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComITMDK-ARMProject.uvprojx
这时候我们会发现,如果不仔细看,几乎看不出和用轮询操作的代码有什么区别。特别是初始化部分,就是一模一样的。说好的中断方式呢?
好,我们往下面找一下终于会发现点儿不同:
在这里我们发现串口发送调用了一个不同的函数。秘密就在这个函数里:
HAL_UART_Transmit_IT 这个函数有三个参数:
UART_HandleTypeDef *huart, 让函数知道处理的是哪个串口
uint8_t *pData, 需要发送的数据首地址
uint16_t Size 发送数据的大小(长度)
这个函数的三个步骤:
Step1: 把待发送数据区的首地址,长度赋给串口的 Handle。
Step2: 根据参数(8B还是9B),挂载不同的处理函数。
Step3: 开中断(串口发送寄存器空将产生中断)。
HAL_UART_Transmit_IT 函数执行完这些任务就退出了,主程序可以继续执行其它的操作。这是和轮询完全不同的。我们回头看一下轮询方式的 HAL_UART_Transmit 就会发现这个函数一直要等到所有数据都发送完才退出,在此期间MCU被100%占用,没有办法做其它的事情。轮询方式发送函数里有个参数 5000,这是一个发送超时参数,不管有没有发送完,5秒以后强制退出此函数,防止由于硬件或其它原因卡死在这个函数里。
2.再谈Handle
对于 Handle 这个词,我们没有用"句柄"这种翻译,因为"句柄"这个词本身也是生造出来的,这个词本身就不太好理解,容易把人引入歧途。所以我们认为 Handle 这个词不翻译为好。Handle 是一个重要的概念,所以我们需要反复体会用它来管理硬件模块的好处。
我们可以把它想象成一个负责装卸货船的办事处,类型声明(如 UART_HandleTypeDef ) 是一个创建办事处的模板。如果有五个码头,那就创建五个办事处,这些办事处是相似的,但每个办事处又不同,它们建在不同的码头,有不同的人员,可以调用不同的车队。这个办事处可以等待中央机构(MCU)的命令,也可以用更好的办法。
中断的方式就像我们给这个办事处建立一个自动处理流程,码头来了一个空货船,则自动触发办事处中的一些办事员调动车队把货物运到船上。而轮询方式就像所有的事情都要等待中央指挥中心(MCU)下达命令,即使办事处一堆人员正无所事事。
下面的 Handle 就好比是一个这样的办事处,初始化的过程就是告知它建在 USART1,以及波特率,有无奇偶校验,停止位等信息。
HAL_UART_Transmit_IT 函数告知此办事处有一堆 8BIT 货物在仓库 aTxBuffer 存放,并通过把 TxISR 指向适合的车队( 函数 UART_TxISR_8BIT ),建立了一个自动处理流程。
3.中断产生,执行的流程
我们从下图中可以看到从中断产生到执行的过程,一个是发送寄存器空产生中断时,一个是发送完成产生中断时。
参考资料:
PM0215 STM32F0xxx Cortex-M0 programming manual
UM1785 Description of STM32F0 HAL and low-layer drivers
STM32F030 Datasheet
STM32F030 Reference Manual
上一篇:STM32F0单片机快速入门八 聊聊 Coolie DMA
下一篇:STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
推荐帖子
- CPU设计小组加盟帖
- 关于组织设计一款CPU的群。 群号码:4751106.CPU设计小组加盟帖
- sdsongge 嵌入式系统
- 有做ocl放大电路的吗?
- 本帖最后由paulhyde于2014-9-1509:19编辑有没有做ocl功率放大器的吗?进来看看,交流一下!!有做ocl放大电路的吗?
- guoguizhi123 电子竞赛
- 有研究无线输电的吗
- 有研究无线输电的吗,一起交流哦。本人今年初的时候研究过基于感应原理的无线输电,仔细阅读过WPC的协议文档(WirelessPowerConsortium).为此还花钱买了一些仪器和元器件,当时做的实验比较成功。设计的电路能从QI充电设备稳定的获取能量。不过后来仔细分析市场,觉得自己做这个产品不是很成熟,就放弃了。后续会将实验过程的笔记分享出来。不过基于谐振原理的无线输电当前还是比较前端的,能解决基于感应输电的种种不足。有兴趣大家一起交流有研究无线输电的吗我之前做过这个。可以一
- IamFoxdeng 综合技术交流
- 深入理解C语言函数参数为指针
- 我们直接做一个练习,定义一个函数,用来交换两个变量的内容。voidswap(int*x,int*y);voidmain(){intx=20,y=10;swap(&x,&y);printf(x=%d,y=%d,x,y);}voidswap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}代码非常简单,我也就不细讲了。这里传入的参数为指针,所以调用swa
- 灞波儿奔 微控制器 MCU
- 全球半导体行业销售额开始恢复 月增长率近3%
- 全球半导体贸易统计组织(WSTS)发布的最新统计数据显示,08年7月份全球半导体销售额达221.8亿美元,比上月增长2.8%,同期增长7.6%,本年累计比去年同期增长0.5%,消费电子产品、PC和手机等产品销售的强劲增长成为助推器。 报告称,7月份欧洲半导体销售额比上月增长0.7%,达到33.9亿美元,同期增长3.3%。本年累计比去年同期增长1.6%。而此前欧洲半导体行业协会(ESIA)的调查显示,欧洲半导体销售额再一次受到美元对欧元的汇率的重大影响。按欧元计算,7月份的半导体销售额
- 咖啡不加糖 模拟电子
- XD08M3232是一款国产8位高性能Flash的接近感应单片机,具有增强型1T8051内核。在对...
- XD08M3232是一款国产8位高性能Flash的接近感应单片机,具有增强型1T8051内核。在对比其他品牌时,我们可以从多个维度进行分析,包括性能、功能、易用性、价格以及生态系统等。一、性能与功能XD08M3232自带恒流驱动电路,对光衰问题有很好的解决效果,这对于感应器来说特别友好。同时,它还内置了两路轨到轨运算放大器,可以对低幅度的输入信号进行有效放大,提高信号处理的效率和准确性。此外,它支持一路模拟比较器,可以提高信号检测精度、增强信号处理功能、简化电路设计。这些特性使得XD0
- luqi334 51单片机
设计资源 培训 开发板 精华推荐
- CS5265单芯片设计TYPEC转HDMI2.0 4K@60HZ转换器方案
- 面向消费电子应用的CLRC663 +和QN902x NFC-Bluetooth® Low Energy解决方案
- Si3052/18PCIEVB,Si3052 评估板,带 Si3018 线路侧
- 具有 SuperCap 充电功能的 LTC4420CMSE SuperCap 备份的典型应用电路
- 使用 Richtek Technology Corporation 的 RT9063-12 的参考设计
- LTC3621IMS8E-2 1.2Vout、同步至 600kHz、强制连续模式同步降压型稳压器的典型应用
- STPA003 4 x 52 W 四桥功率放大器的典型标准应用电路(带 OD 的 Flexiwatt25),具有高侧驱动器和低电压操作
- AD7711,用于传感器和转换器的 24 位、19.5 KSPS、2CH ADC 评估板
- 具有峰值电流软启动、小尺寸的 LTC3632IMS8E、3.3V、20mA 稳压器的典型应用电路
- LT3724、15V 至 12V 25W SEPIC DC/DC 转换器