目录
前言
编辑本文旨在记录笔者嵌入式开发的学习过程,如有不足还望多多指点。
压缩包密码:your_k
一、资料下载
官方资料旨在说明如何获取资料,笔者资料里已包含本篇全部资料
获取步骤:打开上面网页链接后即可下载数据手册,官方例程等资料,如下图所示;
- 笔者资料下载:百度网盘:链接:https://pan.baidu.com/s/12K2xrI1WF7GJHksAscoivw?pwd=wy7y
提取码:wy7y
CSDN:
二、文件夹创建及文件移植
- 创建一个文件夹存放工程,格式如下:
文件格式介绍:
bsp: 板级支持包 —— 存放诸如USART、IIC、SPI等等驱动的文件夹;
doc: 文档 —— 芯片数据手册,开发板原理图等等文件;
hardware:外设驱动 —— w25q64存储芯片、aht20温湿度传感器等外设驱动文件;
project: keil工程 —— keil等集成开发环境IDE工程存放;
system: 芯片支持文件 —— 芯片启动文件、厂家的HAL库函数等;
user: 主函数 —— 代码的主函数,main.c等文件;
- .c及.h文件的创建:
bsp文件中新建:
user文件下:
- 移植system文件即gd32f103这款芯片的芯片支持文件:
首先移植CMSIS和GD32F10x_standard_peripheral文件进system路径为:GD32F10x_Demo_Suites_V2.2.0\GD32F10x_Firmware_Library\CMSIS
如下图所示:
然后将CMSIS文件中内容更改为以下文件:
相关文件路径如下:
gd32f10x.h + system_gd32f10x.h :GD32F10x_Demo_Suites_V2.2.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Include
startup_gd32f10x_md.s :
GD32F10x_Demo_Suites_V2.2.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Source\ARM
system_gd32f10x.c:GD32F10x_Demo_Suites_V2.2.0\GD32F10x_Firmware_Library\CMSIS\GD\GD32F10x\Source
gd32f10x_it.c + gd32f10x_it.h + gd32f10x_libopt.h
GD32F10x_Demo_Suites_V2.2.0\GD32103C_EVAL_Demo_Suites\Projects\01_GPIO_Running_LED
至此CMSIS文件移植完成,至于GD32F10x_standard_peripheral直接将其Include和Source文件夹里的文件移出来就行,如下:
三、keil工程创建
- 创建keil工程及相关配置
打开keil新建工程
选择路径后取个工程名
选择芯片型号后点击OK
取消
然后回到工程文件夹中keil如下就是创建成功了:
- keil添加.c文件组及.h文件路径
组命名与第一步创建的文件夹名一样即可(hal文件是system文件下GD32F10x_standard_peripheral中的,我一般喜欢命名为hal),如下图所示:
所需添加的.c文件如下图所示(添加后的.c文件会在工程组中显示如下图)
注:若添加的文件后缀不是.c命名的需要将文件类型更改一下,即可看到其他后缀的文件,如下图所示:
至此.c文件添加完毕,接下来添加.h文件
添加以下路径
四、代码编写
-
编写代码测试
main.c
main.h#include "main.h" int main(void) { bsp_init(); while (1) { bsp_gpio_toggle(); delay_ms(500); } }
bsp.c#ifndef MAIN_H #define MAIN_H /* C库 函数 */ #include <math.h> #include <stdio.h> #include <stdint.h> #include <string.h> #include "bsp.h" #endif
bsp.h#include "bsp.h" void bsp_init(void) { system_config(); bsp_gpio_init(); /* PC13 */ }
#ifndef BSP_H #define BSP_H #include <stdint.h> // c 库 #include "gd32f10x.h" // gd32 hal库 #include "bsp_system.h" // bsp 库 #include "bsp_gpio.h" void bsp_init(void); #endif
bsp_system.c
#include "bsp_system.h" volatile static uint32_t delay_count; void system_config(void) { nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4); // 设置系统中断优先级分组 if (SysTick_Config(SystemCoreClock / 1000U / 1000U)) // 设置系统定时器频率位 1000 000Hz 的中断,并判断是否成功 { /* 捕获错误,程序跑死 */ while (1) { } } NVIC_SetPriority(SysTick_IRQn, 0x00U); // 配置系统棒中断程序优先级 } void delay_sw_ns(uint32_t count) { uint32_t i, j; for (i = 0; i < count; i++) { // for (j = 0; j < SystemCoreClock / 10000000U / 2U; j++) for (j = 0; j < 16U; j++) ; } } void delay_us(uint32_t count) { delay_count = count; while (0U != delay_count) { } } void delay_ms(uint32_t count) { delay_count = count * 1000; /* ms 比 us 多延时1000倍 */ while (0U != delay_count) { } } void delay_decrement(void) { if (0U != delay_count) { delay_count--; /* 系统滴答中断中每次减一 */ } } void SysTick_Handler(void) { delay_decrement(); }
bsp_system.h
#ifndef BSP_SYSTEM_H #define BSP_SYSTEM_H #include "bsp.h" void delay_sw_ns(uint32_t count); void system_config(void); void delay_ms(uint32_t count); void delay_us(uint32_t count); #endif
bsp_gpio.c
#include "bsp_gpio.h" void bsp_gpio_init(void) { /* clk 配置 */ rcu_periph_clock_enable(LED_GPIO_CLK); /* gpio 配置 */ gpio_init(LED_GPIO_TYPE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_GPIO_PIN); gpio_bit_set(LED_GPIO_TYPE, LED_GPIO_PIN); } void bsp_gpio_on(void) { gpio_bit_reset(LED_GPIO_TYPE, LED_GPIO_PIN); } void bsp_gpio_off(void) { gpio_bit_set(LED_GPIO_TYPE, LED_GPIO_PIN); } void bsp_gpio_toggle(void) { if (gpio_output_bit_get(LED_GPIO_TYPE, LED_GPIO_PIN)) { gpio_bit_reset(LED_GPIO_TYPE, LED_GPIO_PIN); } else { gpio_bit_set(LED_GPIO_TYPE, LED_GPIO_PIN); } }
bsp_gpio.h
#ifndef BSP_GPIO_H #define BSP_GPIO_H #include "bsp.h" /* GPIO 定义 */ #define LED_GPIO_CLK RCU_GPIOC #define LED_GPIO_TYPE GPIOC #define LED_GPIO_PIN GPIO_PIN_13 void bsp_gpio_init(void); void bsp_gpio_on(void); void bsp_gpio_off(void); void bsp_gpio_toggle(void); #endif
由于我将延时函数的中断放在了bsp_system.c文件中所以gd32f10x_it.c文件需要删除此部分的中断函数,gd32f10x_it.c故应更改为(删除了不必要的注释,太长了)
#include "gd32f10x_it.h" #include "bsp.h" void NMI_Handler(void) { /* if NMI exception occurs, go to infinite loop */ while(1) { } } void HardFault_Handler(void) { /* if Hard Fault exception occurs, go to infinite loop */ while(1) { } } void MemManage_Handler(void) { /* if Memory Manage exception occurs, go to infinite loop */ while(1) { } } void BusFault_Handler(void) { /* if Bus Fault exception occurs, go to infinite loop */ while(1) { } } void UsageFault_Handler(void) { /* if Usage Fault exception occurs, go to infinite loop */ while(1) { } } void SVC_Handler(void) { /* if SVC exception occurs, go to infinite loop */ while(1) { } } void DebugMon_Handler(void) { /* if DebugMon exception occurs, go to infinite loop */ while(1) { } } void PendSV_Handler(void) { /* if PendSV exception occurs, go to infinite loop */ while(1) { } }
五、编译下载运行
点击build或直接F7按键
如果你是按照我上一篇博客安装的keil软件,没更改编译器版本则会如下报错:
../system/GD32F10x_standard_peripheral/gd32f10x_dac.c(35): warning: In file included from...
这是因为编译器版本不对,做以下更改就行。
后面点击OK,再编译一次即可。
若无其他报错即可下载运行,这里我的是jlink下载做以下设置即可
如此设置即可,然后一步步确认ok即可。
下载程序
效果:如果PC13引脚上接了led就会闪烁,或者用电压表测PC13引脚它会每隔500ms变化一次电平。
总结
至此工程创建完成,若有其他问题可评论区提出,若有何建议也可一并提出。
如若此文章对你有帮助,还望多多点赞支持!