当前位置:首页 > 单片机 > STM32CubeMX > 正文内容

STM32CubeMX系列教程2:外部中断EXIT

ouyang7个月前 (09-28)STM32CubeMX2329



一、摘要

  这一章,主要讲解STM32单片机外部中断的应用,实现以外部中断的形式,通过一个按键改变LED灯的工作状态。工程可以在前一章的GPIO输入与输出的基础上修改。复制GPIO_InOut的工程,修改文件夹名为EXIT。

二、配置工程

         如果需要新建工程,可参考《STM32CubeMX系列教程0:创建工程》

        如果需要安装环境,可参考《STM32开发环境安装》

1. 修改引脚模式

  打开已经复制并修改好的工程目录,双击打开GPIO_InOut.ioc。
enter description here
  将KEY所在的引脚PC13配置为GPIO_EXIT模式。因为在第13脚,所以事EXIT13,又叫做中断线13。
enter description here

2. 配置GPIO

  打开GPIO设置,选中外部中断引脚,我这里事PC13。因我这里PC13是经过按键接地,所以这里应该配置为下降沿中断,并且开启上拉。
enter description here
①上升沿触发模式
②下降沿触发模式
③上升沿/下降沿都触发
  如果单片机系统中,按键没有设置外部的上拉或者下拉电阻,则需要在单片机中开启单片机内部的上拉或者下拉电阻。如果有外部上拉,则不需要,选择浮空即可,我这里需要开启上拉。
enter description here

3. 开启外部中断

  在NVIC(嵌套向量中断控制器)中,勾选EXIT Line[15:10] interrupt使能PA13中断,[15:10]表示开启从10~15的6条中断线。13就包含其中。
enter description here
①中断优先级分组
②抢占优先级
③响应优先级

3-1. 中断优先级分组


enter description here

  在这里简单讲解一下优先级分组。STM32以4个比特位表示中断的抢占优先级和响应优先级。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有23=8种优先级),1位用于响应优先级(优先级有21=2种优先级)。


3-2. 中断优先级

  在这里简单介绍一下NVIC(嵌套向量中断控制器)。NVIC就是控制中断响应的。主要由三个参数,一个是中断使能,一个是抢占优先级,还有一个就是响应优先级。(优先级数值越小,优先级别越高)
  中断使能很好理解,就是是否开启中断,如果开启中断,则满足中断触发条件时程序会跳到中断服务程序运行,否则不响应中断主程序继续运行。
  抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。例如A中断触发,正在运行A中断的服务程序,此时B中断也触发,如果B中断的抢占优先级比A的高,则程序会打断A的中断服务程序,去运行B的中断服务程序,即中断嵌套。等B的中断服务程序运行完后继续运行A的中断服务程序。如果B的抢占优先级没有高过A的抢占优先级,则程序不会打断A的中断服务程序,而是待定A的中断服务程序运行完成后才运行B的中断服务程序。
  响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。如果几个抢占优先相同的中断同时触发,那么响应优先级高的最先运行。
  判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,响应优先高的中断优先级别高。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。中断向量表到单片机数据手册中查看。

4. 生成工程

  配置好STM32CubeMX后,生成工程,打开工程。

三、编写用户程序

  打开新生成的keil工程,找到main(void)函数,删除while语句中上一章写的代码。
enter description here

1. 编写中断回调函数

①,打开工程库文件目录;
②打开gpio库文件的函数目录,
③找到HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),双击,即可跳转到函数所在行。
enter description here

  函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。[1]

  HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)这个函数,就是HAL库为用户提供的外部中断回调函数入口。我们复制这个函数名,包括参数一起复制。回到main.c文件,在文件最下方,在 USER CODE BEGIN 4 与 USER CODE END 4 之间重建中断回调函数。在函数体中输入中断处理函数。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){	if(GPIO_Pin == GPIO_PIN_13)  //判断中断来自哪一条中断线
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);  //对LED灯所在的IO口取反
	}
}


enter description here


四、编译下载程序

  程序编译完成并下载后,通过按键触发外部中断,改变LED灯的工作状态。
STM32单片机程序下载方法有多种,有需要请转《STM32程序下载》专题查阅,选择你所需要的下载方法。http://oynote.top/?tags=57

1. 注意

  如果发现按下按键后,有时灯的状态会发生改变,有时又不会发生改变,这是正常现象,因为机械按键在断开与闭合时,在电路中会产生一些抖动,这些抖动可能会重复触发外部中断,看似只按了一次按键,然而触发了多次中断,致使LED发生了多次翻转。
  按键消抖有两种方法,一种是软件消抖,可以通过延时解决,但是在外部中断中,极不推荐使用延时函数,因为延时会占用CPU大量时间在中断中,会极大地降低单片机的实时性。另一种消抖方式为硬件消抖,也是按键消抖最好的方式,在按键的两端之间,并联一个电容,通过电容的方式消除电路中端抖动。推荐。


  1. https://blog.csdn.net/m0_37697335/article/details/81628417

    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由电子科技Blog发布,如需转载请注明出处。

    转载请注明出处:http://oynote.top/?id=354

    分享给朋友:

    相关文章

    STM32CubeMX系列教程5:串口接收不定长数据

    STM32CubeMX系列教程5:串口接收不定长数据

    一、摘要二、配置工程1. 配置串口及DMA2. 生成源码三、修改源码1. 重定向printf2. 添加串口接收所需变量3. 添加串口及IDLE处理函数4. 声明变量及函数5. 启用IDLE中断6. 修...

    STM32CubeMX系列教程4:基本串行通信

    STM32CubeMX系列教程4:基本串行通信

    一、摘要二、配置工程2-1. 启动串口中断2-2. 编写用户代码2-3. 编写中断回调函数2-4. 编译下载1-1. 启用串口通信1-2. 编写用户代码1-3. 编译下载1. 轮询方式发送2. 中断方...

    STM32CubeMX系列教程3:基本定时器中断

    STM32CubeMX系列教程3:基本定时器中断

    一、摘要二、配置工程1-1. 使能定时器1-2. 配置定时器参数1-3. 开启定时器中断1. 配置定时器参数2. 生成工程三、编写用户程序1. 编写中断回调函数2. 启动定时器四、编译下载程序一、摘要...

    STM32CubeMX系列教程1:GPIO输入与输出

    STM32CubeMX系列教程1:GPIO输入与输出

    一、摘要二、创建工程1-1. 配置RCC与Debug1-2. 选择GPIO引脚与功能1-3. 配置GPIO1. 配置外设与IO2. 时钟配置3. 工程输出设置三、编写用户代码1. 插入用户代码2. 编...

    STM32CubeMX系列教程0:创建工程

    STM32CubeMX系列教程0:创建工程

    STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(R...

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。