目录

蓝桥杯电子类嵌入式STM32G431备赛学习记录一LED

蓝桥杯电子类嵌入式(STM32G431)备赛学习记录(一)——LED

写在前面

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

环境准备

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

01、LED操作

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

首先,打开Cube新建一个项目。

https://i-blog.csdnimg.cn/blog_migrate/92c0a68db6f99171f70b1630d7f3db2c.png

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

https://i-blog.csdnimg.cn/blog_migrate/05c104354887c39ee7b4efa4a9803fcd.png

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

https://i-blog.csdnimg.cn/blog_migrate/5538a408b244890b27b6c29b5f9db144.png

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

https://i-blog.csdnimg.cn/blog_migrate/66a3fcb2bfbb5e1308f0bb8fe7ffa40b.png https://i-blog.csdnimg.cn/blog_migrate/68e76af1bfb9a63a57bf530288d0bbc8.png

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

https://i-blog.csdnimg.cn/blog_migrate/a33b650a015c76d0ad76549c668d6ee4.png

开启时钟OK!

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

https://i-blog.csdnimg.cn/blog_migrate/f67122c60a21cba539237e67cc376e17.png

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

https://i-blog.csdnimg.cn/blog_migrate/5768cf0a79bac5c83b83e90908aa4a18.png

https://i-blog.csdnimg.cn/blog_migrate/c44bc6cab7410af491a881e174d954a3.png

在生成工程文件的路径下新建一个文件夹(这里命名为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。

https://i-blog.csdnimg.cn/blog_migrate/0e94fad192cf78b8acd40e1292dfab70.png

https://i-blog.csdnimg.cn/blog_migrate/8ab087674f8ebb35177e47459f4e2ddd.png

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