目录
一、蓝桥杯概述
二、软件的使用
三、点亮LED
一、蓝桥杯概述
蓝桥杯是一个编程大赛、商赛,获奖率高达60%(省赛中一等奖10%、二等奖20%、三等奖30%),但这并不影响它的含金量,多所高校将它列为A类赛事并实行保研加分政策,在全国大学生竞赛含金量排行中也有较高的排名
近几年蓝桥杯开发了嵌入式和单片机赛道,经过我多方面的了解,我认为对电子信息类专业学生来说,这两个赛道均可以对我们的编程能力和专业能力带来不小的提高,所以我报名了蓝桥杯并在此记录我的学习过程。
新一届的蓝桥杯采用STM32G431的芯片,抛弃了库函数编程的方式,转为使用高级图形化编程软件cubeMX利用HAL库进行编程,这极大降低了STM32的自主编程难度。并且,STM32官方已经停止了标准库的更新,HAL在持续更新中,这也说明了在未来STM32的发展趋势。在我看来,标准库和HAL库都是必须要学的。
二、软件的使用
(1)软件方面,首先需要下载安装cubeMX
(2)打开后是以下界面,我们先新建一个工程用来进行图形化编程
(3)点击左上角的File > New Project
(4)接着,进入以下界面选择我们的芯片类型:STM32G431RB,并选择标注LQFP64的方形芯片,最后点击右上角Start Project正式开始编程
(5)进入如下界面后,先点击System Core > RCC时钟选项,如图步骤所示打开高速时钟设置
(6)再点击SYS >Debug ,选择串口通信方式
(7)接着按照下图步骤修改时钟参数,改成STM32G431官方手册上的参数即可,以下提供修改后的参数图
(8)然后按照下图步骤设置项目名称、项目代码使用的IDE,注意,名称中不要出现中文,使用MDK-ARM进行编程
(9)最后,按下图步骤选择每次都加载保留.c/.h文件,这样操作后可以简化以后的编程步骤,但是减慢程序的编译速度。选择完成后,点击右上角的GENERATE CODE,生成代码,点击Open Folder可以打开代码所在的文件夹
(10)打开代码后,点击左上角魔术棒
(11)按照下图步骤选择CMSIS-DAP的下载方式
(12)再按照下图所示选择下载后运行的方式即可
至此,cubeMX的软件使用方式已经记录完毕,接下来将学习记录点亮第一个LED
三、点亮LED
所谓的图形化编程,实际上就是可以通过cubeMX上芯片引脚的设置同步代码的编写,例如:在cubeMX上将芯片的PC8引脚设置为推挽输出模式,再点击生成代码,即可得到名为gpio.h的头文件,在编程时就不用自己再编写PC8引脚的初始化代码,包括时钟的初始化、输出模式的设置等,直接调用即可。
所以,当我们需要点亮一颗LED时,第一步就是打开cubeMX进行引脚的设置,如下图所示,选择GPIO选项后,点击右图芯片中需要使能的引脚,并设置为需要的模式,例如点亮LED时,根据官方手册,八个LED的引脚分别为PC8~PC15,并且设置了PD2为锁存器引脚,避免LCD显示屏和LED使用相同引脚时LED频闪,所以将PC8~PC15和PD2都设置为输出模式,即GPIO_Output
设置完引脚模式后,选中LED对应的引脚后设置为外接高电平,这表示当IO口内部设置为低电平时LED亮起
最后再点击右上角GENERATE CODE生成新代码
打开代码后新建两个文本并保存为led.h、led.c,并进行魔术棒添加路径等操作,具体操作就不过多记录,具体记录代码编写
打开led.h文件,如下编写代码:
//led.h
#ifndef _LED_H
#define _LED_H
#include "main.h"
void LED(uchar dsled);
#endif
其中,需要在"main.h"中添加宏定义uchar、uint如下:
//main.h
#define uchar unsigned char
#define uint unsigned int
注意,除自己创建的文本外,其他所有的代码需要写在注释中BEGIN和END之间,如下图所示
打开led.c文件,如下编写代码:
//led.c
#include "led.h"
void LED(uchar dsled)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //打开锁存器
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET); //灭掉所有的LED
HAL_GPIO_WritePin(GPIOC, dsled<<8, GPIO_PIN_RESET); //选择特定的LED亮起
}
其中,需要特别注意的是:
dsled<<8的含义是:将dsled代表的数字左移8位,原因是八个LED从PC8开始,有0-7八个空位
例如:令dsled = 0x01,即0000 0000 0000 0001,代表的是第一位为高电平,左移八位后为:0000 0001 0000 0000 ,代表的是第八位为高电平,即第一个led点亮。
打开主函数,在while循环中的BEGIN和END之间编写如下代码:
编写完成后,编译无误后进行下载
最后查看开发板效果即可