文章目录
实验目的
保持LED灯阳极高电平输入,使用一个GPIO口作为外部中断源,当这个GPIO口产生上升/下降沿的时候触发中断,改变LED灯阴极状态,以控制LED灯的亮灭。
实验材料
- STM32F103C8T6最小开发板
- 面包板一块
- 杜邦线若干
- LED灯一个
- CH340模块一个
硬件连接
这里我使用PB5作为外部中断源,PA5作为LED灯的阴极。
当PB5由低电平接入高电平(上升沿),PA5输出低电平,LED灯亮;当PB5由高电平接入低电平时,PA5输出高电平,LED熄灭。
CH340的RXD,TXD分别与PA9,PA10连接。
面包板的正极负极分别接入3.3V,0V。
如图所示:
HAL库项目创建
1、配置GPIO口
在创建了一个基于STM32F103C8T6的项目模板后,点击SystemCore中的GPIO。
在引脚图中,点击PB5,设置为EXTI。点击后在出现的NVIC中勾选Enable使能。
然后点击GPIO下的PB5,选择GPIO mode为在上升沿和下降沿时都触发。
再在引脚图中点击PA5,选择作为GPIO Output,然后保持默认参数不变(推挽输出模式)。
2、生成项目
在设置好项目名称与路径,并选择MDK为你的IDE后,在Code Generator中勾选这一项。
然后点击右上角创建项目。
3、代码编写
在生成的项目中,stm32f1xx_it.c文件用于保存中断函数。
我们进入这个文件,找到触发的中断函数。
我们先编译一遍项目,再点击中间调用的函数名,按F12进入定义。
在这个函数中,又调用了两个函数。
上面那个函数是一个宏定义,不用管它,我们再用同样的方式进入下面那个函数的定义:
这个函数使用_weak标识。
_weak标识符所标识的函数表示当用户定义了一个同名函数的时候就使用用户定义的函数,否则再使用这里被weak修饰的函数。
这个函数里面,hal库还打了一段注释:这个文件不能被修改,你要在自己的文件里面定义一个同名函数。因此,我们转到自己的文件stm32ffxx_it.c中定义一个同名函数,将我们在触发中断后要执行的操作(开灯关灯)写在这个函数里面。
这样触发中断后,就会执行我们想要执行的代码了
代码解释
这个函数传入的参数GPIO_Pin,根据上一层代码,得知传进来的值是GPIO_PIN_5。
我们这个实验的原理是:当PB5产生上升沿(此时读取PB5,它是高电平)的时候,将LED的阴极PA5接低电平来点亮LED;当PB5产生下降沿(此时读取PB5,它是低电平)的时候,将LED的阴极PA5接高电平来熄灭LED。
因此这里要用到几个HAL库的库函数:
1、HAL_GPIO_ReadPin(GPIOX,GPIO_PIN)
传入GPIO的组号与组内编号,获取它的当前状态。返回值可以是GPIO_PIN_SET(高电平)或者GPIO_PIN_RESET(低电平)
2、HAL_GPIO_WritePin(GPIOX,GPIO_PIN,status)
传入GPIO的组号与组内编号,以及想要输出的电平高低,使对应的GPIO引脚输出对应的电平。
首先我们读取外部中断源PB5的电平状态,根据不同的状态,将PA5输出不同的电平,以控制LED灯的亮灭。
实验现象
当PB5杜邦线接入高电平,LED灯明显发亮;当PB5杜邦线接入低电平,LED灯熄灭。
由于接触不良的原因,杜邦线接空气的时候会频繁变化输入电平,使得LED灯频闪,接入高低电平时,频闪消失。