二、工程模板创建
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所示。
选择我们使用的芯片型号系列,因为我们使用的是GD32E230C8T6,所以我们选择GD32E23x Series,如图1-2-4所示。
选中之后,在右边一栏中Device Specific下拉菜单下可见 GigaDevice::GD32E23x_DFP,点击右侧的Install按钮,即可在线下载GD32E23x系列产品的Pack包,如图1-2-5所示。
在窗口最下面可见下载安装进度条,如图1-2-6所示。
此时Pack会在线下载到Keil5安装目录,并完成安装。
1.3.离线安装
直接从官网下载器件包。
官网下载链接: https://www.gd32mcu.com/cn/download?kw=GD32E23&lan=cn
选择GD32E23x AddOn,如图1-3-1所示。
下载完成之后进行解压,在GD32E23x_AddOn_V1.2.0的文件夹里,有一个器件包,如图1-3-2所示。
双击后缀为.pack进行安装,安装完成之后如图1-3-3所示。
2.标准固件库获取
标准固件库获取我们可以从官网进行下载。
下载链接:https://www.gd32mcu.com/cn/download?kw=GD32E23&lan=cn
找到GD32E23x Firmware Library这个压缩包,如图2-1-1所示。
下载完成后,进行解压,解压后目录如图2-1-2所示。
3.标准固件库目录介绍
3.1.文件夹介绍
打开下载的GD32E23x标准固件库,里面的目录如图3-1-1所示。
- Examples:此文件夹包含的是官方编写的示例代码,涉及芯片的大部分功能。
- Firmware:此文件夹里面有3个文件夹,包含CMSIS,标准外设库和USB库,存放官方封装的一些库函数,方便用户开发使用。
- Template:此文件夹是工程模板文件夹,里面包含IAR和Keil的工程示例。
- Utilities:此文件夹包含一些第三方组件和GD32配套的开发板文件。
- Docs: 此文件夹是改固件库的相关文档。
3.2.Examples
打开Examples文件夹之后,内容如图3-2-1所示。
从上图中可以看出,这个文件夹里是各种外设资源的例程,每个文件夹里面还有更为详细的功能示例,对我们开发GD32芯片功能具有很高的参考值我们一定要多看,多读,多用。
3.3.Firmware
打开Firmware文件夹之后,内容如图3-3-1所示。
- CMSIS:微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是Cortex-M处理器系列的与供应商无关的硬件抽象层。
- GD32E23x_standard_peripheral: 从名称也可以看出,这个是GD32E23系列的标准外设库,存放一些封装了寄存器的库函数,我们后面编程也是依赖于这个库进行开发。
GD32E23xx_standard_peripheral目录结构: 这个里面都是一些外设库文件,覆盖GD32E23芯片的绝大部分功能,包含ADC,CAN,SDIO,SPI等等。
3.4.Template
工程模板文件夹
3.5.Utilities
这个是第三方组件文件夹,我们不必太关注。
4.创建固件库模板
推荐使用已经创建好的工程模板文件,工程已经配置好了。
通过网盘分享的文件:LCKFB_GD32E230C8T6_BlankProject_2V.zip
链接: https://pan.baidu.com/s/1-ws-fW-2AjO4MgKGyOTr2A?pwd=lckf 提取码: lckf
4.1.前提条件
- 已经安装好Keil软件
- 已经安装好GD32E23x的Pack包
- 已经下载好GD32E23x标准固件库
注意:绝对不要存放在中文路径下。
图片中也仅仅只是显示为 “ 用户 ” 中文!!!实际文件路径依旧是C:/Users
桌面也同理。
这是Win10设定的。
4.2.新建工程目录
新建文件夹,命令为Template,用来保存新创建的工程,如图4-2-1所示。
然后在该文件夹下新建6个文件夹,分别命名为:
- Project:放工程文件,编译文件等。
- Firmware:放ARM内核文件,标准外设库文件等。
- Hardware:放开发板的硬件驱动文件。
- App: 放应用层文件。
- User:放main函数,gd32e23x_it文件,systick文件。
- Doc: 放readme.txt文件,工程说明文件。 文件目录如图4-2-2所示。
4.3.拷贝工程文件
找到我们的固件库的下载目录,将GD32E23x_Firmware_Library_V1.2.0\Firmware文件夹下的内容全部拷贝到新建目录的Firmware下,如4-3-1所示。
在Hardware下新建LED文件夹,为我们以后点灯做准备,如图4-3-2所示。
将\GD32E23x_Firmware_Library_V1.2.0\Template文件夹的除工程文件夹、readme.txt文件不拷贝之外全拷贝到新建的User文件夹下,如4-3-3所示。
在Doc文件夹下新建一个readme.txt文件,如图4-3-4所示。
4.4.新建Keil工程
打开keil,点击最上面的Project选项卡,选择New uVision Project选项新建一个工程,如图4-4-1所示。
选择保存路径为我们刚才创建的文件夹下的Project,文件名为GD32E230C8T6,然后点击保存,如图4-4-2所示。
4.5.器件选择
点击保存之后,弹出工程配置窗口,选择所需芯片,这里依次选择GigaDevice->GD32E23x Series->GD32E230->GD32E230C8,然后点击ok,如图4-5-1所示。
4.6.组件选择
确定所需芯片之后,弹出RTE的环境配置对话框,选择工程所需的组件,不用配置点击取消,如图4-6-1所示。
4.7.创建分组并添加源文件
这时我们的工程已经创建完成,但是可以看到工程里面还没有文件,我们可以创建一些分组和添加一些文件。我们打开管理工程项去创建分组和添加文件,如图4-7-1所示。
双击 Source Group 1 进行改名,将名称改为User。
我们选中User分组之后点击Add Files就可以添加文件,如图4-7-3所示。
再添加以下文件(这些文件在Template的User目录下)。
- gd32e23x_it.c
- main.c
- systick.c 添加文件如图4-7-4所示。
创建Firmware分组,然后添加标准外设库文件,需要用到的时候再添加,也可以全部添加(编译速度慢)。必须添加的是rcu这个外设库,这个是和时钟相关的,这里我们选择全部添加(在新建工程的Firmware/GD32E23x_standard_peripheral/Source/目录下),如图4-7-5所示。
新建分组:
在框内输入新建的分组名字,这里是Firmware。
然后我们点击Add Files添加C文件到工程
新建CMSIS分组,添加startup_gd32e23x.s启动文件(新建工程的Firmware/CMSIS/GD/GD32E23x/Source/ARM/),和system_gd32e23x.c文件(新建工程的Firmware/CMSIS/GD/GD32E23x/Source/),注意,添加启动文件需要勾选文件类型为All files(*.),因为启动文件是以.s结尾。如图4-7-6所示。
新建Doc分组,然后添加readme.txt文件(新建工程的Doc/),文件类型要选择All files,不然会不显示,如图4-7-7所示。
新建Hardware分组,暂时先不添加任何文件。 新建App分组,暂时不添加任何文件。 全部新建分组完成,如图4-7-8所示。
新建完成点击ok之后,工程目录如图4-7-9所示。
4.8.修改工程代码
打开main.c文件,将里面的代码换成下方的代码,如图4-8-1所示。
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
int main(void)
{
while(1)
{
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
4.9.添加宏和头文件路径
添加宏是为了去使能这个芯片的头文件,这个宏在gd32e23x.h中有定义,添加头文件路径是为了使编译器能够去寻找到对应的头文件。
添加宏:
点击Options for target,如图4-9-1所示。
选择c/c++选项卡,如图4-9-2所示。
在Define下填写 GD32E230 然后将三个选项改为 图4-9-3 的样式。 如图4-9-3所示。
添加头文件路径: 还是刚才那个选项卡,点击Include Paths后面的三个小点,如图4-9-4所示。
点击New按钮进行添加一条路径,如图4-9-5所示。
点击后面三个小点进行路径选择,如图4-9-6所示。
依次选择
- 新建工程的User目录
- 新建工程的Firmware\CMSIS目录
- 新建工程的Firmware\CMSIS\GD\GD32E23x\Include目录
- 新建工程的Firmware\GD32E23x_standard_peripheral\Include目录
添加完成之后,如图4-9-7所示。
4.10.配置工程
勾选使用Use MicroLIB
这是一个Keil自带的简易的库,一般在串口进行重定向的时候使用。 点击Options for target,在target选项卡下,然后勾选Use MicroLIB,如图4-10-1所示。
勾选生成hex文件
Hex文件是编译的十六进制的文件,可以通过串口或者DFU直接下载到开发板中。
点击Options for target,在Output选项卡下,勾选Create HEX File,如图4-10-2所示。
4.11.修改systick文件
打开gd32e23x_it.c文件,拉到最后面,然后删掉Systick_Handler下面的代码。剩余部分如图4-8-2所示。
然后我们打开systick.c文件将里面的代码替换为:
#include "gd32e23x.h"
#include "systick.h"
volatile static float count_1us = 0;
volatile static float count_1ms = 0;
/*!
\brief configure systick
\param[in] none
\param[out] none
\retval none
*/
void systick_config(void)
{
/* systick clock source is from HCLK/8 */
systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
count_1us = (float)SystemCoreClock/8000000;
count_1ms = (float)count_1us * 1000;
}
/*!
\brief delay a time in microseconds in polling mode
\param[in] count: count in microseconds
\param[out] none
\retval none
*/
void delay_1us(uint32_t count)
{
uint32_t ctl;
/* reload the count value */
SysTick->LOAD = (uint32_t)(count * count_1us);
/* clear the current count value */
SysTick->VAL = 0x0000U;
/* enable the systick timer */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
/* wait for the COUNTFLAG flag set */
do{
ctl = SysTick->CTRL;
}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
/* disable the systick timer */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
/* clear the current count value */
SysTick->VAL = 0x0000U;
}
void delay_us(uint32_t count)
{
uint32_t ctl;
/* reload the count value */
SysTick->LOAD = (uint32_t)(count * count_1us);
/* clear the current count value */
SysTick->VAL = 0x0000U;
/* enable the systick timer */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
/* wait for the COUNTFLAG flag set */
do{
ctl = SysTick->CTRL;
}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
/* disable the systick timer */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
/* clear the current count value */
SysTick->VAL = 0x0000U;
}
/*!
\brief delay a time in milliseconds in polling mode
\param[in] count: count in milliseconds
\param[out] none
\retval none
*/
void delay_1ms(uint32_t count)
{
uint32_t ctl;
/* reload the count value */
SysTick->LOAD = (uint32_t)(count * count_1ms);
/* clear the current count value */
SysTick->VAL = 0x0000U;
/* enable the systick timer */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
/* wait for the COUNTFLAG flag set */
do{
ctl = SysTick->CTRL;
}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
/* disable the systick timer */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
/* clear the current count value */
SysTick->VAL = 0x0000U;
}
void delay_ms(uint32_t count)
{
uint32_t ctl;
/* reload the count value */
SysTick->LOAD = (uint32_t)(count * count_1ms);
/* clear the current count value */
SysTick->VAL = 0x0000U;
/* enable the systick timer */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
/* wait for the COUNTFLAG flag set */
do{
ctl = SysTick->CTRL;
}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
/* disable the systick timer */
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
/* clear the current count value */
SysTick->VAL = 0x0000U;
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
我们在#include "systick.h" 这个语句上面,鼠标右键,点击第二个选项。
我们就打开了 systick.h 文件 接下来我们将h文件中的代码替换为下面的代码。
#ifndef SYS_TICK_H
#define SYS_TICK_H
#include <stdint.h>
/* function declarations */
/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);
/* delay a time in milliseconds */
void delay_ms(uint32_t count);
/* delay a time in microseconds */
void delay_1us(uint32_t count);
/* delay a time in microseconds */
void delay_us(uint32_t count);
#endif /* SYS_TICK_H */
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
接下来还有一个步骤
4.12.编译
一切配置好之后,就可以进行编译了。 我们点击编译 ( 第一次可能有些久,请耐心等待!)
编译结果如图4-11-2所示。
可以看到0个错误,0个警告,至此,工程模板创建完成。