STM32串口用中断还是用轮询

发布时间:2023-01-13  

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

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。串口通讯有HAL 库轮询,中断,DMA 三种通信模式: 轮询方式:CPU不断查询IO设备,如设......
    执行完这些任务就退出了,主程序可以继续执行其它的操作。这是和轮询完全不同的。我们回头看一下轮询方式的 HAL_UART_Transmit 就会发现这个函数一直要等到所有数据都发送完才退出,在此期间MCU被100......
    发送寄存器空将产生中断)。 HAL_UART_Transmit_IT 函数执行完这些任务就退出了,主程序可以继续执行其它的操作。这是和轮询完全不同的。我们回头看一下轮询方式的 HAL_UART_Transmit 就会......
    STM32基础知识:串口通信-轮询方式;串口通信-轮询方式 1 串口通信概述 1.1 计算机通信的基本概念 计算机通信: 将计算机技术和通信技术相结合,完成......
    STM32CUBEMX(9)--ADC通过轮询方式读取,USART打印;概述 本章通过使用模数转换器(ADC),通过轮询方式采集多个ADC通道电压。 之前已经做过DMA方式采样,详情......
    ,它的原理是通过轮询串口接收缓冲区来检测是否有数据到达,从而实现对数据的处理和存储。查询方式的优点是实现简单,代码量少,同时也可以灵活控制数据的处理方式。查询方式......
    的烧写和调试方式: 1upload_protocol = cmsis-dap 2debug_tool = cmsis-dap 2 轮询方式使用按键 设置GPIO为输入模式 1 //set gpio......
    有两种状态:常闭和常开。对于常开的按键,当按下时,针脚会产生高电平;对于常闭的按键,当按下时,针脚会产生低电平。通过读取GPIO针脚的状态,我们就可以实现对按键的监测。在实际编程中,我们可以通过轮询方式或者中断方式......
    通讯的编程要点:控制通讯的基本流程同上述点对点通讯方式 对各从站的控制应采取轮询方式轮询程序同样也是后台工作方式工作的。根据对各台传动装置控制任务的轻重,在PLC 数据区内建立一个从站地址表,按该地址表轮询......
    中的内置宏,比如__LINE__可以很方便跟踪代码执行到哪一行。 四、调试-输入 串口的接收,有轮询、中断、DMA等方式轮询方式,特点是消耗芯片资源,否则容易丢数据; 中断方式,特点是响应快、资源......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>