STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
内容提要
本文介绍了轮询和中断两种操作方式的区别。机器在处理中断时能够精确无误地记录当前工作状态,并在处理完中断事件后恢复原始工作状态。与轮询方式不同,中断方式能够在处理中断事件的同时进行其他操作。文章还解释了Handle的概念,将其比喻为一个负责装卸货船的办事处,用于管理硬件模块。中断方式相当于为办事处建立一个自动处理流程,而轮询方式则需要等待中央指挥中心下达命令。
延伸解读
轮询与中断的本质区别
轮询方式下,MCU必须持续检查外设状态,期间无法执行其他任务,如HAL_UART_Transmit会一直占用MCU直到数据发送完毕。而中断方式允许MCU在等待外设事件时处理其他操作,如HAL_UART_Transmit_IT启动发送后立即返回,主程序可继续执行。这种区别决定了系统效率和实时性,适合不同场景。
HAL_UART_Transmit_IT的内部机制
该函数首先将待发送数据地址和长度存入串口Handle,然后根据数据位宽挂载对应的中断服务函数,最后开启发送寄存器空中断。执行完这些步骤后函数立即退出,不阻塞主程序。后续数据发送由中断服务函数自动完成,实现了非阻塞传输。
Handle在硬件管理中的角色
Handle(不译为句柄)是管理硬件模块的核心结构,如同一个负责装卸货船的办事处。类型声明是创建办事处的模板,初始化过程配置其所在外设、波特率等参数。中断方式相当于为办事处建立自动流程,事件触发时自动处理;轮询方式则需等待中央指挥中心下达命令,即使人员空闲。
中断处理流程与超时保护
中断产生后,MCU会记录当前状态,执行中断服务函数,然后恢复原状态。发送寄存器空和发送完成时都会触发中断,分别处理数据装载和结束通知。轮询方式中的超时参数(如5000)用于防止硬件故障导致函数卡死,而中断方式通过异步机制避免了此类阻塞风险。
Q&A
轮询和中断两种操作方式的主要区别是什么?
轮询方式需要等待中央指挥中心(MCU)下达命令,MCU被100%占用,无法做其他事情;而中断方式允许机器在处理中断事件的同时进行其他操作,MCU可以继续执行其他任务。
HAL_UART_Transmit_IT函数和HAL_UART_Transmit函数有什么不同?
HAL_UART_Transmit_IT函数允许主程序在发送数据时继续执行其他操作,执行完设置任务后就退出;而HAL_UART_Transmit函数会一直占用MCU直到所有数据发送完毕才退出,期间MCU无法做其他事情。
在STM32中,Handle是什么?有什么作用?
Handle是管理硬件模块的重要概念,可以想象成一个负责装卸货船的办事处,用于管理硬件模块。类型声明(如UART_HandleTypeDef)是创建办事处的模板,初始化过程告知其相关信息(如USART1、波特率等),从而管理硬件模块。
HAL_UART_Transmit_IT函数内部执行了哪些步骤?
该函数有三个步骤:Step1: 把待发送数据区的首地址、长度赋给串口的Handle;Step2: 根据参数(8B还是9B),挂载不同的处理函数;Step3: 开中断(串口发送寄存器空将产生中断)。
中断产生后,串口发送相关的执行流程是怎样的?
中断产生后,执行的流程包括发送寄存器空产生中断时的处理和发送完成产生中断时的处理。具体流程可参考文章中的图示。
为什么机器处理中断时不会像人类那样忘记之前的工作?
因为机器在接收中断时总是会先诚实地记录下当前工作状态,然后处理中断事件,最后恢复原始工作状态,毫不含糊。