STM32中断控制LED闪烁
STM32中断控制LED闪烁
更多
要在STM32中使用中断控制LED闪烁,需配置外部中断(如按键触发)和LED的GPIO。以下是基于标准外设库的详细步骤和代码示例(以STM32F1系列为例):
1. 硬件连接
- LED:连接至
PC13(或其他支持GPIO的引脚) - 按键:连接至
PA0(或其他支持外部中断的引脚),按下时接地(下降沿触发)
2. 配置步骤
(1) 初始化LED GPIO
- 设置LED引脚为推挽输出模式。
(2) 初始化按键GPIO
- 设置按键引脚为浮空输入模式。
(3) 配置外部中断(EXTI)
- 将按键引脚映射到EXTI中断线。
- 设置为下降沿触发。
(4) 配置NVIC(嵌套向量中断控制器)
- 使能EXTI对应的中断通道,设置优先级。
(5) 编写中断服务函数(ISR)
- 在中断中翻转LED状态,并清除中断标志位。
3. 完整代码示例
#include "stm32f10x.h"
// 初始化LED(PC13)
void LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_SetBits(GPIOC, GPIO_Pin_13); // 初始关闭LED
}
// 初始化按键(PA0)和EXTI中断
void EXTI0_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 使能GPIOA和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// 配置PA0为浮空输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 将PA0映射到EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
// 配置EXTI0为下降沿触发
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// 配置NVIC(中断优先级)
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // EXTI0中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // 子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
// EXTI0中断服务函数
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 检查中断标志
GPIO_WriteBit(GPIOC, GPIO_Pin_13,
(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); // 翻转LED
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
int main(void) {
LED_Init(); // 初始化LED
EXTI0_Init(); // 初始化按键和中断
while (1) {
// 主循环可执行其他任务(LED由中断控制)
}
}
4. 关键点说明
-
中断触发方式:
EXTI_Trigger_Falling:下降沿触发(按键按下时PA0从高电平变低电平)。- 也可改为
EXTI_Trigger_Rising(上升沿触发)或EXTI_Trigger_Rising_Falling(双边沿触发)。
-
中断标志清除:
- 必须在ISR中调用
EXTI_ClearITPendingBit()清除中断标志,否则会重复进入中断。
- 必须在ISR中调用
-
GPIO与EXTI映射:
- PA0/PB0/PC0等共用EXTI0,同一时刻只能有一个引脚连接到EXTI0(通过
GPIO_EXTILineConfig()配置)。
- PA0/PB0/PC0等共用EXTI0,同一时刻只能有一个引脚连接到EXTI0(通过
-
低功耗优化:
- 主循环使用
__WFI()进入睡眠模式,按键中断唤醒MCU以降低功耗。
- 主循环使用
5. 扩展功能
- 防抖处理:在ISR中延时或使用定时器消抖。
- 长按/短按识别:结合定时器记录按键时长。
- 多按键控制:配置多个EXTI线(如EXTI0、EXTI1),并在各自ISR中处理逻辑。
通过上述代码,每次按键按下时,LED状态会立即翻转,实现中断控制的LED闪烁。
STM32中断与DMA通信编程
学习stm32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习:(1)用
资料下载
贾大林
2021-11-26 19:21:13
单片机实验INT0中断控制LED的程序和仿真资料免费下载
本文档的主要内容详细介绍的是单片机实验INT0中断控制LED的程序和仿真资料免费下载。
资料下载
佚名
2020-06-05 16:53:19
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机