基于HAL库STM32CuBe的外部中断EXIT(STM32F407ZGT6)

STM32的中断分为内核中断和外部中断,“内核中断”在《ARM CM3&CM4权威指南》中也被称作“系统异常”,如下所示:

7070

 70

 

 

今天主要讨论外部中断,即 CMSIS-Core中枚举值为正的异常(见表7.3)。

首先看关键词“中断线”,即“EXTI线”。STM32F407有23个外部中断,即23个中断线,从EXTI线0到EXTI线22。(此处书中似乎写成了22个中断线,貌似有误)

我们需要将I/O口与中断线之间建立映射关系,由于I/O口数量多于23,因此这种映射是多对一的,多个I/O口对应一个中断线。以EXTI线0为例,STM32按照GPIOA.0,GPIOB.0,GPIOC.0,GPIOD.0,GPIOE.0,GPIOF.0,GPIOG.0,GPIOH.0,GPIOI.0对应EXTI线0(即PA0,PB0,PC0,PD0,PE0,PF0,PG0,PH0,PI0均可以对应EXTI线0)。实际用到某个I/O引脚时,再通过配置决定具体哪个引脚对应EXTI线0。

接下来看关键词“步骤”,即配置外部中断的步骤。可以参考STM32的固件库函数stm32f4xx_exti.c代码和《精通STM32F4(库函数版)》。

代码中的注释部分可以看到:

                       ##### How to use this driver #####
 ==================================================
 
 [..] In order to use an I/O pin as an external interrupt source, follow steps 
      below:
   (#) Configure the I/O in input mode using GPIO_Init()
   (#) Select the input source pin for the EXTI line using SYSCFG_EXTILineConfig()
   (#) Select the mode(interrupt, event) and configure the trigger 
       selection (Rising, falling or both) using EXTI_Init()
   (#) Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init()

 [..]     
   (@) SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx
       registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

书中的步骤也基本类似:

1.使能I/O口时钟,初始化I/O口为输入。—— GPIO_Init(),RCC_AHB1PeriphClockCmd

2.使能SYSCFG时钟,设置I/O口与中断线的映射关系。—— RCC_APB2PeriphClockCmd(),SYSCFG_EXTILineConfig()

3.初始化中断线(哪条EXTI线,中断模式是中断还是事件,触发方式是下降沿触发、上升沿触发还是任意电平触发,是否使能中断线)。—— EXTI_Init()

4.配置嵌套中断向量控制器NVIC。—— NVIC_Init()

5.编写中断服务函数。—— EXTI0_IRQHandler(),EXTI1_IRQHandler(),EXTI2_IRQHandler(),EXTI3_IRQHandler(),EXTI4_IRQHandler(),EXTI9_5_IRQHandler(),EXTI15_10_IRQHandler()。这些函数名称是在.s启动文件中定义的。

PS:这部分知识内容源自这位博主,大家感兴趣可以去这位博主这里了解,侵权请联系我删除。

https://blog.csdn.net/wofreeo/article/details/82725736
 

然后我们直接开始吧,这些理论的东西,自己去了解就好了。

准备工作:

1、STM32开发板(我的是STM32F407ZGT6)

2、STM32CubeMx软件、 IDE: Keil软件

3、STM32F1xx/STM32F4xxHAL库  

4、按键管脚  PF9  

5   LED管脚 PE3 PE4
 

RCC和SYS就不讲了,这个自己配就行了,很简单,如果不会看看我这篇文章

https://blog.csdn.net/weixin_53000184/article/details/124246194?spm=1001.2014.3001.5502

想了想还是给截图出来吧。

SYS:

8d0d6e18a8ba4a588b7710d48ead4703.png

RCC:

0be54cf73897470cbbcfda7cb5836e22.png

  GPIO:

LED:2个GPIO_OUTPUT (输出模式)

按键:PF9按键GPIO_EXITx(外部中断模式)(按键为下降沿触发)

9f7bab6a4f0240e4b62a768ece502207.png

 我使用PF9按键触发外部中断,配合两个LED观察现象。

 b5cfa8424f2748f09e69242e387b92db.png

GPIO output level   引脚电平设置   高/低
GPIO mode   GPIO模式     推挽输出/开漏输出
GPIO Pull-up/Pull-dowm   上拉下拉电阻      上拉电阻/下拉电阻/无上拉或下拉
Maxinum output speed   引脚速度设置   低速/中速/高速
User Label    用户标签   给引脚设置名称  如LED0

b1ada178de5b45d787598c834e17311d.png

 主要是NVIC的配置。这里的EXIT的优先级一定要比Sys tick timer的低,我这里配2.(数字越小优先级越高)

时钟树的配置:

4e15115ab7904e04b9fe5405166b9f6d.png然后设置项目名称、选择储存路径、选择使用的IDE、生成工程。

 在SMT32F4××_it.c中可以看到配置的中断服务函数,并且GPIO的初始化是在gpio.c里。

cf9c46e3d80a49e1b0175f4d66a502d7.png

 这里想要注意的是:在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中。

我这里是把中断处理函数放在了stm32××_it.c文件的最底下。

注意:所有自己编写的代码请放在/* USER CODE BEGIN XXX */   /* USER CODE END XXX */之间,这样我们修改工程的时候你自己写的代码就不会被删除。

0a17499e1609452798c7ec2c726d4a90.png

 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_SET) {
		HAL_Delay(30);
		if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_SET) {
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);
			HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_4);
			while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_SET);
		}
	}
}

别忘了设置debug。 我在main函数里,加了这两个操作,验证中断的执行效果。

70b727a9d09c42899e2932ebc3230fda.png

 大致现象就是:PE3和PE4这两个LED刚刚开始是亮着的,然后当我按下按键PF9,就会重复中断从而进入中断服务函数翻转PE3和PE4这两个LED的电平,(也就是不亮,这里面也有检测按键松手过程)。当中断处理完后,两个LED又会亮起。

STM32F407ZG外部中断-C文档类资源-CSDN下载 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,可以得出以下答案: 在配置STM32F407ZGT6的HAL按键时,可以按照以下步骤进行操作: 1. 在main.c文件中的主函数中添加控制LED灯的程序代码。可以使用HAL_GPIO_TogglePin函数来翻转PE3和PE4这两个LED的电平状态。\[3\] 2. 在HAL_GPIO_EXTI_Callback函数中,通过判断按键PF9的状态来触发中断服务函数。当按键被按下时,可以使用HAL_GPIO_TogglePin函数来翻转PE3和PE4这两个LED的电平状态。\[2\] 3. 在中断处理完后,两个LED会重新亮起。\[1\] 以上是对STM32F407ZGT6的HAL按键配置的简要说明。具体的配置过程可能还需要根据具体的需求和硬件连接进行调整。 #### 引用[.reference_title] - *1* *2* [基于HALSTM32CuBe外部中断EXITSTM32F407ZGT6)](https://blog.csdn.net/weixin_53000184/article/details/124477174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32F407ZGT6点灯](https://blog.csdn.net/m0_46398504/article/details/125872167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会创建对象

谢谢考官。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值