创建GD32EmbeddedBuilder工作空间
我们在任意一个地方创建一个文件夹,名字随意,这里我设定为 VW553-WorkSpace
,创建在桌面。
创建工程
打开 GD32EmbeddedBuilder
工作空间选择我们的文件夹,这里我选择 VW553-WorkSpace
点击左上角的 【File】->【New】->【Porject...】
选择 C Project
设定名称为 VW553-Project-Template
,选择 RISC-V 项目
选择 VW553HMQ6
,然后点击 Finish
就创建成功了。
注意
工程创建完成之后,VW553-Project-Template
项目文件夹,就会被GD32EmbeddedBuilder
自动创建并保存到工作空间中,也就是我创建的VW553-WorkSpace
文件夹中。
BSP文件夹创建
我们右键项目的创建新的文件夹:BSP_Code
这个用来存放我们的模块代码
代码修改
这里我们不需要修改太多,这个创建的工程本身自己带有一些基础的代码
主要是添加和更正以下的功能:
- 添加
us
级别的延时函数 - 更正
LED
的引脚设定
打开 VW553-Project-Template\src\main.c
,修改 void led_spark(void)
为:
void led_spark(void)
{
static __IO uint32_t timingdelaylocal = 0U;
if(timingdelaylocal) {
if(timingdelaylocal < 500U) {
gd_eval_led_on(LED1);
} else {
gd_eval_led_off(LED1);
}
timingdelaylocal--;
} else {
timingdelaylocal = 1000U;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
打开 VW553-Project-Template\src\main.c
,修改 int main(void)
为:
int main(void)
{
#ifdef __FIRMWARE_VERSION_DEFINE
uint32_t fw_ver = 0;
#endif /* __FIRMWARE_VERSION_DEFINE */
/* configure systick */
systick_config();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
/* initilize the LEDs, USART and key */
gd_eval_led_init(LED1);
gd_eval_com_init(EVAL_COM0);
gd_eval_key_init(KEY_TAMPER_WAKEUP, KEY_MODE_GPIO);
#ifdef __FIRMWARE_VERSION_DEFINE
fw_ver = gd32vw55x_firmware_version_get();
/* print firmware version */
printf("\r\nGD32VW55X series firmware version: V%d.%d.%d", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8));
#endif /* __FIRMWARE_VERSION_DEFINE */
/* print out the clock frequency of system, AHB, APB1 and APB2 */
printf("\r\nCK_SYS is %d\r\n", rcu_clock_freq_get(CK_SYS));
printf("\r\nCK_AHB is %d\r\n", rcu_clock_freq_get(CK_AHB));
printf("\r\nCK_APB1 is %d\r\n", rcu_clock_freq_get(CK_APB1));
printf("\r\nCK_APB2 is %d\r\n", rcu_clock_freq_get(CK_APB2));
while(1) {
if(RESET == gd_eval_key_state_get(KEY_TAMPER_WAKEUP)) {
delay_1ms(50);
if(SET == gd_eval_key_state_get(KEY_TAMPER_WAKEUP)) {
gd_eval_led_toggle(LED1);
}
}
}
}
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
打开 VW553-Project-Template\inc\gd32vw553h_eval.h
,修改定义为:
因为我们的
LED
只有1
个,而且引脚是PC13
#define LED1_PIN GPIO_PIN_13
#define LED1_GPIO_PORT GPIOC
#define LED1_GPIO_CLK RCU_GPIOC
2
3
打开 VW553-Project-Template\inc\systick.h
,添加定义:
/* delay a time in microseconds */
void delay_1us(uint32_t count);
2
打开 VW553-Project-Template\src\systick.c
,添加函数:
/*!
\brief delay a time in microseconds
\param[in] count: count in microseconds
\param[out] none
\retval none
*/
void delay_1us(uint32_t count)
{
uint64_t ticks;
uint64_t told, tnow;
uint64_t tcnt = 0;
uint64_t reload = SysTimer_GetCompareValue(); // 获取比较值作为重载值
/* 获得延时经过的 tick 数 */
/* 注意:CPUTimer 时钟源是40MHz,是SystemCoreClock的1/4 */
ticks = (uint64_t)count * ((SystemCoreClock / 4) / 1000000);
/* 获取当前时间 */
told = (uint64_t)SysTimer->MTIMER;
while (1)
{
/* 循环获得当前时间,直到达到指定的时间后退出循环 */
tnow = (uint64_t)SysTimer->MTIMER;
if (tnow != told)
{
if (tnow < told)
{
/* 处理计数器回绕 */
tcnt += (reload - told) + tnow;
}
else
{
tcnt += tnow - told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
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
编译
我们点击编译,等待编译结果
烧录测试
可以看 【程序下载方式】🚀
烧录之后按下 RST
按钮之后,板子上的绿色LED
会以500ms
为状态周期,开始闪烁。