STM32使用外部中断控制led灯亮灭

一、所需环境软硬件

1、软件

STM32CubeMX
Keil
FlyMcu

以上软件均可在网上上免费下载到

2、硬件

STM32F103最小系统板一块
面包板一块
导线若干
led小灯泡一个

二、中断介绍

中断是由内核外部产生的,一般由硬件引起,比如外设中断和外部中断等。
处理器和外部设备的数据传输方式:
Alt

中断的全过程:
Alt

中断过程执行的示意图:
Alt

处理器根据不同中断的重要程序设置不同的优先级:
Alt

中断被响应的过程:
Alt

GPIO引脚的外部中断触发方式:
Alt

中断程序的编程步骤:
Alt

这里我们只需完成第五步:编写中断服务程序
中断服务任务处理通过用户编写的回调函数来实现:
Alt

三、STM32CubeMX新建项目

和之前一样,选择自己芯片的型号,我这里是STM32F103C8T6
这里需要一个GPIOB端口充当开关的角色,使用一根导线连接端口和电平,接高电平时,LED亮灯;接低电平时,LED灭灯。

1、引脚配置

A4输出控制灯的亮灭,设置为GPIO_Output
A1持续输出高电平,设置为GPIO_Output
A7持续输出低电平,设置为GPIO_Output
B5模拟开关,设置为GPIO_EXTI5

并且为PA4和PB5引脚起个名字,方便后续代码引用。
Alt

https://s17.aconvert.com/convert/p3r68-cdx67/0ixoa-par3t.gif

2、配置EXIT

Alt

3、配置SYS

Alt

4、配置GPIO

改变PB5引脚的触发模式
Alt

5、创建项目

Alt
Alt

四、Keil编写代码及烧录

在main.c中编写回调函数,回调函数就是中断程序执行的函数。

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
      if(GPIO_Pin == SWITCH_Pin){
        //获取B5的电位
        GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);

        //低电位
        if(pinState==GPIO_PIN_RESET)
        HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);//把A4变为低电位
        //高电位
        else
            HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);//把A4变为高电位
        }
    }

Alt
使用FlyMcu烧录成功:
Alt

五、实现效果

可见,开关接高电平时LED灯变亮了,开关接低电平时LED灯灭了。因为外部电路的存在,LED灯一直是常亮的。

Alt

六、总结

使用外部中断模拟开关控制LED灯亮,首先需要弄懂中断控制的原理,因为有STM32CubeMX软件的帮助,我们只需要编写回调函数来设置中断后运行的程序。总的来说还是比较简单。