STM32学习——中断和事件相关概念

文章介绍了STM32中的中断系统,包括EXTI(外部中断/事件控制器)的功能,如23个中断/事件线、中断和事件模式、触发类型等。EXTI初始化结构体和中断线定义被详细阐述。此外,还讨论了中断的优先级、优先级分组概念,以及NVIC(NestedVectoredInterruptController)的角色,它是Cortex-M3内核的中断管理部件。最后,提到了中断向量表,即中断服务程序的入口地址集合。

目录

中断概述

什么是中断?

什么是EXTI?

EXTI初始化结构体:

中断/事件线:

 EXTI模式:

触发类型:

EXTI控制:

什么是优先级?

什么是优先级分组?

什么是NVIC?

什么是中断向量表?


中断概述

什么是中断?

         中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的
程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

什么是EXTI

         外部中断 / 事件控制器 (EXTI) 管理了控制器的  23  个中断 / 事件线。每个中断 / 事件线都对应有一
个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。  EXTI  可以实现对每个中断 /
件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI 可分为两大部分功能,
一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。
产生中断线路目的是把输入信号输入到  NVIC ,进一步会运行中断服务函数,实现功能,这样是
件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传
输,属于硬件级的。
中断是软件级别的;
事件是硬件级别的。

EXTI初始化结构体:

typedef struct
{
    //中断/事件线
    uint32_t EXTI_Line; 

    //EXTI 模式
    EXTIMode_TypeDef EXTI_Mode; 

    //触发类型
    EXTITrigger_TypeDef EXTI_Trigger; 

    //EXTI 控制
    FunctionalState EXTI_LineCmd; 

}EXTI_InitTypeDef;

中断/事件线:

#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16
Connected to the PVD Output */
#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17
Connected to the RTC Alarm event */
#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18
Connected to the USB OTG FS Wakeup from suspend event */
#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19
Connected to the Ethernet Wakeup event */
#define EXTI_Line20 ((uint32_t)0x00100000) /*!< External interrupt line 20
Connected to the USB OTG HS (configured in FS) Wakeup event */
#define EXTI_Line21 ((uint32_t)0x00200000) /*!< External interrupt line 21
Connected to the RTC Tamper and Time Stamp events */
#define EXTI_Line22 ((uint32_t)0x00400000) /*!< External interrupt line 22
Connected to the RTC Wakeup event */

 EXTI模式:

typedef enum
{
    EXTI_Mode_Interrupt = 0x00, //产生中断
    EXTI_Mode_Event = 0x04 //产生事件
}EXTIMode_TypeDef;

触发类型:

typedef enum
{
    EXTI_Trigger_Rising = 0x08, //上升沿
    EXTI_Trigger_Falling = 0x0C, //下降沿
    EXTI_Trigger_Rising_Falling = 0x10 //上升沿和下降沿都触发
}EXTITrigger_TypeDef;

EXTI控制:

使能 EXTI ,一般都是使能, ENABLE

什么是优先级?

         抢占优先级和响应优先级的区别:
  • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
  • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
  • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
  • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行

什么是优先级分组?

        Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32
指定中断优先级的寄存器位减少到 4 位,这 4 个寄存器位的分组方式如下:
  • 0组:所有4位用于指定响应优先级
  • 1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
  • 2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
  • 3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
  • 4组:所有4位用于指定抢占式优先级

什么是NVIC

        STM32 通过中断控制器 NVIC Nested Vectored Interrupt Controller )进行中断的管理 。
NVIC 是属于 Cortex 内核的器件,不可屏蔽中断( NMI )和外部中断都由它来处理,但是 SYSTICK
不是由 NVIC 控制的。
typedef struct
{
    uint8_t NVIC_IRQChannel;
    uint8_t NVIC_IRQChannelPreemptionPriority; //抢断优先级
    uint8_t NVIC_IRQChannelSubPriority; //响应优先级
    FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

什么是中断向量表?

         每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向
量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程
序入口的跳转指令构成一张表,称为中断向量跳转表。
### STM32按键中断的实现方法及常见问题解决方案 #### 一、STM32按键中断的基础概念STM32微控制器中,按键中断是一种通过外部设备触发CPU响应的方式。当中断发生时,处理器会暂停当前的任务并跳转到相应的中断服务程序(Interrupt Service Routine, ISR)[^1]。 为了确保按键操作能够被准确识别而不受机械抖动的影响,通常需要加入消抖机制。可以通过硬件或软件的方式来完成这一目标[^3]。 #### 二、按键中断的具体实现流程 以下是基于STM32的按键中断实现的一个典型例子: ##### 1. 初始化GPIO端口 首先需配置用于检测按键状态的GPIO引脚为输入模式,并启用上拉/下拉电阻以稳定电平信号。 ```c void GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发中断 GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` ##### 2. 配置NVIC (Nested Vectored Interrupt Controller) 使能对应外设的中断线并向量表映射地址设置好之后才能接收到来自该源发出的通知请求。 ```c void NVIC_Configuration(void){ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } ``` ##### 3. 编写中断服务程序(ISR) 当指定条件满足时即会产生一个异常事件进而激活下面定义好的函数体部分来进行相应处理逻辑编码工作。 ```c void EXTI0_IRQHandler(void){ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0){ Key_Short_Pro(); // 调用短按处理函数 } } ``` 以上代码片段展示了如何初始化GPIO以及配置相关中断向量控制单元(NVIC),同时还给出了简单的ISR框架结构供参考使用[^1]。 #### 三、解决按键中断中的常见问题 尽管上述步骤可以成功建立基本的功能模块,但在实际应用过程中可能会遇到一些挑战或者错误情况的发生。这里列举几个常见的案例及其可能的原因分析与对策建议: - **问题**: 当按下某个按钮后系统进入死循环无法正常退出. - 可能原因: 如果存在未清除标志位的情况,则每次都会重复触发相同的中断直到堆栈溢出为止。 - 解决方案: 确保每一次进入ISRs之前都将关联的状态变量重置回初始值;另外也可以考虑适当增加延时语句以便给予足够的反应时间给外围器件恢复平静再继续下一步骤的操作[^2]. - **问题**: 使用定时器配合按键扫描发现长时间按住某键会出现多次计数的现象。 - 可能原因: 定时期间如果持续监测到低电平时就会不断累加计数值造成误判。 - 解决方案: 引入额外的状态标记区分首次下降沿捕捉与其他后续动作的区别对待即可有效避免此类状况出现[^4]. - **问题**: 在调用了`HAL_Delay()`期间似乎忽略了来自外部的紧急事务通知而导致延迟响应甚至丢失某些重要数据包传输机会等问题的存在。 - 可能原因: 默认情况下SysTick timer 的抢占级别较低不足以打断正在进行中的阻塞型APIs如 `HAL_Delay()`. - 解决方案: 提高SysTick interrupt priority level使之高于其他常规任务从而允许即时介入调整调度顺序达成实时性的需求标准[^5]. #### 结论 通过对STM32按键中断学习我们可以了解到其背后涉及到的知识点广泛而且深入细致之处颇多值得我们去探索研究。只有掌握了这些核心原理才能够灵活运用它们构建更加复杂可靠的电子控制系统出来服务于各行各业的实际应用场景之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值