登录/注册

STM32中断控制LED闪烁

STM32中断控制LED闪烁

更多

要在STM32中使用中断控制LED闪烁,需配置外部中断(如按键触发)和LED的GPIO。以下是基于标准外设库的详细步骤和代码示例(以STM32F1系列为例):


1. 硬件连接


2. 配置步骤

(1) 初始化LED GPIO


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. 关键点说明

  1. 中断触发方式

    • EXTI_Trigger_Falling:下降沿触发(按键按下时PA0从高电平变低电平)。
    • 也可改为EXTI_Trigger_Rising(上升沿触发)或EXTI_Trigger_Rising_Falling(双边沿触发)。
  2. 中断标志清除

    • 必须在ISR中调用EXTI_ClearITPendingBit()清除中断标志,否则会重复进入中断。
  3. GPIO与EXTI映射

    • PA0/PB0/PC0等共用EXTI0,同一时刻只能有一个引脚连接到EXTI0(通过GPIO_EXTILineConfig()配置)。
  4. 低功耗优化

    • 主循环使用__WFI()进入睡眠模式,按键中断唤醒MCU以降低功耗。

5. 扩展功能

通过上述代码,每次按键按下时,LED状态会立即翻转,实现中断控制的LED闪烁。

stm32中断怎么处理的

STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32

2024-01-02 17:35:10

为什么有些STM32中断没有子优先级?

看到一个交流群在讨论关于【关于STM32中断优先级的话题】,其中就有小伙伴提到:为什么有些STM32

2023-10-17 15:50:58

STM32中断系统的工作流程

管理核心的STM32的中断系统有一个初步的了解,明白中断的一些基本概念以及STM32

2023-06-22 09:17:00

STM32中断与DMA通信编程

STM32中断与DMA通信编程中断模式编程CubeMx创建项目Keil修改代码串口中断

资料下载 佚名 2021-12-24 19:06:57

STM32中断与DMA通信编程

学习stm32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习:(1)用

资料下载 贾大林 2021-11-26 19:21:13

STM32 CubeMX学习:3. 定时器闪烁LED

STM32 CubeMX学习:3. 定时器闪烁LED 系列文章目录前期的准备点亮 LE

资料下载 好名字 2021-11-25 10:21:07

stm32f103中断总结很详细

stm32f103中断总结很详细

资料下载 佚名 2021-11-24 17:06:02

单片机实验INT0中断控制LED的程序和仿真资料免费下载

本文档的主要内容详细介绍的是单片机实验INT0中断控制LED的程序和仿真资料免费下载。

资料下载 佚名 2020-06-05 16:53:19

如何通过定时器T1中断方式控制LED1周期性闪烁

如何通过定时器T1中断方式控制LED1周期性闪烁?

2022-01-25 07:00:30

STM32中断实现按键LED闪烁

STM32中断实现按键LED灯闪烁、串口通信一、

2022-01-19 06:11:55

请问stm32定时器中断如何控制led闪烁

请问stm32定时器中断如何控制led灯

2021-11-29 06:51:49

嵌入式STM32中断如何实现控制led灯的控制

嵌入式STM32中断如何实现控制led灯的

2021-11-17 06:03:38

STM32中断机制 stm32中断方式有几种

中断机制在单片机中是很重要的环节,中断代码默认地从上往下执行,遇到特定条件或特定语句,将按照指定的程序跳转。而

2021-07-22 16:38:16

STM32关全局中断的方法 STM32中断类型

STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生

2021-07-22 10:52:54

STM32中断及FreeRTOS中断优先级配置

STM32中断,及FreeRTOS中断优先级配置

2020-03-04 11:45:36

7天热门专题 换一换
相关标签