keil新建基础工程(基于gd32f103)

目录

前言

一、资料下载

二、文件夹创建及文件移植

三、keil工程创建

四、代码编写

总结


前言

编辑本文旨在记录笔者嵌入式开发的学习过程,如有不足还望多多指点。

压缩包密码:your_k


一、资料下载

官方资料旨在说明如何获取资料,笔者资料里已包含本篇全部资料

获取步骤:打开上面网页链接后即可下载数据手册,官方例程等资料,如下图所示;

  • 笔者资料下载:百度网盘:链接:https://pan.baidu.com/s/12K2xrI1WF7GJHksAscoivw?pwd=wy7y 
    提取码:wy7y
                                 CSDN:

二、文件夹创建及文件移植

  1. 创建一个文件夹存放工程,格式如下:


    文件格式介绍:
    bsp:            板级支持包       ——   存放诸如USART、IIC、SPI等等驱动的文件夹;
    doc:            文档                  ——   芯片数据手册,开发板原理图等等文件;
    hardware:外设驱动           ——   w25q64存储芯片、aht20温湿度传感器等外设驱动文件;
    project:     keil工程            ——   keil等集成开发环境IDE工程存放;
    system:    芯片支持文件   ——    芯片启动文件、厂家的HAL库函数等;
    user:         主函数             ——     代码的主函数,main.c等文件;
     
  2. .c及.h文件的创建:
    bsp文件中新建:

    user文件下:

     
  3. 移植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工程创建

  1.  创建keil工程及相关配置
    打开keil新建工程

    选择路径后取个工程名

    选择芯片型号后点击OK

    取消

    然后回到工程文件夹中keil如下就是创建成功了:

     
  2. keil添加.c文件组及.h文件路径

    组命名与第一步创建的文件夹名一样即可(hal文件是system文件下GD32F10x_standard_peripheral中的,我一般喜欢命名为hal),如下图所示:

    所需添加的.c文件如下图所示(添加后的.c文件会在工程组中显示如下图)

    注:若添加的文件后缀不是.c命名的需要将文件类型更改一下,即可看到其他后缀的文件,如下图所示:

    至此.c文件添加完毕,接下来添加.h文件


    添加以下路径

四、代码编写

  1.  编写代码测试
    main.c

    #include "main.h"
    
    int main(void)
    {
        bsp_init();
    
        while (1)
        {
            bsp_gpio_toggle();
    		delay_ms(500);
        }
    
    }
    
    main.h
    #ifndef MAIN_H
    #define MAIN_H
    
    /* C库 函数 */
    #include <math.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    
    #include "bsp.h"
    
    #endif
    
    bsp.c
    #include "bsp.h"
    
    void bsp_init(void)
    {
        system_config();
        bsp_gpio_init();   /* PC13 */
    }
    
    bsp.h
    #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变化一次电平。


总结

至此工程创建完成,若有其他问题可评论区提出,若有何建议也可一并提出。
如若此文章对你有帮助,还望多多点赞支持!

  • 30
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值