stm32外部中断模式控制灯亮灭

stm32外部中断模式控制灯亮灭

软件版本:

STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103ZET6

1. 通过STMCube配置项目

1.1 引脚配置

A4输出控制灯的亮灭,设置为GPIO_Output

A1持续输出高电平,设置同上

A7持续输出低电平,设置同上

B7模拟开关,设置为GPIO_EXTI5

image-20221018162534540

1.2 配置SYS

在Pinout &Configuration 栏里,配置系统调试接口SYS,选择 Serial Wire

在这里插入图片描述

1.3 配置RCC

RCC设置,选择 HSE (外部高速时钟)为 Crystal/Ceramic Resonator

image-20221018170403443

1.4 配置GPIO

选择 LED 灯引脚 PA4,设置引脚为输出模式 GPIO_Output;
选择 PB7作为外部中断的引脚,设置为与中断线 GPIO_EXTI7 连接

PA1为高电平,PA7为低电平。

将PA4的Uesr Label 改为LED,PB7的改为SWITCH

image-20221021153934280

image-20221021160307242

1.5 配置NVIC

image-20221018171059010

1.6 时钟

image-20221021165616260

1.7 代码创建

image-20221018171538569

image-20221018171637491

2. 通过KEil配置代码

2.1 添加代码

  • 外部中断处理函数

外部中断处理逻辑与按键扫描一样,当检测到按键时, LED 状态变化。回调函数中无需处理中断标志位,是因为此项工作已经由 HAL_GPIO_EXTI_IRQHandler 完成。

2.1.1打开生成的项目,打开stm32f1xx_it.c,找到EXTI9_5_IRQHandler()函数

image-20221021154746879

2.1.2 选中HAL_GPIO_EXTI_IRQHandler,按F12跳转到stm32f1xx_hal_gpio.c,找到HAL_GPIO_EXTI_Callback()这个函数

image-20221021155150114

将下面代码写入HAL_GPIO_EXTI_Callback()对应位置处

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
{ 
	 if( GPIO_Pin == SWITCH_Pin ) // 判断外部中断源
		{
			HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻转LED状态
		}
}

image-20221021172733938

注意:这时会报错有些管脚未定义,要将头文件main.h中的宏定义复制到stm32f1xx_hal_gpio.c中

image-20221021155721401

image-20221021165735981

2.2 编译成HEX文件

image-20221019181042744

2.3 烧录

image-20221019181059726

3. 运行

在这里插入图片描述

4.总结

本次实验运用了STM外部中断模式控制LED灯亮灭,初步体会了外部中断的用法,同时也更熟悉了对STM32CubeMX和Keil5的运用。

5.参考资料

STM32CubeMX 实现 LED 亮灭----中断模式_风霜叶的博客-CSDN博客

STM32外部中断模式控制LED灯亮灭_初见snow的博客-CSDN博客
226.3001.4187)

STM32外部中断模式控制LED灯亮灭_初见snow的博客-CSDN博客

以下是一个基于STM32外部中断控制LED灯亮的示例代码: ```c #include "stm32f10x.h" GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; void LED_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void EXTI_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); 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 = 0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { LED_Init(); EXTI_Config(); while (1) { // Do nothing } } ``` 在此示例中,我们使用了STM32外部中断功能,当按下外部中断引脚PB0时,就会触发中断处理函数`EXTI0_IRQHandler`。在中断处理函数中,我们通过检查中断状态位来确定中断是否发生,并使用GPIO操作来切换LED灯的状态。在主函数中,我们初始化了LED灯和外部中断,并进入了一个无限循环,等待中断的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值