目录

一、实验目的

二、实验软硬件环境

三、项目实现

1. STM32CubeMX新建工程

2.Keil调试、下载代码

3.完整代码

四、实验效果

五、总结


一、实验目的

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”;

LED灯电路原理图
按键电路原理图

GPIO配置结果1
GPIO配置结果2

         (4)配置时钟树,配置结果如下;

        (5)设置“Project Manager”的相关参数,需设置工程名称、工程存放位置以及将Toolchain/IDE设置为MDK-ARM等。

        (6)点击“Generate Code”生成工程代码。

  1. 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个流水灯花式以及按键查询四个流水灯花式都验证成功。

        但该实验的逻辑程序还可再优化,使其更加简洁,使实验效果更加理想、流畅。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐