GD32单片机开发--GD32F4标准外设库

知不足而奋进 望远山而前行


目录

文章目录

前言

内容

开发文档获取

标准外设库获取

目录介绍

Firmware

CMSIS

GD32F4xx_standard_peripheral

项目模板搭建

前期准备

工程文件目录创建

固件库移植

程序入口移植

Keil工程创建

设备选择

keil分组创建

CMSIS分组添加

Firmware分组添加

程序代码修改

系统时钟修改

工程配置

配置系统时钟为168M

增加延时函数(可选)

问题及解决

兼容性升级

FCARM 文件类型配置错误

总结


前言

  1. 了解标准库来源
  2. 熟悉模板搭建流程
  3. 掌握在已有模板基础下进行开发

内容

开发文档获取

用户手册

兆易创新GigaDevice-资料下载兆易创新GD32 MCU

数据手册

兆易创新GigaDevice-资料下载兆易创新GD32 MCU

标准外设库获取

标准固件库获取我们可以从官网进行下载。

下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU

找到 GD32F4xx Firmware Library 这个压缩包

下载完成后,进行解压,解压后目录如图

目录介绍

打开下载的 GD32F4xx 标准固件库,里面的目录如图

  • Examples:此文件夹包含的是官方编写的示例代码,涉及芯片的大部分功能。
  • Firmware:此文件夹里面有 3 个文件夹,包含 CMSIS,标准外设库和 USB 库,存放官方封装的一些库函数,方便用户开发使用。
  • Template:此文件夹是工程模板文件夹,里面包含 IAR 和 Keil 的工程示例。
  • Utilities:此文件夹包含一些第三方组件和 GD32 配套的开发板文件。
Firmware

  • CMSIS:微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是Cortex-M 处理器系列的与供应商无关的硬件抽象层。规定了处理器内核与外设的接口,统一了内核访问外设寄存器的方法

POSIX(Portable Operating System Interface of UNIX),可移植操作系统接口,它定义了操作系统应该为应用程序提供的接口

  • GD32F4xx_standard_peripheral: 从名称也可以看出,这个是 GD32F4 系列的标准外设库,存放一些封装了寄存器的库函数,我们后面编程也是依赖于这个库进行开发。
  • GD32F4xx_usb_library: 这个是 GD32F4 系列的 USB 库函数,可以帮助我们开发一些关于 USB 的应用,如鼠标,键盘,CDC 串口,模拟 U 盘等等
CMSIS

内部主要是汇编代码,这个是直接和芯片进行交互的,每种不同的芯片需要配套不同的cmsis接口实现。

GD32F4xx_standard_peripheral

这个里面都是一些外设库文件,包含 GD32F4 芯片的绝大部分功能,包含 ADC,CAN,SDIO,SPI 等。

这个库是嫁接在cmsis的基础上的,F4系列不同的芯片可用公用这一套实现。

项目模板搭建

前期准备
  • 已经安装好 Keil 软件
  • 已经安装好 GD32F4xx 的 Pack 包
  • 已经下载好 GD32F4xx 标准固件库
工程文件目录创建
  • Project:放工程文件,编译文件等。
  • Firmware:放 ARM 内核文件,标准外设库文件等。
  • Hardware:放开发板的硬件驱动文件。
  • User:放 main 函数,gd32f4xx_it 文件,systick 文件。
  • Doc: 放 readme.txt 文件,工程说明文件。

固件库移植

找到我们的固件库的下载目录,将GD32F4xx_Firmware_Library_V3.x.x\GD32F4xx_Firmware_Library\Firmware 文件夹下的内容全部拷贝到新建目录的Firmware 下

程序入口移植

找到我们的固件库的下载目录,将GD32F4xx_Firmware_Library_V3.x.x\Template中的如下文件进行拷贝:

将文件拷贝到工程目录的User目录中

Keil工程创建

打开 keil,点击最上面的 Project 选项卡,选择 New uVision Project 选项新建一个工程

选择保存路径为我们刚才创建的文件夹下的 Project,文件名为 GD32F407,然后点击保存

设备选择

点击保存之后,弹出工程配置窗口,选择所需芯片,这里依次选择GigaDevice->GD32F4xx Series->GD32F407->GD32F407VE,然后点击 ok

确定所需芯片之后,弹出 RTE 的环境配置对话框,选择工程所需的组件,不用配置,点击取消

keil分组创建

我们的工程已经创建完成,但是可以看到工程里面还没有文件,我们可以创建一些分组和添加一些文件。

我们打开管理工程项去创建分组和添加文件

首先我们新建分组:

  • User
  • CMSIS
  • Firmware
  • Hardware
  • Doc

CMSIS分组添加

来到Firmware\CMSIS\GD\GD32F4xx\Source目录下,选择如下:

来到Firmware\CMSIS\GD\GD32F4xx\Source\ARM目录下,选择如下:

Firmware分组添加

来到Firmware\GD32F4xx_standard_peripheral\Source目录下,选择如下:

  • gd32f4xx_rcu.c
  • gd32f4xx_gpio.c
  • gd32f4xx_misc.c
程序代码修改

打开 main.c 文件,删除一些不必要的代码,剩余部分如图:

打开 gd32f4xx_it.c 文件,拉到最后面,然后删掉 Systick_Handler 下面的代码,剩余部分如图:

系统时钟修改
  1. 修改system_gd32f4xx.c系统时钟宏定义

打开system_gd32f4xx.c文件,放开如下内容行:

#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)

注释掉如下内容行

//#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL       (uint32_t)(240000000)

改后效果如下:

  1. 修改外部晶振频率

打开system_gd32f4xx.c依赖的头文件gd32f4xx.h, 注释掉原有外部高速晶振HXTAL_VALUE数值,添加新的一行,将晶振频率由25M修改为8M

#define HXTAL_VALUE    ((uint32_t)8000000)

改后效果如下:

工程配置
  1. Target配置

点击魔法棒,进入配置中的Target,选择ARM compiler 为V6

勾选Use MicroLIB

  1. Output配置

选择创建hex文件

  1. C/C++配置

    • Define配置为:USE_STDPERIPH_DRIVER,GD32F407
    • Warings选择AC5-like warnings
    • 选择c99c++03
    • Optimization选择-O1
  1. Include配置

添加如下几个目录:

  • User
  • Firmware\CMSIS\GD\GD32F4xx\Include
  • Firmware\CMSIS
  • Firmware\GD32F4xx_standard_peripheral\Include

配置系统时钟为168M

打开system_gd32f4xx.c文件

注释65行

//#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)

打开51行,选择168M主频,外接8M晶振

/* 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)

修改gd32f4xx.h文件中高速晶振定义(60行)

/* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined  (HXTAL_VALUE)
//#define HXTAL_VALUE    ((uint32_t)25000000)
#define HXTAL_VALUE    ((uint32_t)8000000)
#endif /* high speed crystal oscillator value */
增加延时函数(可选)

打开`systick.h文件,添加delay_1us(uint32_t count)函数,如下图:

打开systick.c文件,修改systick_config函数:

void systick_config(void)
{
    /* setup systick timer for 1000Hz interrupts */
    if(SysTick_Config(SystemCoreClock / 1000U)) {
        /* capture error */
        while(1) {
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
void systick_config(void)
{
    /* setup systick timer for 1000000Hz interrupts */
    if(SysTick_Config(SystemCoreClock / 1000000U)) {
        /* capture error */
        while(1) {
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

修改delay_1ms()函数:

void delay_1ms(uint32_t count)
{
    delay = count;

    while(0U != delay) {
    }
}
void delay_1ms(uint32_t count)
{
    delay = count * 1000;

    while(0U != delay) {
    }
}

增加delay_1us()函数:

void delay_1us(uint32_t count)
{
    delay = count;

    while(0U != delay) {
    }
}

完整代码如下:

/*!
    \file    systick.h
    \brief   the header file of systick

    \version 2016-08-15, V1.0.0, firmware for GD32F4xx
    \version 2018-12-12, V2.0.0, firmware for GD32F4xx
    \version 2020-09-30, V2.1.0, firmware for GD32F4xx
    \version 2022-03-09, V3.0.0, firmware for GD32F4xx
*/

/*
    Copyright (c) 2022, GigaDevice Semiconductor Inc.

    Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
       list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
       this list of conditions and the following disclaimer in the documentation
       and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of its contributors
       may be used to endorse or promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/

#ifndef SYS_TICK_H
#define SYS_TICK_H

#include <stdint.h>

/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);
/* delay decrement */
void delay_decrement(void);

void delay_1us(uint32_t count);

#endif /* SYS_TICK_H */
/*!
    \file    systick.c
    \brief   the systick configuration file

    \version 2016-08-15, V1.0.0, firmware for GD32F4xx
    \version 2018-12-12, V2.0.0, firmware for GD32F4xx
    \version 2020-09-30, V2.1.0, firmware for GD32F4xx
    \version 2022-03-09, V3.0.0, firmware for GD32F4xx
*/

/*
    Copyright (c) 2022, GigaDevice Semiconductor Inc.

    Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
       list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
       this list of conditions and the following disclaimer in the documentation
       and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of its contributors
       may be used to endorse or promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/

#include "gd32f4xx.h"
#include "systick.h"

volatile static uint32_t delay;

/*!
    \brief    configure systick
    \param[in]  none
    \param[out] none
    \retval     none
*/
void systick_config(void)
{
    /* setup systick timer for 1000000Hz interrupts */
    if(SysTick_Config(SystemCoreClock / 1000000U)) {
        /* capture error */
        while(1) {
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

/*!
    \brief    delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1ms(uint32_t count)
{
    delay = count * 1000;

    while(0U != delay) {
    }
}

/*!
    \brief    delay decrement
    \param[in]  none
    \param[out] none
    \retval     none
*/
void delay_decrement(void)
{
    if(0U != delay) {
        delay--;
    }
}

void delay_1us(uint32_t count)
{
    delay = count;

    while(0U != delay) {
    }
}

问题及解决

兼容性升级

很多芯片官网给出的示例代码是在Keil4老版本工具下创建的,如果使用的三方项目使用Keil4创建的工程,则需要根据官网建议,执行Keil5的兼容性提升操作:

Documentation – Arm Developer

依次点击:Project -> Manage -> Migrate to Version 5 Format.

报错类似下图:

对话框提示 Please update your device selection

FCARM 文件类型配置错误

FCARM - Output Name not specified, please check 'Options for Target -Utilities'

FCARM - Output Name not specified, please check ‘Options for Target - Utilities’

这个错误是由于新导入到工程内的文件,未被正确识别而引发的错误

解决:文件右键重新选择文件类型

这里的c文件可能会被误识别为Image file导致编译失败(看main.c前的图标和别的c文件都不同),这里选C Source file即可,如果是.s结尾的汇编文件,这里要选择Assembly language file

如果是汇编文件类型识别错误,也会报出类似如下错误:

修改成对应类型Assembly language file就行:


总结

POSIX(Portable Operating System Interface of UNIX),可移植操作系统接口,它定义了操作系统应该为应用程序提供的接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛慕昭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值