STM32F103中断模式控制led灯亮灭

前言

软件版本

  • STM32CubeMX 6.4 0
  • Keil 531

硬件

  • STM32F103C8T6

1 STM32CubeMX配置项目

1.1 引脚配置

新建项目后,选择STM32F103C8,之后配置引脚

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

配置后引脚如图所示

在这里插入图片描述

1.2 配置EXTI

在NVIC(嵌套向量中断控制器)中,使得PB5能中断

在这里插入图片描述

1.3 配置GPIO

A1设置为高电平,A7为低电平
把B5中断配置为上升沿和下降沿都触发

在这里插入图片描述

1.4 创建项目

完成相关代码配置,创建项目

在这里插入图片描述
在这里插入图片描述

2 Keil配置代码

2.1 查看中断函数

打开生成的项目,找到stm32f1xx_it.c
在这里插入图片描述

找到中断函数EXTI9_5_IRQHandler,选中HAL_GPIO_EXTI_IRQHandler语句,按F12跳到该函数

在这里插入图片描述

在这里插入图片描述

注意:此处跳转必须要运行之后才能到达

2.2 修改代码

往下找到HAL_GPIO_EXTI_Callback这个函数

在这里插入图片描述

该函数是给用户自己重写的,可以在这里根据不同的中断来执行不同的处理。在这里我们需要根据B5的不同中断来实现A5的亮灭。

__weak修饰符:加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

修改代码如下

    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_A5_GPIO_Port,LED_A5_Pin,GPIO_PIN_RESET);//把A5变为低电位
        //高电位
        else
            HAL_GPIO_WritePin(LED_A5_GPIO_Port,LED_A5_Pin,GPIO_PIN_SET);//把A4变为高电位
        }
    }

2.3 编译并烧录

通过mcuisp.exe进行烧录

在这里插入图片描述

3 结果

实际运行结果如下

在这里插入图片描述

因为抖动的原因,当B5什么都不接入的时候,灯一直在频闪,看起来是亮的,其实不是很亮;
在接入高电平后LED灯明显变亮;
接入低电平后LED灯熄灭

总结

HAL库可以使用不同方式来完成同一目标,又学习了中断方式控制灯,由于没有开关模块,使用高低电平模拟控制灯的亮灭


参考:
https://blog.csdn.net/as480133937/article/details/98983268
https://blog.csdn.net/qq562029186/article/details/76216311
https://blog.csdn.net/qq_47281915/article/details/121024427?spm=1001.2014.3001.5501

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要控制STM32F103R6上的LED,需要使用中断控制。以下是基本的步骤: 1. 配置GPIO口为输出模式,将LED连接到该GPIO口上。 2. 配置NVIC中断控制器,使其能够响应GPIO口的中断信号。 3. 在中断服务程序中,编写代码来控制LED的开关。 具体的代码实现可以参考STM32F103R6的开发手册和相关的示例程序。需要注意的是,中断控制是一种高级的编程技术,需要对STM32F103R6的硬件结构和寄存器操作有一定的了解。建议在掌握基本的STM32F103R6编程技能后再尝试使用中断控制LED。 ### 回答2: STM32F103R6是一款基于ARM Cortex-M3内核的微控制器。它具有丰富的外设资源,包括多个定时器、串口、SPI和I2C等接口,还支持多达80个GPIO引脚。在这些资源的基础上,我们可以使用中断的方式控制LED。 首先,我们需要初始化GPIO引脚,将其配置为输出模式,用于控制LED的亮。此时,我们可以使用GPIO_WriteBit函数设置引脚的电平状态,从而控制LED的亮。 接下来,我们需要使用定时器中断控制LED的闪烁。定时器是STM32F103R6中常用的外设资源,可以通过它来生成定时中断。在中断服务函数中,我们可以修改LED引脚的状态,使其在规定的时间内交替亮。 具体实现时,我们可以选择使用定时器的TIMx->PSC和TIMx->ARR寄存器来控制中断的时间间隔,其中,PSC寄存器用于预分频,ARR寄存器用于设定计数器的自动重装值。在中断服务函数中,我们可以使用GPIO_ToggleBits函数来交替修改LED的状态。 在配置好GPIO引脚和定时器后,我们就可以使用中断的方式控制LED的亮。需要注意的是,中断服务函数需要尽量简短,以免对系统运行产生影响。同时,我们也需要考虑到抢占和优先级等问题,确保系统能够稳定运行。 总之,使用中断控制LED需要考虑到GPIO引脚的初始化和定时器的配置,同时需要编写中断服务函数来控制LED的亮。掌握了这些基础知识,我们就可以使用STM32F103R6来实现更为复杂的功能。 ### 回答3: STM32F103R6是一款功能强大的微控制器,它支持多个中断,并且可以轻松控制LED。下面是一个使用STM32F103R6控制LED的示例: 首先,需要配置STM32F103R6的GPIO,即将要控制LED连接到微控制器的某个引脚上。可以使用STM32CubeMX软件来配置GPIO,也可以手动编写代码来配置。 接下来,需要定义一个中断处理函数。中断处理函数是在中断事件发生时自动调用的函数。在本例中,我们将使用TIM2定时器来控制LED的闪烁,因此需要定义一个TIM2的中断处理函数。 然后,在主程序中,需要配置TIM2定时器并设置中断。具体步骤如下: 1. 配置TIM2为定时器模式,并设置预分频器和计数器值,以确定定时器的计数周期和频率。 2. 打开TIM2的中断。 3. 启动TIM2定时器。 最后,在TIM2的中断处理函数中,需要设置LED的状态,以实现闪烁效果。可以使用GPIO的库函数来设置LED的状态。 总结一下,使用STM32F103R6控制LED需要进行如下几个步骤:配置GPIO、定义中断处理函数、配置定时器并设置中断、在中断处理函数中设置LED的状态。通过这些步骤,可以轻松实现LED控制和闪烁效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日常脱发的小迈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值