文章目录
前言
为了避免不必要的bug,建议大家尽可能使用最新版的CubeMx6.10(ST官网下载,网址:https://www.st.com/zh/development-tools/stm32cubemx.html)且keil5的版本尽量用5.33及以上.
一.新建工程
1.用CubeMx生成初始化代码
打开CubeMx,新建项目.
在搜索框中输入关键词G431GBT6,选择STM32G431RBT6.
选好芯片后点击开始项目.
进入芯片所在页面后首先点击项目管理,然后给工程起个名字,选择工程存放的位置,编译工具链选择MDK,最小版本建议选择5.32.
然后点击Code Generator,选择复制所需文件(加快初始化代码生成速度),为每一外设生成一对.c/.h文件(工程管理需要).
然后回到芯片所在页面,选择System Core.
由于外部时钟的精度比内部时钟的精度遥遥领先,因此我们选择使用外部时钟。
既然打开了外部时钟,自然要配置一下时钟设置。参考官方的配置,我们选择将外部时钟调整为24MHZ,选择器选择HSE(打开外部时钟输入通道让我们选择的时钟能作为时钟源输入)和PLL(此处相当于一个倍频器),修改HCLK为80MHZ后敲回车让CubeMx帮我们把其他参数配置好.
这一切配置完成以后,点击生成代码即可。
2.工程文件夹中的配置
这里建议提前在MDK-ARM文件夹的同一级文件目录下新建一个bsp文件夹用于存放外设驱动程序,并在其中新建Inc(用于存放外设驱动的.h文件)和Src(用于存放外设驱动的.c文件)文件夹.
3.MDK工程文件中的配置(能完全绕过keil)
在keil中的做法是点击魔术棒,选择AC6编译器,把bsp的Inc文件夹包含进工程文件中.
绕过keil的做法是:
1.找到Cubemx生成的MDK工程文件,右键用VSCode打开.
2.配置编译器为AC6(显著提升编译效率).
3.设置ROM的起始位置与尺寸.
选择RVCT4是因为RVCT与keil界面中的内存对应关系如下图所示.我们要配置的是IROM1(当然IROM2也没问题).
起始地址0x8000000是因为参考手册82页中的标注.
尺寸选择0x20000是因为STM32G431RBT6中的B是128KB的意思.
4.设置RAM的起始地址与尺寸.
起始地址设置为0x20000000的原因是:
尺寸设置为0x8000的原因是:0x8000对应32KB.
5.将bsp的Inc纳入工程的头文件搜索路径.
找到<\IncludePath>,在它前面敲一个回车换行,然后输入;…/bsp/Inc
其中;是与前面内容的分割符.
4.用VSCode打开工程
VSCode中需先下载好EIDE插件.
下载好该插件后点击插件图标,选择导入项目(注:每次用CubeMx重新生成代码后,为了使得VSCode中的工作区代码与新生成的代码同步,都要再次导入项目).
进入对应的文件目录中选择目标文件后点击导入.
为方便工程文件管理,不要选择将工作区置于MDK-ARM目录下.
而是选择MDK-ARM文件夹所在的目录.
选择完毕后点击继续即可进入工作区.
这个时候回到资源管理器中会发现在对应的文件目录下生成了一个VSCode的工作区文件,关闭工程之后要重新打开工程,只需双击该文件即可.
双击打开工作区,点击EIDE插件图标,进入项目配置界面.
首先添加文件夹,从磁盘中选择刚刚新建好的bsp文件夹.
然后点击芯片支持包处的➕号,从磁盘中选择选手资料包中的器件支持包安上.
然后进一步确认是否为型号STM32G431RBTX的芯片支持包
接着点击构建配置,选择作为AC6编译器,同时别忘了右键编译器配置,填入AC6编译器所在路径(一般位于keil5中ARM中的ARMCLANG目录下).
然后点击RAM/FLASH中的编译按键.
检查RAM和ROM的相关地址设置是否如下图所示.
接下来是烧录器配置.
首先点击安装实用工具,选择OpenOCD,点击安装,安装成功后会×会变成√.
选择OpenOCD.
芯片配置中选择修改.
键入g4,选择stm32g4的cfg文件.
然后选择修改接口配置,选择dap-v1.
最后检查头文件包含目录中是否含有bsp文件夹中的Inc文件夹,若没有包含则点击➕进行添加。
至此,项目在VSCode工作区中的配置大功告成.
大家打开main.c文件后,可以点击编译和烧录试试效果.
注:如果烧录失败,则关掉板子上的电源,重新打开电源后,即可烧录;烧录时出现额外擦除的警告是正常的,不必理会.
5.在VSCode中调试
1.打开插件设置,选择将Axf转为Elf.
2.下载ARM-GNU-Toolchain(https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads)
图省事的可以走百度网盘:
链接:https://pan.baidu.com/s/1yqQrRm5EOrgXv3xvoB-fMw
提取码:hs8i
3.VSCode中安装Cortex-Debug插件.
4.打开Cortex-Debug插件配置.
在其中找到Arm Toolchain Path,填入下载好的Arm Toolchain的bin路径.
注意将路径的单反斜杠\改为双反斜杆\\
将单片机与电脑连接,上电,然后就可以开始调试啦.
点击调试图标,选择openocd,然后在对应的代码处打上短点,点击openocd旁绿色按键,启动调试.
在监视器中输入我们需要观测的变量名,即可开始观测变量变化.
这里我们选的变量是uwTick,它是当单片机上电后一直进行累加计算的一个变量,所以我们可以通过它知道相关代码的运行时间.
具体而言,每经过1ms,它的示数便增加1.
由于LED_Init()还未运行时其值为0,而到了LED_disp(0x00)时其值为354,可见LED_Init()操作用时354ms.
二、LCD工程移植
在选手资料包(从官方下载)中,官方提供了LCD例程.
选择HAL库版本的驱动文件打开.
打开其中的Inc和Src文件,把Inc中的fonts.h和lcd.h文件放入bsp中的Inc中,把Src中的lcd.c文件放入bsp中的Src中.
然后我们在main.c中便可以使用lcd.c中定义的函数了,如下图所示.
当然,别忘记包含lcd.h的头文件和进行lcd初始化
然后编译下载一气呵成,试试效果吧.
通过lcd.c中的函数控制显示屏显示
1.让屏幕处于就绪状态.
void LCD_Init(void);
2.刷新屏幕以对应颜色.
void LCD_Clear(u16 Color);
3.刷新某行以对应颜色.
void LCD_ClearLine(u8 Line);
4.刷新字符(串)背景色.
void LCD_SetBackColor(vu16 Color);
5.刷新字符(串)前景色.
void LCD_SetTextColor(vu16 Color);
6.以对应字符串刷新一整行.
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
7.以对应字符刷新某行局部.
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);