STM32G431 LED实验教程详解

目录

一、实验目的

二、实验软硬件环境

三、项目实现

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

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

    作者:c_888888

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32G431 LED实验教程详解

    发表回复