首页 > 其他分享 >【STM32】3_0 中断

【STM32】3_0 中断

时间:2023-08-24 11:24:36浏览次数:41  
标签:优先级 中断 void STM32 IRQn HAL uint32

中断和事件

在STM32微控制器中,中断和事件是用于处理外部事件和内部状态改变的重要机制。它们允许微控制器在特定条件下停止当前执行的任务,转而处理更为紧急或重要的任务。以下是关于STM32中断和事件的一些基本信息:

  • 中断(Interrupts):

中断是在微控制器执行某个任务时,突然发生的外部事件或者条件改变,需要立即引起处理的机制。当中断事件发生时,微控制器会立即暂停当前执行的指令,保存当前上下文,然后跳转到中断处理程序(也称为中断服务例程)执行相应的处理。一旦中断处理程序完成,微控制器会恢复之前的上下文并继续之前的任务。

在STM32中,不同的外设和引脚可以配置成产生不同类型的中断,比如外部中断、定时器中断、串口中断等。使用中断可以有效地响应实时性要求较高的事件,如传感器数据的读取、通信数据的处理等。

  • 事件(Events):

事件是STM32微控制器内部状态的变化或触发的标志。这些状态变化可能与外设的工作有关,也可能与软件中的状态转换有关。STM32提供了事件监听和产生的功能,使得某些操作可以在特定事件发生时自动触发。

中断优先级

STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级, 每个中断源都需要被指定这两种优先级。

抢占式优先级和响应优先级的区别:

  • 抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
  • 响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

HAL库常用中断函数

中断基础函数位于 stm32f4xx_hal_exti.c文件中

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)

 4位二进制优先级分组

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

 设置某个中断的优先级

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

 启用某个中断

void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)

 禁用某个中断

uint32_t HAL_NVIC_GetPriorityGrouping(void)

 获取当前优先级分组策略

void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority)

 获取某个中断的优先级

void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)

清除某个挂起标志位

uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)

设置某个挂起标志位

基于CUBEMX生成的不同外设中断文件 stm32f4xx_it.c。函数void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)和函数void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)在cubemx配置完成后由系统自动生成。

HAL库中断回调机制

  • 在文件stm32f4xx_it.c 中,由cubemx 生成已经启动的中断ISR代码框架 例:EXIT0中的中断生成 ISR函数 为:EXIT0_IRQHandler()
  • 在ISR函数中,执行HAL库中为该函数定义的通用处理函数 例:外部中断的通用函数为 HAL_GPIO_EXIT_IROHandler()。在通用函数中,会自动进行中断时间来源的判断(一个中断号一般有多个中断事件源)、中断标志位的判断和清除,并且调用与中断事件源相关的中断回调函数。
  • 在中断回调函数中,用户可以实现中断处理需求。

例:CUBEMX外部中断EXIT配置

配置顺序:

  • 配置外部中断对应引脚属性。

  • 配置外部中断组,开启外部中断。

  • 编写外部中断函数。

使用cubemx 生成代码

stm32f4xx_it.c中的外部中断函数

void EXTI0_IRQHandler(void)

{

/* USER CODE BEGIN EXTI0_IRQn 0 */

/* USER CODE END EXTI0_IRQn 0 */

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

/* USER CODE BEGIN EXTI0_IRQn 1 */

/* USER CODE END EXTI0_IRQn 1 */

}

 

在GPIO文件stm32f4xx_hal_gpio.c中找到对应外部中断的若函数进行重写

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

/* Prevent unused argument(s) compilation warning */

UNUSED(GPIO_Pin);

/* NOTE: This function Should not be modified, when the callback is needed,

the HAL_GPIO_EXTI_Callback could be implemented in the user file

*/

}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

用户代码

}

 

Q&A

STM32 HAL库中 为什么外部中断需要清除中断标志位 而定时器中断不需要?

在STM32 HAL库中,外部中断和定时器中断之所以需要处理的方式不同,涉及到它们触发和处理的机制。让我们来详细解释一下:

外部中断:

外部中断是由外部事件触发的,例如按下按钮、传感器触发等。当这些事件发生时,引脚上的电平变化(上升沿、下降沿或双边沿)会产生一个中断请求。在处理外部中断时,中断请求会导致中断处理程序被调用。为了防止多次触发同一个中断请求,需要在处理程序中清除中断标志位。如果不清除中断标志位,中断控制器会一直认为有中断请求,从而导致中断处理程序被重复调用。

定时器中断:

定时器中断是通过定时器计数器的溢出或者达到特定计数值来触发的。当定时器计数达到设定的值时,会产生定时器中断请求,从而调用中断处理程序。与外部中断不同,定时器中断在处理程序被调用后,不需要手动清除中断标志位。这是因为在中断处理程序执行完毕后,硬件会自动重置定时器的中断标志位。这样,下一次定时器计数达到设定值时,会再次触发中断请求。

因此,区别在于外部中断需要手动清除中断标志位以避免重复触发,而定时器中断则由硬件自动处理中断标志位的重置。

标签:优先级,中断,void,STM32,IRQn,HAL,uint32
From: https://www.cnblogs.com/Mountainssea/p/17653696.html

相关文章

  • STM23学习记录2:外部中断,串口通信,定时器
    外部中断:向量表:异常+中断所有端口的PIN0对应着EXTI0中短线,PIN1对应EXTI1中断线,依次类推16个外部中断线,对应7个外部中断入口地址配置中断优先级的4位要同时完成抢占优先级和响应优先级(子优先级或副优先级)的配置:两组优先级2+2,2^2抢占,2^2响应比较常用使用NVIC_PriorityGroupCon......
  • 1.2 STM32的GPIO
    一、GPIO的8种输入输出模式:1.输入:GPIO_Mode_AIN   // 模拟输入:用于ADC   GPIO_Mode_IN_FLOATING  //浮空输入GPIO_Mode_IPD   //下拉输入GPIO_Mode_IPU  //上拉输入2.输出:GPIO_Mode_Out_OD  //开漏输出GPIO_Mode_Out_PP......
  • ROS小车STM32底板代码学习
    用的是幻尔科技的新推出的ROS小车的STM32控制底板价格他的代码是用HAL库写的,而且资料很少,刚开始连ROS1功能包都还在测试。代码有300多M,编译一次,直接吃席。所以我用轮趣科技的ROS小车代码移植,采用的FreeRTOS写的,跟我学的代码风格几乎一致移植过程中你会发现,电路很多地方都一致,盲......
  • 【STM32】2_0 GPIO
    注:凡是有FT标志的,都是兼容5V电平的IO口,可以直接接5V的外设(注意:如果引脚设置的是模拟输入模式,则不能接5V!,凡是不带FT标志的,不可与无5V链接,可能烧坏MCU。根据数据手册中列出的每个I/O端口的特性,可通过软件将通用I/O(GPIO)端口的各个端口位分别配置为多种模式:●......
  • STM32深入学习1:时钟系统和GPIO
    RCC(复位和时钟控制):系统复位的因素:1.NRST按键复位2.看门狗复位3.软件复位4.低功耗管理复位SYSCLK系统时钟: 1.HSI时钟2.HSE时钟:外部晶振3.PLL时钟  系统时钟:PCLK1:APB1分频,最大36mhz   PCLK2,ADC,TIM1,TIM8:APB2分频 初始化:相关知识:RCC相关寄存器:R......
  • STM32 Wifi开发
    一、概述1.用到的资源说明1.1wifi模块:ESP8266EX1.2串口,串口接收不定长数据采用定时器超时的方式判断一帧数据是否接收完成,定时器1ms中断一次;2.采用AP+Station模式,这种模式比较实用。AP用来设置wifi信息的,连接ESP8266wifi信号,此时ESP8266就是服务端,可以写一个上位机socket......
  • CAN通信知识梳理及在Stm32上的应用(HAL库)
    文章目录一.CAN通信简介二.硬件连接三.CAN总线上的电平信号四.CAN帧的种类(1)遥控帧(2)数据帧五.CAN的仲裁方法六.CAN在Stm32上的应用(1)CubeMX上CAN的配置(2)配置CAN过滤器32位列表模式16位列表模式32位掩码模式(3)CAN数据的发送与接收六.参考文档七.同系列......
  • ARM Trusted Firmware分析——中断、异常
     中断如何送到不同EL?如何配置?1.BL31异常向量表BL31异常向量表根据如下定义实现:ARMv8-A规定ExceptionVectorTable大小为2KB,并且是2KB对齐;一共6个VectorEntry,每一个VectorEntry大小为128B。.macrovector_baselabel,section_name=.vectors.section\sectio......
  • 06-中断详解
    目录一.中断原理二.NVIC详解一.中断原理1.中断过程和术语2.中断优先级概念3.中断优先级的表述方法4.中断源类型5.中断源的4种状态二.NVIC详解1.NVIC概念2.中断协作模型......
  • 中断
    深入理解系统中断整个操作系统就是一个中断驱动的死循环,操作系统原理如果用一行代码解释,下面这样再合适不过了。while(true){doNothing();}其他所有事情都是由操作系统提前注册的中断机制和其对应的中断处理函数完成,我们点击一下鼠标,敲击一下键盘,执行一个程序,都是用中......