STM32G431 LED实验
本次实验,成功调试验证LED灯、KEY例程,HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数也验证通过,并且4个流水灯花式以及按键查询四个流水灯花式都验证成功。但该实验的逻辑程序还可再优化,使其更加简洁,使实验效果更加理想、流畅。
目录
一、实验目的
1.使用STM32CubeMX、Keil5调试验证LED灯、KEY例程,下载代码实验板实物验证。(验证HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数);
2.新建4个花式的流水灯花式(8个LED)程序,下载代码试验实验板验证。(调用HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)函数,ODR的操作);
3.采用按键查询模式,新建4个按键对应4个花式的流水灯(8个LED)程序,下载代码试验实验板验证。(调用HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数,将按键模块函数、灯模块函数设计为BSP板级驱动函数);
二、实验软硬件环境
1.Java Run Time Environment (JRE);
2.STM32CubeMX软件;
3.Keil-MDK;
4.STM32G431RBTx开发板。
三、项目实现
1. STM32CubeMX新建工程
打开STM32CubeMX软件,新建一个工程。在选择MCU时,选择STM32G431RBT6芯片。
进入配置页面后:
(1)配置RCC,选择High Speed Clock(HSE)为“Crystal/Ceramic Resonator”;

(2)配置SYS,选择Debug为“Serial Wire”;

(3)配置GPIO:根据产品手册LED灯和按键的电路原理图,选择LED灯的相关引脚,配置为输出模式,选择按键的相关引脚,配置为输入模式;并为其打上对应的用户标签,用以区分,并且还需将四个按键的GPIO Pull-up/Pull-down配置为“Pull-up”;
(4)配置时钟树,配置结果如下;

(5)设置“Project Manager”的相关参数,需设置工程名称、工程存放位置以及将Toolchain/IDE设置为MDK-ARM等。
(6)点击“Generate Code”生成工程代码。
-
2.Keil调试、下载代码
(1)编译STM32CubeMX生成的工程代码,检查是否正常。
(2)配置下载器:
- 点击“Options for Target...”
,接着在出现的页面选择“Debug”后,Use选择为“CMSIS-DAP Debugger”后点击旁边的“Settings”键

- 新出现的页面配置如下图,且该页面配置完后,还需选择”Flash Download”页面,并且将该页面的“Reset and Run”打勾。全部配置完后需点击“OK”。

(3)新建BSP文件夹,并且在该文件夹中新建“Led.c”文件、“Led.h”文件、“key.c”文件和“key.h”文件。
(4)点击“Manage Project Items”
,并在“Groups”栏内新建一个“BSP”,建完后,点击“BSP”,将新建的“Led.c”文件、“key.c”文件添加入新建的“BSP”中。

(5)在“Options for Target...”
中的“C/C++”页面将头文件引用上,“Include Paths”路径必须为英文。

(6)编写“Led.h”和“key.h”代码。
- Led.h
#ifndef LED_H #define LED_H void LED_Init(void); void LED_ON(unsigned short int GPIO_Pin); void LED_OFF(unsigned short int GPIO_Pin); void LED_Toggle(unsigned short int GPIO_Pin); void left_loop(void); void right_loop(void); #endif
- key.h
#ifndef KEY_H #define KEY_H unsigned char key_READ(void); #endif
(7)编写“Led.c”、“key.c”和“main.c”代码。可使用HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数实现LED灯的闪烁操作。建立4个流水灯花式,分别是流水灯左循环、右循环、奇数和偶数灯分别闪烁、全部灯一起闪烁。通过移位操作,实现流水灯左循环与右循环。并且使用4个不同按键来进行不同花式的转换.(Led.c与key.c主要功能代码如下)
- LED灯点亮
void LED_ON(unsigned short int GPIO_Pin) { HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET); }
- LED灯熄灭
void LED_OFF(unsigned short int GPIO_Pin) { HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET); }
- LED灯状态翻转
void LED_Toggle(unsigned short int GPIO_Pin) { HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET); HAL_GPIO_TogglePin ( GPIOC,GPIO_Pin ); HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET); }
- LED灯左移
void left_loop(void) { LED_ON(led_l); HAL_Delay(100); LED_OFF(led_l); led_l<<=1; if(led_l==0) led_l=LED1_Pin; }
- LED灯右移
void right_loop(void) { LED_ON(led_r); HAL_Delay(100); led_r>>=1; if(led_r==0) led_r=LED8_Pin; LED_OFF(led_r<<1); }
- 按键辨别
unsigned char key_READ(void)
{
if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
{
value=1;
while(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
{
value=2;
while(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
{
value=3;
while(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
{
value=4;
while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
}
}
return value;
}
(8)编译代码,检查是否出现错误。若无错误,则下载代码,查看实现效果。
3.完整代码
- Led.h
#ifndef LED_H
#define LED_H
void LED_Init(void);
void LED_ON(unsigned short int GPIO_Pin);
void LED_OFF(unsigned short int GPIO_Pin);
void LED_Toggle(unsigned short int GPIO_Pin);
void left_loop(void);
void right_loop(void);
#endif
- key.h
#ifndef KEY_H
#define KEY_H
unsigned char key_READ(void);
#endif
- Led.c
#include "Led.h"
#include "gpio.h"
void LED_Init(void)
{
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET);
}
void LED_ON(unsigned short int GPIO_Pin)
{
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET);
}
void LED_OFF(unsigned short int GPIO_Pin)
{
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET);
}
void LED_Toggle(unsigned short int GPIO_Pin)
{
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_SET);
HAL_GPIO_TogglePin ( GPIOC,GPIO_Pin );
HAL_GPIO_WritePin(HC573_GPIO_Port, HC573_Pin, GPIO_PIN_RESET);
}
static uint16_t led_l = LED1_Pin;
void left_loop(void)
{
LED_ON(led_l);
HAL_Delay(100);
LED_OFF(led_l);
led_l<<=1;
if(led_l==0)
led_l=LED1_Pin;
}
static uint16_t led_r = LED8_Pin;
void right_loop(void)
{
LED_ON(led_r);
HAL_Delay(100);
led_r>>=1;
if(led_r==0)
led_r=LED8_Pin;
LED_OFF(led_r<<1);
}
- key.c
#include "key.h"
#include "main.h"
unsigned char value=0;
unsigned char key_READ(void)
{
if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
{
value=1;
while(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET)
{
value=2;
while(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET)
{
value=3;
while(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET)
{
value=4;
while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
}
}
return value;
}
- main.c
(1).h文件

(2)HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数验证

(3) 按键与四个LED灯花式
/* USER CODE BEGIN WHILE */
while (1)
{
switch(key_READ()){
/*Key query*/
case 1:
while(key_READ()==1)
left_loop();
break;
case 2:
while(key_READ()==2)
right_loop();
break;
case 3:
LED_ON(LED1_Pin|LED3_Pin|LED5_Pin|LED7_Pin);
LED_OFF(LED2_Pin|LED4_Pin|LED6_Pin|LED8_Pin);
HAL_Delay(100);
while(key_READ()==3)
{
/*flash half*/
LED_Toggle(LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin);
HAL_Delay(500);
}
break;
case 4:
while(key_READ()==4)
{
/*flash all*/
LED_Toggle(LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin);
HAL_Delay(300);
}
break;
}
/* USER CODE END WHILE */
四、实验效果
1.HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数验证
LED灯状态翻转
2.LED灯4个花式与按键控制
- 左循环(按键1控制)
LED灯左循环
- 右循环(按键2控制)
LED灯右循环
- 奇、偶号LED灯分别闪烁(按键3控制)
flash half
- 全部灯一起闪烁(按键4控制)
flash
五、总结
本次实验,成功调试验证LED灯、KEY例程,HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)函数也验证通过,并且4个流水灯花式以及按键查询四个流水灯花式都验证成功。
但该实验的逻辑程序还可再优化,使其更加简洁,使实验效果更加理想、流畅。
更多推荐



所有评论(0)