历史上的今天
返回首页

历史上的今天

今天是:2026年01月13日(星期二)

正在发生

2023年01月13日 | STM32串口用中断还是用轮询

2023-01-13 来源:zhihu

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.中断产生,执行的流程

我们从下图中可以看到从中断产生到执行的过程,一个是发送寄存器空产生中断时,一个是发送完成产生中断时。


推荐阅读

史海拾趣

ebm-papst公司的发展小趣事

ebm-papst一直致力于通风和驱动技术的研发与创新。在中国市场,公司针对数据中心等特定应用场景,推出了革命性的创新产品——“数据中心列间空调用轴流风机”。该产品凭借其独特的设计和优异的性能,荣获了2022年中国制冷展创新产品奖。这一技术创新不仅解决了数据中心散热的难题,也进一步巩固了ebm-papst在通风与驱动技术领域的领先地位。

Electronic Sensor + Resistor GmbH公司的发展小趣事

随着产品技术的不断成熟和市场份额的逐步扩大,ESR公司开始将目光投向国际市场。公司积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。

同时,ESR公司还根据不同国家和地区的市场需求和法规要求,对产品线进行了针对性的调整和优化。通过本地化的营销策略和服务体系,公司成功打开了多个海外市场的大门,并赢得了当地客户的信任和支持。

Fair Rite公司的发展小趣事

随着全球进入数字化、网络化、智能化时代,电子元器件市场发生了深刻的变化。Fair Rite积极应对市场变化,通过技术创新和产品研发,不断推出适应新需求的产品。例如,公司针对EMF/EMI干扰较严重或容易出现导漏流问题的情况,推出了EMI抑制铁芯线圈(SM-BL系列),帮助客户节省PCB空间并降低干扰信号。同时,Fair Rite还注重满足客户的性价比需求,为每个新产品进行定制化设计和质量验证(遵循ISO9001:2008标准),确保其在不同应用场景下稳定可靠。

这些故事展示了Fair Rite在电子行业中不断发展壮大的历程。通过不断创新、拓展市场和提升品质,Fair Rite已经成为电子行业中的佼佼者之一。

飞翼科技(FEIYI)公司的发展小趣事

随着电子行业的快速发展,Fair Rite迅速捕捉到新的市场机遇。公司不断推出创新产品,以满足医疗、照明、汽车、通讯、航空、国防、智能能源和工业市场等领域的需求。Fair Rite通过技术创新和品质保证,赢得了客户的信赖和市场的认可。

BNS Solutions公司的发展小趣事

在电子行业的早期阶段,BNS Solutions公司凭借其敏锐的市场洞察力和技术创新能力,迅速崭露头角。公司团队针对当时市场上电子产品性能不足、用户体验不佳的问题,研发出了一系列高效能、易操作的电子设备。这些产品不仅满足了消费者对电子设备的基本需求,还通过独特的设计和功能赢得了市场的广泛认可。随着产品的热销,BNS Solutions公司的知名度逐渐提升,为后续的发展奠定了坚实的基础。

Giga公司的发展小趣事
如自动浇水系统、温度控制系统等,通过定时启动或关闭设备。

问答坊 | AI 解惑

USB接口在信息家电的应用

USB接口在信息家电的应用…

查看全部问答>

【博客帮助帖】如何美化自己的空间

开通了自己的博客,自然要把自己的空间装饰一下。EEWORLD博客给您提供了快速美化空间的方法。 1)登录空间之后,点击导航栏右侧的“设置”,如下图所示   2)进入设置界面,点击“主页风格”如下所示,可以选择一款您喜欢的页面风格,点 ...…

查看全部问答>

【EEWORLD第六届社区明星人物】8月明星人物火热登场!

EEWORLD第六届,也就是8月社区明星人物终于评出来了, 经过了soso、小志、小娜的努力工作 ,查看了了大量数据,明星人物们终于火热登场啦! 本月优秀工程师(依据发帖数排名): 最佳解惑奖:仙猫 最佳活跃奖:Yound 最佳贡献奖: ahshan 本 ...…

查看全部问答>

怎么获取系统发出的信号???????

就是当ctrl+c或者切断电源的时候,系统都会发出一个信号。 像SIGHUP SIGINT 之类的 东西 可以写出一个方法获取到它吗? 我是想让系统关机的时候 用signal绑定一个倒计时函数,但是我不知道关机的信号是什么 。这个信号会不会被隐藏掉? ps:已 ...…

查看全部问答>

ce6.0 rc3有人试过了吗??

看到不少感兴趣的东西,原有的rc2下的bsp应该不需要修改就可以了吧? 有人试过ie和flash,手势识别怎么样吗…

查看全部问答>

求利用 51单片机 和 CMOS图像传感器 做视频采集和显示的方案

如题,CMOS传感器型号已经选择好,OV7620,摄像头模块的核心器件即OV7620,摄像头是数字视频输出16Bit或8Bit的YUV422格式数据,如果用单片机进行图像的采集,并且在PC端显示,请问一下还需要什么核心器件,最好给出一个大体的设计方案,谢谢了,这 ...…

查看全部问答>

请教一个关于ARM7除法的问题?

采用arm7指令编程实现除法功能,注意除0的处理? 请问这个的代码怎么写啊,arm7里面我找不到除法啊。…

查看全部问答>

LM3S8962串口问题解决了

前段时间比较忙,没来得及分析LM3S8962串口问题。今天花了一上午时间搞定了,原来是232片子坏了,换了个新的,串口能调通了。顺便发点LM3S8962串口的资料,大家共同学习进步。 [ 本帖最后由 beyondvv 于 2010-9-25 22:27 编辑 ]…

查看全部问答>

请各位模拟电路高手指教!

图中是一个产生500V左右高压的稳幅振荡电路,其中振荡电路点部分有一个磁罐,其中绕线如下图所示,磁罐输出端是100匝绕线,500V高压,和三极管 连接的是1匝和4匝绕线,电感分别是0.2uH和1.1uH左右,分别接在三极管的发射级和集电极,发射极的2个电 ...…

查看全部问答>