蓝桥杯电子类嵌入式(STM32G431)备赛学习记录之LED控制

写在前面

2023年2月10日,距离第十四届蓝桥杯正式比赛还有不到两个月的样子,从今天开始正式备赛。之前博主有看过野火的教程,学的是STM32F103。蓝桥杯嵌入式组现在用的是STM32G431,板子在二手平台上买的,视频参考b站up主01Studio相关教程(后面提到简写为教程)。学习的模块按照教程所列,其参考的资料是历年来真题中所考察的模块。

环境准备

关于Keil的安装,可以参考火哥的视频。STM32 CubeMx的安装参考Z小旋的博客。要注意的是学习过其他芯片的小伙伴(STM32 F1 F4等)得先去Keil官网下载G4的芯片包并安装。

01、LED操作

国际惯例,学习单片机先学点灯。这里有所不同的是在过程上,我们用到了STM32 CubeMX图形可视化编程。在备赛之前,博主按照火哥的视频,使用的是固件库编程。编程逻辑是根据原理图,开启相应时钟→初始化相关GPIO→完成相关功能程序。而Cube则是将前两步用图形化的方式代替,简化了整个过程提高效率。本质上都是一样的。
首先,打开Cube新建一个项目。

在索引栏搜索所学芯片STM32G431RB,选择与实物封装相同的第二个,点击Start Project。

开启时钟。HSE为外部高速时钟,LSE为外部低速时钟(E即外部,I反之)。高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。BYPASS Clock Source 是旁路时钟源(即选择有源晶振),Crystal/Ceramic Resonator 是选择无源晶振,这里可以参考hurryddd的博客以及kay880的博客。


配置时钟树。根据产品手册,外部晶振为24MHz。图中的标号顺序是从左到右进行选择,但是配置时钟树的正常逻辑应参考anbaixiu的博客,先设置后面的时钟频率大小(最大可到170,80设置为跟教程相同),再打开PLL。最后按下回车,Cube会自动完成时钟树配置。

命名工程文件,保存路径,生成模板代码。

开启时钟OK!
接下来初始化相应的GPIO口。打开刚刚创建的.ioc文件,根据芯片手册,led1-8分别连接的PC8-15以及锁存对应PD2。

在Cube中将这几个GPIO口设置为GPIO_Output,并将PC这8个IO口设置为高电平防止一上电就灯亮,PD2设置为低电平。


点击GENERATE CODE后,第二步初始化GPIO口完成!

在生成工程文件的路径下新建一个文件夹(这里命名为bsp)用于保存实相应功能的代码。在文件夹中分别创建一个.c和.h文件。打开工程,将文件夹添加进工程中。在led.c中包含.h文件,点击魔术棒将.h文件路径包含,然后编译。
现在,我们假设想要实现的功能是点亮led8。
led.c中代码包含:

#include "led.h"		//包含头文件

void Dis_LED(uchar Num_Led)		//定义点灯函数,传入的参数是选中哪些灯
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);		//先将所有灯熄灭
	HAL_GPIO_WritePin(GPIOC,Num_Led<<8,GPIO_PIN_RESET);		//因为只有PC8-15高8位有效,所以将传入参数左移八位
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);			//高电平锁存
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

这里要注意,uchar类型需要定义,在main.h中定义:

/* USER CODE BEGIN Includes */
#define uchar unsigned char 
#define uint  unsigned int 

/* USER CODE END Includes */

注意,用cube写的模板,在加代码时必须在/* USER CODE BEGIN Includes /和/ USER CODE END Includes */的中间,这就是cube的格式,否则如果将.ioc文件进行修改再生成代码后就会将我们加的代码覆盖。
led.h:

#ifndef _LED_H
#define _LED_H

#include "main.h"
void Dis_LED(uchar Num_Led);


#endif

main.c中包含过led.h后,加入:

  /* USER CODE BEGIN 2 */
  Dis_LED(0x00);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		Dis_LED(0x80);
		HAL_Delay(500);
		Dis_LED(0x00);
		HAL_Delay(500);
		
		
  }
  /* USER CODE END 3 */

编译后代码没有报错,点击魔术棒对下载和debug进行设置,在settings中勾选reset and run,以便于下载后不用自己按reset。


将程序下载后可以看到led8在闪烁!

物联沃分享整理
物联沃-IOTWORD物联网 » 蓝桥杯电子类嵌入式(STM32G431)备赛学习记录之LED控制

发表评论