STM32 HAL库 CubeMX教程(四)按键外部中断

实验内容

  • 利用按键控制LED的亮灭?

实现方法:

  1. 按键扫描
  2. 外部中断

第二种方法较为常用,思路:按键按下会产生一个上升沿或者下降沿的触发脉冲,利用单片机的IO口检测输入脉冲,触发外部中断,控制LED动作。

NVIC(嵌套向量中断控制器)

NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是CM3内核里面的一个外设。

CM3 内核支持 256 个中断, STM32F103 的可屏蔽中断只有60 个 。

STM32 中有两个优先级的概念:抢占式优先级响应优先级,响应优先级也称子优先级,每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应 ,即中断嵌套

与 NVIC 相关的寄存器 :

typedef struct {
   __IOM uint32_t ISER[8U]; /* 中断使能寄存器*/ 
   uint32_t RESERVED0[24U];  
   __IOM uint32_t ICER[8U]; /* 中断清除寄存器 */ 
   uint32_t RSERVED1[24U];
   __IOM uint32_t ISPR[8U]; /* 中断挂起使能寄存器 */
   uint32_t RESERVED2[24U];
   __IOM uint32_t ICPR[8U]; /* 中断挂起清除寄存器 */
   uint32_t RESERVED3[24U];
   __IOM uint32_t IABR[8U]; /* 中断标志位激活位寄存器 */
   uint32_t RESERVED4[56U];
   __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8 位宽) */
   uint32_t RESERVED5[644U];
   __OM uint32_t STIR; /* 软件触发中断寄存器 */
} NVIC_Type; 

STM32 的中断分组: STM32 将中断分为 5 个组,组 0-4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。在这里插入图片描述
注意:
(1) 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
(2)高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
(3)抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断;
(4)中断优先级数字约小级别越高。

外部中断简介

在这里插入图片描述
STM32F103 的 EXTI 控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的 19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。

STM32 GPIOA-GPIOG 的[15:0]分别对应中断线 15~0。这样每个中断线对应了最多 7 个 IO 口。


外部中断寄存器结构体:

typedef struct
{  
  __IO uint32_t IMR;//中断屏蔽寄存器 
  __IO uint32_t EMR;//事件屏蔽寄存器 
  __IO uint32_t RTSR;//上升沿触发选择寄存器 
  __IO uint32_t FTSR;//上升沿触发选择寄存器 
  __IO uint32_t SWIER;//软件中断事件寄存器 
  __IO uint32_t PR;//挂起寄存器 
} EXTI_TypeDef; 

详细介绍查阅《stm32参考手册》,例如:在这里插入图片描述

CubeMX配置

我的单片机原理图(LED处红字为画板错误请忽略)
在这里插入图片描述
按键KEY1与PA11引脚相连,LED0与PB0相连。所以将PA11配置为外部中断输入模式并且下降沿触发;将PB0配置为输出模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

初始化代码

首先分析下CubeMX生成的GPIO初始化代码:
在这里插入图片描述
前面是关于GPIO时钟使能及GPIO结构体初始化,最后两个函数是关于中断优先级分组和使能中断的。

 HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 2);
 HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

HAL_NVIC_SetPriority(),共有三个参数:

  1. 中断向量号
    在这里插入图片描述
  2. 抢占优先级:设置了两位抢占优先级,那么抢占优先级可以是00-11,即0-3
  3. 响应优先级:同样是两位。

外部中断线10-15是共用一个中断向量的,在启动文件中可以看到:
在这里插入图片描述

中断回调函数编写

/* USER CODE BEGIN 4 */
char flag=0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 if(flag==0){
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
  flag=1;
 }
 else if(flag==1){
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
  flag=0;
 } 
}
/* USER CODE END 4 */

初始化LED为熄灭状态,按下按键以后进入中断,GPIO状态翻转,LED亮,再按下去LED灭。

程序编写较按键扫描简单却更常用,下载程序能够即能够看到上述现象。

参考文献

  1. 硬石YS-F1Pro开发板开发手册(HAL库版本20170104更新)
  2. ALIENTEK 精英 STM32F103 开发板教程
  3. STM32F10xxx参考手册
发布了11 篇原创文章 · 获赞 13 · 访问量 4338

猜你喜欢

转载自blog.csdn.net/weixin_43116606/article/details/104206923