历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2019年09月29日 | STM32Cube HAL库中断处理机制,以及回调函数实现原理

发布者:和谐共处 来源: eefocus关键字:STM32Cube  HAL库  中断处理机制  回调函数 手机看文章 扫描二维码
随时随地手机看文章

1写在前面

很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。


但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数接口,以及HAL库中断处理机制等相关知识。


HAL库牵涉的内容较多,本文拿HAL库中断处理来讲解,以及相关的回调函数。


HAL库中断处理机制

之前使用标准外设库开发时,中断程序(函数)由我们自己实现。


而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图:

640?wx_fmt=png

其它大部分外设(TIM、SPI、CAN...)中断都类似,HAL进行统一处理。


也就是说,HAL已经帮我们把中断处理函数写好了,我们只需要调用相应函数来编写应用程序就行了。


HAL_xxx_IRQHandler里面做了哪些处理? 我们以STM32F1的HAL_UART_IRQHandler为例:


void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

{

   uint32_t isrflags   = READ_REG(huart->Instance->SR);

   uint32_t cr1its     = READ_REG(huart->Instance->CR1);

   uint32_t cr3its     = READ_REG(huart->Instance->CR3);

   uint32_t errorflags = 0x00U;

   uint32_t dmarequest = 0x00U;

 

  /* If no error occurs */

  errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));

  if(errorflags == RESET)

  {

    /* UART in mode Receiver -------------------------------------------------*/

    if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))

    {

      UART_Receive_IT(huart);

      return;

    }

  }

 

  /* If some errors occur */

  if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))

  {

  /*

  ·

  ·删减了部分代码

  ·

  */

  } /* End if some error occurs */

 

  /* UART in mode Transmitter ------------------------------------------------*/

  if(((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))

  {

    UART_Transmit_IT(huart);

    return;

  }

  /* UART in mode Transmitter end --------------------------------------------*/

  if(((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))

  {

    UART_EndTransmit_IT(huart);

    return;

  }

}


其实,大家认真看一下代码应该能明白,这些和我们编写的中断处理函数是不是有类似之处?


这是无非就是接收中断、发送中断、错误中断等一系列处理。只是这里又进行了再次封装,比如接收中断UART_Receive_IT。


当然,这个UART_Receive_IT接收中断实现方式又可能存在不同。像F0、F1...就是直接调用这个接收中断函数来进一步处理。


像L0、G0...是通过执行指针函数RxISR来进一步处理。G0的接收中断处理为:huart->RxISR(huart);


void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

{

  //删除了前面代码

  /* If no error occurs */

  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));

  if (errorflags == 0U)

  {

    /* UART in mode Receiver ---------------------------------------------------*/

    if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)

        && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)

            || ((cr3its & USART_CR3_RXFTIE) != 0U)))

    {

      if (huart->RxISR != NULL)

      {

        huart->RxISR(huart);

      }

      return;

    }

  }

  //删除了后面代码

}

看了上面USART中断处理的函数,大家有没有得到什么启发?


其实,HAL库里面处理机制基本一致,只是实现方式上有所不同。


如果你摸清楚了HAL库基本原理,相信阅读HAL库,或者使用HAL库编写应用代码不是问题。


回调函数实现原理

在HAL库中存在大量类似HAL_XXX_XXXCallback这样的函数,这些都是回调函数。


回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。


回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。


---来自百度百科


HAL库中断处理使用了较多的回调函数,还是拿UART接收中断来举例说明。


初始化配置好UART中断接收,如果有中断请求,就会执行回调函数HAL_UART_RxCpltCallback。


看上面回调函数的定义,通过特定条件调用『回调函数』,这里触发的条件就是中断。


扩展说明

这里也简单说几点:


1.初学者想直接使用HAL不是不行,需要有一定C语言功底


针对大部分初学者来说,是不建议直接上手HAL。但是,有部分C功底较好的,还是建议直接上手。


2.学HAL,建议参看官网例程


很多人不知道如何找资源,我不止一次强调,官方的才是最好。在HAL库中Projects目录下就有很多例程Examples。


3.我们追求效率,可以HAL库源码


如果你想修改HAL库源码,允许修改少部分。如果要大量修改,还是别折腾了。


4.实际项目需做一定修改


STM32CubeMX仅仅是生成初始化代码和工程,你实际项目中一般都有自己的软件架构。


特别是项目越大,软件架构就需要更加规范。


比如:生成的gpio.c文件名,你需要修改成bsp_gpio.c.


再比如:函数MX_USART2_UART_Init改成MX_DEBUG_UART_Init.

关键字:STM32Cube  HAL库  中断处理机制  回调函数 引用地址:STM32Cube HAL库中断处理机制,以及回调函数实现原理

上一篇:再造STM32---第一部分:如何正规的安装KEIL5?
下一篇:stm32库函数学习篇----通用定时器(PWM功能)

推荐阅读

协作机器人已经成为工业机器人发展的热点和趋势,ABB在东京国际机器人展推出单臂协作机器人后,协作机器人也再次成为全球关注的焦点。但是,FANUC公司的理解是:尽管协作机器人非常受欢迎,但是这并不代表人们对其他机器人兴趣有所减弱,相反,人们对其他机器人的兴趣也在不断增长。 FANUC通过此次推出的两款SCARA 机器人:SR-3iA和SR-6iA,不但丰富...
晶圆代工厂格芯执行长表示,该公司即将筹备股票首度公开发行(IPO)事宜。随着手机、汽车、互联装置对晶片的需求不断增加,藉由股票上市可提供格芯更雄厚的财务实力在市场上竞争。 格芯执行长柯斐德(Tom Caulfield)最近在接受《华尔街日报》访问指出,格芯目标在2022年挂牌上市。 业内分析称,格芯坚持IPO目标,表示世界正进入物联网时代,不管是家电、...
9月29日讯,电动车大厂特斯拉(Tesla)动向备受投资人关注,特斯拉CEO马斯克(Elon Musk)昨日在推特上表示,指特斯拉将在2030年前实现年产量2,000万辆的目标,为2019年产量的50倍以上。这番说法让投资人信心大增,带动特斯拉当天股价强势上涨。据《Barron's》、Business Insider报道,周一马斯克在推特发文称,2027年至2030年,特斯拉年产量有希望达...
一.硬件方案硬件电路主要由单片机电路、温湿度采集电路、液晶显示电路、继电器电路、wifi模块电路组成。本设计采用STC89C51单片机完成整个系统的控制流程。手机端软件设置操作界面登陆账号,wifi模块连入网络,实现系统设计。主要由51单片机+最小系统+LCD1602液晶显示模块+温湿度采集模块+继电器驱动模块+风扇模块+LED指示灯模块+按键模块+AT24C02存储模块...

史海拾趣

问答坊 | AI 解惑

实战Linux Socket 编程-示例源码

实战Linux Socket 编程-示例源码…

查看全部问答∨

家里的GP充电宝2摔坏了,充电时只亮绿灯。

各位大虾,谁有建议,或是它的原理图纸,谢谢…

查看全部问答∨

北京青云创新科技发展有限公司招聘高级研发工程师

大家好. 北京青云创新科技发展有限公司招聘高级研发工程师,希望符合条件的先生或女士积极投递简历. 岗位职责: 1、承担FPGA液晶驱动板及图形卡的设计及技术更改任务,负责所设计产品技术文件资料的整理归档工作; 2、负责对所设计产品的材料加工 ...…

查看全部问答∨

嵌入式系统原理课件

第7章        定时部件 定时部件是嵌入式系统中常用的部件,其主要用作定时功能或计数功能。不同的定时部件在使用上有所差异,但它们的逻辑原理是相同的。本章具体以S3C2410芯片中的定时部件来介绍定时部件的工作原理、初始化 ...…

查看全部问答∨

用LPC177打造你自己的CAN网络

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对 ...…

查看全部问答∨

程序在Windows CE运行变慢

有一个程序在window mobile上运行都正常,可是到window ce上运行就很慢,这是什么原因? 程序是用VC来开发的.…

查看全部问答∨

有没有带CAN接口的51开发板,谢谢大家

有没有带CAN接口的51开发板,谢谢大家,给我个电话…

查看全部问答∨

阿牛哥八月份第二周工作汇报

     8月8日爆发甘肃舟曲特大泥石流灾害牵动全国亿万人民的心。8月15日甘肃舟曲特大泥石流灾害追悼会全球直播,电视,广播,网络,报纸在报道。当阿牛哥看到电视直播舟曲灾区情况, 灾区诞生一个个婴儿的脸孔,抱着一岁弟弟的 ...…

查看全部问答∨

请问高手149最多可以模拟多少个串口啊?

我现在知道用ta定时器可以模拟出三个串口,还有没有办法模拟更多?…

查看全部问答∨

怎样胜任嵌入式系统工程师

1)掌握科学基础知识; 2)掌握嵌入式系统的硬件、软件知识; 3)掌握嵌入式系统分析的方法; 4)掌握嵌入式系统设计与开发的方法及步骤; 5)掌握嵌入式系统实施的方法 6)掌握嵌入式系统运行维护知识; 7)了解信息化基础知识、信息技术引用的基 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved