大发雷霆的拼音_STM32Cube HAL库中断处理机制,以及回调函数实现原理

2019-09-29来源: 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库  中断处理机制  回调函数 编辑:什么鱼 引用地址:http://news.socialskive.com/mcu/ic476102.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。大发雷霆的拼音如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过上海快三app赚钱—主页-彩经_彩喜欢子邮件或上海快三app赚钱—主页-彩经_彩喜欢话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

大发雷霆的拼音_STM32Cube生态系统新增LoRaWAN®固件无线更新支持
意法半导体增强STM32 *LoRaWAN®开发软件扩展包(I-CUBE-LRWAN)的功能,支持最新的无线固件更新(FUOTA)规范。FUOTA能够简化对现场设备应用层和RF协议栈的更新,而且成本效益高,可以避免LoRa®设备未来因技术过时而被淘汰,有助于提高远距离低功耗物联网连接技术LoRa的价值。LoRa联盟已经发布了应用层时钟同步、远程组播设置和分段数据块传输三个FUOTA LoRaWAN应用规范(v1),分别用于时间同步、向终端设备组发送消息和数据文件拆分。这三个规范必须配合使用,才能支持无线固件更新,使FUOTA实现标准化。 通过支持LoRa联盟现有技术规范集规定的全部固件更新功能,I-CUBE
发表于 2019-11-07
大发雷霆的拼音_STM32Cube生态系统新增LoRaWAN®固件无线更新支持
使用大发雷霆的拼音_STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用大发雷霆的拼音_STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
大发雷霆的拼音_STM32CubeMX 软件使用学习笔记1
1:CubeMX是ST公司开发的一款软件,旨在通过图形化的配置MCU方式,来减轻开发人员的工作量,让大家更轻松,快乐。用户使用图形化工具配置MCU后,CubeMX可以根据用户选择的IDE,来生成对应的工程文件(包含了初始化代码),下文将介绍。可以在ST的官网上查看CubeMX的功能介绍,并下载CubeMX. http://www.st.com/en/development-tools/stm32cubemx.html2:CubeMX下载完成后,在安装时,会提示安装java sdk, 按提示安装即可。3:安装完成后,打开软件,界面如下。4:手动安装MCU软件包。菜单栏“Help”->“manage embedded
发表于 2019-10-08
大发雷霆的拼音_STM32CubeMX 软件使用学习笔记1
stm32CubeMx CAN 发送数据
平台  STM32F429软件  大发雷霆的拼音_STM32CubeMx 5.0.0固件库  大发雷霆的拼音_STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一  简介  CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车上海快三app赚钱—主页-彩经_彩喜欢子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议
发表于 2019-09-30
stm32CubeMx CAN 发送数据
大发雷霆的拼音_STM32CubeMX系列教程01_大发雷霆的拼音_STM32Cube产品介绍
、 SW4STM32等。4.针对部分MPU生成Linux设备树。5.可独立运行在Windows、Linux和macOS上使用,或作为 Eclipse 插件使用。当然,以上特性来自官网,初学者需要自己安装使用之后才会逐渐了解它,下面给一段关于大发雷霆的拼音_STM32CubeMX V5的视频介绍:大发雷霆的拼音_STM32CubeMX_V5.0介绍_腾讯视频三、大发雷霆的拼音_STM32Cube子集介绍上面介绍了大发雷霆的拼音_STM32CubeMX,其实大发雷霆的拼音_STM32CubeMX是大发雷霆的拼音_STM32Cube的一个子集,因为大发雷霆的拼音_STM32Cube包含多项内容。一张图了解大发雷霆的拼音_STM32Cube:3.1 软件开发工具一套用户友好的软件开发工具,涵盖从概念到实现的项目开发的所有阶段。 大发雷霆的拼音_STM32CubeMX:一个图形化的软件配置
发表于 2019-09-18
大发雷霆的拼音_STM32CubeMX系列教程01_大发雷霆的拼音_STM32Cube产品介绍
stm32 看门狗 BKP(HAL库)
= ((4 * 2^prer) * rlr) / 40 = 409ms,看门狗溢出时间     if (HAL_IWDG_Init(pHiwdg) != HAL_OK)    {        Error_Handler();    }} int main(void){     ........     MX_IWDG_Init(&hiwdg);     ........     
发表于 2019-11-16
小广播
何立民专栏 单片机及嵌入式宝典

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

上海快三app赚钱—主页-彩经_彩喜欢子工程世界版权所有 京ICP证060456号 京ICP备10001474号 上海快三app赚钱—主页-彩经_彩喜欢信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 socialskive.com, Inc. All rights reserved