STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)

目录

1、实验目的

2、实验设计

3、实验步骤

3.1、方式一:实时检测按键状态,联动控制LED灯

3.1.1、使用 STM32CubeMX 新建项目工程

3.1.2、编写实施代码

3.1.3、配置烧写参数

3.1.4、烧写程序

3.2、方式二:按键中断,联动控制LED灯

3.2.1、使用 STM32CubeMX 新建项目工程

3.2.2、编写实施代码

3.2.3、配置烧写参数

3.2.4、烧写程序

1、实验目的

  • 了解STM32L431RCT6 按键外围电路搭建原理;
  • 学习STM32CubeMX 按键的两种使用方法;
  • 掌握STM32编程实现按键控制LED状态的编程技巧。

2、实验设计

  1. 实验开发板的共有交互4个按键分别连接在PC0、PC1、PC2和PC3这4个GPIO,原理图如下所示;
  2. 实时判断这4个按键GPIO的状态,根据其变化,来改变LED灯的状态,这里将实现按其中任意一个键均可实现LED的取反效果;
  3. 最终使用两种方式:实时读取按键GPIO状态和按键中断的方法实现联动控制LED等。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第1张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第2张图片

3、实验步骤

3.1、方式一:实时检测按键状态,联动控制LED灯

3.1.1、使用 STM32CubeMX 新建项目工程

第一步:双击打开 STM32CubeMX,点击新建工程,在 MCU 选型框里输入 STM32L431RC,右侧选择芯片封装为 LQFP 的型号,双击进入。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第3张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第4张图片

第二步:参照原理图配置GPIO。

看到 STM32L431RC MCU有高速和低速外部晶振,按键KEY1连接在PC0引脚、按键KEY2连接在PC1引脚、按键KEY3连接在PC2引脚、按键KEY4连接在PC3引脚、LED 灯接在的是PC13 引脚。

读取按键状态,当为低时说明此时按下按键,当 PC13 输出为高的时候点亮 LED 灯。

因此我们在 Pinout 配置界面先设置使用外部晶振,在 RCC 下面将高速时钟和低速时钟都设置为 Crystal/Ceramic Resonator,然后单击PC13 引脚设置为 GPIO_Output 模式,PC0引脚、PC0引脚、PC0引脚和PC0引脚设置为GPIO_Iutput 模式。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第5张图片

在 SYSTEM 一栏里点击 GPIO 进入设置,具体如下:

  • 点击PC0,配置初始化参数:输入模式,上拉状态,标签名称为KEY1;
  • 点击PC1,配置初始化参数:输入模式,上拉状态,标签名称为KEY2;
  • 点击PC2,配置初始化参数:输入模式,上拉状态,标签名称为KEY3;
  • 点击PC3,配置初始化参数:输入模式,上拉状态,标签名称为KEY4;
  • 点击 PC13 引脚,配置初始化参数:推挽输出,默认输出低电平(初始化不让 LED 亮),无上拉无下拉。,标签名称为LED。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第6张图片

第三步:配置时钟。按照自己的工程要求配置时钟,本次以自动设置为例,直接将最后的频率设置为 80MHz(确定后电机回车),STM32CubeMX 会自动设置。 

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第7张图片

第四步:配置生成代码的一些配置。在 Project 界面设置本工程名称,选择按照什么开发工具生成项目工程,这里我们使用的是 MDK5。注意:工程名称最好不要是中文。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第8张图片

 在这个界面中还需要配置的是 Code Generator,这一栏中将“Generate peripheral initialization as a……”选中,这样生成的工程会把使用的资源(IIC、SPI、USART、GPIO 等)初始化代码分别放在对应名字的单独的.c 文件中,方便我们自己增删改查使用。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第9张图片

第五步:点击上面的 OK 生成工程代码。 生成工程代码成功后,可以选择打开工程目录或者直接打开工程。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第10张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第11张图片

 选择打开工程目录。可以看到工程目录分为两个部分,一个是 MDK5 的工程目录,一个是 STM32CubeMX 的工程。STM32CubeMX 工程文件还可以用 STM32CubeMX 打开提供增加或者删除、修改本工程,非常方便。(工程目录结构及文件的具体解析见控制LED灯闪烁(NB-IoT项目实战专栏—4)3.2部分)

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第12张图片

3.1.2、编写实施代码

第一步:找到 GPIO 接口。在 main.c 文件中可以看到,工程文件首先重置所有外设,初始化 Flash 接口和 Systick,然后配置初始化了系统时钟,再配置初始化了 GPIO(按键和LED),初始化函数在 gpio.c 文件里,剩下的我们就可以直接写自己需要的应用了,这里我们想做的事情是按键联动控制LED亮/灭状态。

由于 HAL 库是封装的比较好的,因此我们不需要和底层的寄存器打交道,只需要利用外设库提供的接口即可,我们想点亮 LED 灯闪烁就是让对应的引脚拉低拉高,打开 stm32l4xx_hal_gpio.h 中接口函数。

打开步骤为:

  • Drivers/STM32L4xx_HAL_Driver→点开stm32l4xx_hal_gpio.c 前面的“+”;
  • 找到 stm32l4xx_hal_gpio.h 双击打开,拉倒最下面,会看到/* IO operation functions   *****************************************************/,这个下面的函数就是 GPIO 的一些接口,如下图所示:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第13张图片

第二步: 编写程序,使用按键联动控制LED灯的亮灭状态 

这里将使用三个GPIO函数:

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState),功能是设置拉高还是拉低某个引脚,函数各个参数说明如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第14张图片

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),功能是读取指定的输入端口的引脚,函数各个参数说明如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第15张图片

 HAL_Delay(uint32_t Delay),功能是延时单位毫秒,函数各个参数说明如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第16张图片

将这三个函数名复制到 main.c 文件的 while 下面的 USER CODE BEGIN 3 和 USERCODE END 3 中间。

根据函数参数说明提示和类型,设置函数中的参数,实现按键控制LED等的亮/灭状态,具体代码如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第17张图片

 第三步: 编译程序,确保无误。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第18张图片

3.1.3、配置烧写参数

将NB-IoT实验版供电,插上烧写器,配置烧写参数,设置使用 ST-LINK 下载,设置好下图参数,点击下载程序。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第19张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第20张图片

3.1.4、烧写程序

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第21张图片

最终实现实时检测按键状态,联动控制LED灯亮/灭状态功能,此处省略效果图。

3.2、方式二:按键中断,联动控制LED灯

3.2.1、使用 STM32CubeMX 新建项目工程

第一步:双击打开 STM32CubeMX,点击新建工程,在 MCU 选型框里输入 STM32L431RC,右侧选择芯片封装为 LQFP 的型号,双击进入。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第22张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第23张图片

第二步:参照原理图配置GPIO。

看到 STM32L431RC MCU有高速和低速外部晶振,按键KEY1连接在PC0引脚、按键KEY2连接在PC1引脚、按键KEY3连接在PC2引脚、按键KEY4连接在PC3引脚、LED 灯接在的是PC13 引脚。

读取按键状态,当为低时说明此时按下按键,当 PC13 输出为高的时候点亮 LED 灯。

因此我们在 Pinout 配置界面先设置使用外部晶振,在 RCC 下面将高速时钟和低速时钟都设置为 Crystal/Ceramic Resonator,然后单击PC13 引脚设置为 GPIO_Output 模式,PC0引脚、PC1引脚、PC2引脚和PC3引脚设置为外部中断模式。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第24张图片

在 SYSTEM 一栏里点击 GPIO 进入设置,具体如下:

  • 点击PC0,配置初始化参数:外部中断模式(GPIO_EXTI0),上拉状态,触发方式为:External Interrupt Mode with Falling edge trigger detection(下降沿触发),标签名称为KEY1;
  • 点击PC1,配置初始化参数:外部中断模式(GPIO_EXTI1),上拉状态,触发方式为:External Interrupt Mode with Falling edge trigger detection(下降沿触发),标签名称为KEY2;
  • 点击PC2,配置初始化参数:外部中断模式(GPIO_EXTI2),上拉状态,触发方式为:External Interrupt Mode with Falling edge trigger detection(下降沿触发),标签名称为KEY3;
  • 点击PC3,配置初始化参数:外部中断模式(GPIO_EXTI3),上拉状态,触发方式为:External Interrupt Mode with Falling edge trigger detection(下降沿触发),标签名称为KEY4;
  • 点击 PC13 引脚,配置初始化参数:推挽输出,默认输出低电平(初始化不让 LED 亮),无上拉无下拉。,标签名称为LED。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第25张图片

第三步:配置时钟。按照自己的工程要求配置时钟,本次以自动设置为例,直接将最后的频率设置为 80MHz(确定后电机回车),STM32CubeMX 会自动设置。 

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第26张图片

第四步:配置生成代码的一些配置。在 Project 界面设置本工程名称,选择按照什么开发工具生成项目工程,这里我们使用的是 MDK5。注意:工程名称最好不要是中文。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第27张图片

 在这个界面中还需要配置的是 Code Generator,这一栏中将“Generate peripheral initialization as a……”选中,这样生成的工程会把使用的资源(IIC、SPI、USART、GPIO 等)初始化代码分别放在对应名字的单独的.c 文件中,方便我们自己增删改查使用。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第28张图片

第五步:点击上面的 OK 生成工程代码。 生成工程代码成功后,可以选择打开工程目录或者直接打开工程。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第29张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第30张图片

 选择打开工程目录。可以看到工程目录分为两个部分,一个是 MDK5 的工程目录,一个是 STM32CubeMX 的工程。STM32CubeMX 工程文件还可以用 STM32CubeMX 打开提供增加或者删除、修改本工程,非常方便。(工程目录结构及文件的具体解析见控制LED灯闪烁(NB-IoT项目实战专栏—4)3.2部分)

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第31张图片

3.2.2、编写实施代码

第一步:找到 GPIO 接口。在 main.c 文件中可以看到,工程文件首先重置所有外设,初始化 Flash 接口和 Systick,然后配置初始化了系统时钟,再配置初始化了 GPIO(按键和LED),初始化函数在 gpio.c 文件里,剩下的我们就可以直接写自己需要的应用了,这里我们想做的事情是按键外部中断联动控制LED亮/灭状态。

由于 HAL 库是封装的比较好的,因此我们不需要和底层的寄存器打交道,只需要利用外设库提供的接口即可,我们想点亮 LED 灯闪烁就是让对应的引脚拉低拉高,打开 stm32l4xx_hal_gpio.h 中接口函数。

打开步骤为:

  • Drivers/STM32L4xx_HAL_Driver→点开stm32l4xx_hal_gpio.c 前面的“+”;
  • 找到 stm32l4xx_hal_gpio.h 双击打开,拉倒最下面,会看到/* IO operation functions   *****************************************************/,这个下面的函数就是 GPIO 的一些接口,如下图所示:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第32张图片

第二步: 编写程序,使用按键联动控制LED灯的亮灭状态 

这里将使用两个GPIO函数:

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState),功能是设置拉高还是拉低某个引脚,函数各个参数说明如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第33张图片

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),功能是外部中断回调函数,函数各个参数说明如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第34张图片

 将这两个函数名复制到 gpio.c 文件的 GPIO配置 下面的 USER CODE BEGIN 2和 USER CODE END 2 中间。根据函数参数说明提示和类型,设置函数中的参数,实现按键控制LED等的亮/灭状态,具体代码如下:

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第35张图片

 第三步: 编译程序,确保无误。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第36张图片

3.2.3、配置烧写参数

将NB-IoT实验版供电,插上烧写器,配置烧写参数,设置使用 ST-LINK 下载,设置好下图参数,点击下载程序。

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第37张图片

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第38张图片

3.2.4、烧写程序

STM32按键联动控制LED灯状态(NB-IoT项目实战专栏—5)_第39张图片

最终实现按键外部中断检测,联动控制LED灯亮/灭状态功能,此处省略效果图。

基础实验:STM32控制OLCD显示中英文(NB-IoT项目实战专栏—6)

你可能感兴趣的:(物联网,NB-IoT,NB-IoT项目实践)