二、工程模板创建
1.器件包安装
1.1.前提条件
本Pack包适用于Keil V5.27及以上版本。
1.2.在线安装
打开keil5,点击Pack Installer,如图1-2-1所示。
点击Pack Installer按钮之后弹出界面,点击ok,如图1-2-2所示。
在Devices选项卡里找到GigaDevice选项,然后选中点开,如图1-2-3所示。
选择我们使用的芯片型号系列,因为我们使用的是GD32F407VET6,所以我们选择GD32F4xx Series,如图1-2-4所示。
选中之后,在右边一栏中Device Specific下拉菜单下可见 GigaDevice::GD32F4xx_DFP,点击右侧的Install按钮,即可在线下载GD32F4xx系列产品的Pack包,如图1-2-5所示。
在窗口最下面可见下载安装进度条,如图1-2-6所示。
此时Pack会在线下载到Keil5安装目录下(..\Keil_v5\GigaDevice),并完成安装。我们可以查看其目录,如图1-2-7所示。
1.3.离线安装
直接从官网下载器件包。
下载链接: http://www.gd32mcu.com/cn/download/7?kw=GD32F4
选择GD32F4XX AddOn,如图1-3-1所示。
下载完成之后进行解压,在GD32F4xx_AddOn_V2.2.0\Keil\Keil5目录下,有一个器件包,如图1-3-2所示。
双击这个进行安装,安装完成之后如图1-3-3所示。
2.标准固件库获取
标准固件库获取我们可以从官网进行下载。
下载链接:https://www.gd32mcu.com/cn/download?kw=gd32f4xx&lan=cn
找到GD32F4xx Firmware Library这个压缩包,如图2-1-1所示。
下载完成后,进行解压,解压后目录如图2-1-2所示。
3.标准固件库目录介绍
3.1.文件夹介绍
打开下载的GD32F4xx标准固件库,里面的目录如图3-1-1所示。
- Examples:此文件夹包含的是官方编写的示例代码,涉及芯片的大部分功能。
- Firmware:此文件夹里面有3个文件夹,包含CMSIS,标准外设库和USB库,存放官方封装的一些库函数,方便用户开发使用。
- Template:此文件夹是工程模板文件夹,里面包含IAR和Keil的工程示例。
- Utilities:此文件夹包含一些第三方组件和GD32配套的开发板文件。
3.2.Examples
打开Examples文件夹之后,内容如图3-2-1所示。
从上图中可以看出,这个文件夹里是各种外设资源的例程,每个文件夹里面还有更为详细的功能示例,对我们开发GD32芯片功能具有很高的参考价值。我们一定要多看,多读,多用。
3.3.Firmware
打开Firmware文件夹之后,内容如图3-3-1所示。
- CMSIS:微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是Cortex-M处理器系列的与供应商无关的硬件抽象层。
- GD32F4xx_standard_peripheral: 从名称也可以看出,这个是GD32F4系列的标准外设库,存放一些封装了寄存器的库函数,我们后面编程也是依赖于这个库进行开发。
- GD32F4xx_usb_library: 这个是GD32F4系列的USB库函数,可以帮助我们开发一些关于USB的应用,如鼠标,键盘,CDC串口,模拟U盘等等。
下面再分别对以上几个文件夹进行介绍: 各个文件的相关介绍如图3-3-2所示。
GD32F4xx_standard_peripheral目录结构:
这个里面都是一些外设库文件,覆盖GD32F4芯片的绝大部分功能,包含ADC,CAN,SDIO,SPI等等。
GD32F4xx_usb_library目录结构:
这里面的内容很多,有音频类,CDC类,DFU类,HID类等,我们暂时是用不到这些文件的,后面如果我们要开发USB设备,我们再来研究。
3.4.Template
各个文件的相关介绍如图3-4-1所示。
3.5.Utilities
这个是第三方组件文件夹,我们不必太关注。
4.创建固件库模板
推荐直接下载我们提供的工程模板,不需要担心工程配置错误。
工程下载
在下载中心
的入门手册资料百度网盘链接下载 软件资料
-> 空白工程
4.1.前提条件
- 已经安装好Keil软件
- 已经安装好GD32F4xx的Pack包
- 已经下载好GD32F4xx标准固件库
4.2.新建工程目录
新建文件夹,命令为Template,用来保存新创建的工程,如图4-2-1所示。
然后在该文件夹下新建6个文件夹,分别命名为:
- project: 存放工程文件(目前只支持MDK5)。
- libraries:存放各种库文件,CMSIS,芯片固件库,文件系统库,网络库等。
- board:存放和板子初始化和链接文件。
- app: 存放应用程序,由用户编写和放main函数。
- bsp:存放和底层相关的支持包。
- module:主要存放各种软件模块,比如软件定时器,PID,FIFO,状态机等。 文件目录如图4-2-2所示。
然后在project文件夹下新建一个文件夹:MDK(V5)
在Templa文件夹下新建一个README.md文件,如图所示。
4.3.拷贝工程文件
找到我们的固件库的下载目录,将GD32F4xx_Firmware_Library_V3.1.0\Firmware文件夹下的内容全部拷贝到新建目录的libraries下,如图4-3-1所示。
然后我们将board
和module
两个文件夹下载并且解压,拖到Template文件夹
中替换。
下载
board
和module
两个文件夹在下载中心
的入门手册资料(点击跳转🚀)百度网盘链接下载 软件资料
-> 空白工程
->ProjectTemplate.zip
里面,可以下载压缩包然后取出需要的文件。
4.4.新建Keil工程
在上面建立的project
文件夹里面创建一个MDK(V5)
文件夹用来存放keil MDK ARM V5
版本的工程文件。 打开Keil uVision5
创建一个新的工程: 单击->Project
->New uVision Project
->选好芯片型号GD32F407VE
。
4.7.创建分组并添加源文件
右键Target->单击Manage Project Items 如下所示设计分组(双击可以修改名字):
将\libraries\CMSIS\GD\GD32F4xx\Source\ARM
目录下的startup_gd32f407_427.s
(启动文件)添加到STARTUP组里(注意最后要点击对话框左下角的OK按钮才能生效)
启动文件使用汇编写的,他是上电或复位后执行的第一段代码:
- 设置堆栈大小和PC指针。
- 配置中断向量表:设置中断向量表的位置,这样当中断发生时,CPU能够找到相应的中断服务程序。
- 定义中断服务例程的默认处理函数:通常会定义一个默认的中断处理函数,当未定义特定的中断处理函数时,会调用这个默认函数。在某些启动文件中,都是了弱定义的中断处理函数,允许我们在其C代码中重定义。
- 系统时钟初始化。
- 跳转到c语言的main函数里面。
将\libraries\CMSIS\GD\GD32F4xx\Source\
目录下的system_gd32f4xx.c
添加到CMSIS组里面:
将\libraries\GD32F4xx_standard_peripheral\Source
目录下的所有文件添加到STD_Driver
组里面:
添加\board
目录下的board.c
文件到Board目录下去
接下来添加MODULE目录下的文件:
- 添加
\module\ringbuffer
目录下的ringbuffer.c
文件到MODULE目录下去如果是初学者可能是用不到的,如果想添加也可以添加,直接一步到位。
- 添加
\module\soft_timer
目录下的soft_timer.c
文件到MODULE目录下去
添加README.md
文件到DOC目录下去。(注意:文件类型一定要选择 All files 才可以看得到.md后缀的文件)
然后我们新建一个main.c 文件,添加到APP目录中。
4.8.添加头文件路径
继续补全头文件路径如下图所示:
4.10.配置工程
- 勾选
Create HEX File
- 添加全局宏定义
USE_STDPERIPH_DRIVER,GD32F407,__TARGET_FPU_VFP
WARNING
📌 __TARGET_FPU_VFP:开启浮点计算单元,能够高效率处理较为复杂的浮点运算。
- C语言使用C99标准,C++使用11标准
4.9.修改工程代码
立创梁山派天空星是板载了一个8M的高精度外部晶振的,我们设置使用外部晶振,将system_gd32f4xx.c
文件中的
/* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000)
#if defined (GD32F450) || defined (GD32F405) || defined (GD32F407) || defined (GD32F425) || defined (GD32F427)
#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000)
#endif
#if defined (GD32F470)
#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)
#endif
#define __SYSTEM_CLOCK_240M_PLL_IRC16M (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_8M_HXTAL (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
将上面的__SYSTEM_CLOCK_240M_PLL_IRC16M
注释掉,把__SYSTEM_CLOCK_168M_PLL_8M_HXTAL
解除注释,改成下面这样:
/* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000)
#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000)
#if defined (GD32F450) || defined (GD32F405) || defined (GD32F407) || defined (GD32F425) || defined (GD32F427)
#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000)
#endif
#if defined (GD32F470)
#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)
#endif
//#define __SYSTEM_CLOCK_240M_PLL_IRC16M (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_8M_HXTAL (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL (uint32_t)(240000000)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
然后把gd32f4xx.h文件中的 HXTAL_VALUE 的值从默认的25000000改为8000000,因为固件库默认的外部晶振是25M,而我们天空星开发板默认的外部高速晶振是8M。
4.11.编译
接下来我们将两个文件夹拖入到bsp文件夹中,这两个算是一直有用的文件了,一个是led的指示灯,一个是串口的代码。
下载
两个文件夹在下载中心
的入门手册资料(点击跳转🚀)百度网盘链接下载 软件资料
-> 空白工程
->ProjectTemplate.zip
里面,可以下载压缩包然后取出需要的文件。
然后将C文件添加到工程和添加头文件路径。
将main.c文件中写入下方代码:
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2023-11-02 LCKFB-yzh first version
*/
#include "board.h"
/*!
\brief main function
\param[] none
\param[] none
\retval none
*/
int main(void)
{
board_init();
bsp_led_init();
bsp_uart_init();
while (1)
{
bsp_led_toggle(LED1);
delay_ms(500);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
点击Rebuild按钮编译全工程,确保下方是 0 Error(s), 0 Warning(s)