STM32新手必看 简单几步用cubeMX完成按键的外部中断控制灯的亮灭(STM32F103RCT)

一、什么是外部中断?

外部中断通常是 GPIO 的电平跳变引起的中断。在 stm32 中,每一个 GPIO 都可以作为外部中断的触发源。
外部中断支持 GPIO 的三种电平跳变模式。
1.上升沿中断:当 GPIO 的电平从低电平跳变成高电平时,引发外部中断。
2.下降沿中断:当 GPIO 的电平从高电平跳变成低电平时,引发外部中断。
3.上升沿和下降沿中断:当 GPIO 的电平从低电平跳变成高电平和从高电平跳变成低电平时,都能引发外部中断。

二、操作步骤

1.在cube中配置外部中断

这里我们使用按键KEY0,从原理图中可以看到它的的引脚是PC5
在这里插入图片描述
所以我们将PC5设置为外部中断模式
在这里插入图片描述

将 GPIO 模式设置为下降沿触发的外部中断,上下拉电阻设置为上拉电阻,最后设置用户标签为 KEY0。
在这里插入图片描述
使能外部中断
在这里插入图片描述

因为我们需要一个灯,这里使用LED0,将LED0初始化
从原理图可以看到PA8引脚是LED0
在这里插入图片描述
初始化LED0,让LED0刚开始的状态是亮着的,设置用户标签为LED0,其他保持默认

在这里插入图片描述
生成代码(如果这个步骤不会可以参考我的另一篇文章点击此处

2.介绍主要函数

1.HAL_GPIO_EXTI_Callback

每当产生外部中断时,程序首先会进入外部中断服务函数。在 stm32f4xx_it.c 中,可以找到函数 EXTI0_IRQHandler,它通过调用函数HAL_GPIO_EXTI_IRQHandler 对中断类型进行判断,并对涉及中断的寄存器进行处理,在处理完成后,它将调用中断回调函数HAL_GPIO_EXTI_Callback,在中断回调函数中编写在此次中断中需要执行的功能。
代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)	

2.HAL_GPIO_TogglePin
翻转对应引脚的电平,这里我们需要翻转LED0的电平
代码如下:

HAL_GPIO_TogglePin(GPIOA,LED0_Pin);

3.主函数

代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		HAL_GPIO_TogglePin(GPIOA,LED0_Pin);
}

在这里插入图片描述


三、效果展示

按键没有按下的时候亮
在这里插入图片描述
按下按键灯灭
在这里插入图片描述
再按灯亮
在这里插入图片描述
这样按键就可以控制灯的亮灭

部分内容改写自大疆(侵权立删)

下面是基于STM32F103RCT6的按键使用外部中断控制LED的代码: ``` #include "stm32f10x.h" void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12))); EXTI_ClearITPendingBit(EXTI_Line0); } } void initGPIO() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { initGPIO(); while (1) { // Loop } } ``` 该代码的作用是,将按键连接到PA0引脚,将LED连接到PB12引脚。按下按键时,LED将切换状态。在代码中使用外部中断来检测按键的状态,并在触发中断时切换LED的状态。在初始化中,使用GPIO_Init函数来配置PB12为推挽输出模式,PA0为下拉输入模式。使用EXTI_Init函数来配置外部中断,以便在检测到按键状态变化时触发中断。在中断处理函数中,使用GPIO_WriteBit函数来切换LED的状态,并使用EXTI_ClearITPendingBit函数清除中断标志位。整个程序将被放在一个无限循环中,以便在触发中断后继续运行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值