打印

GD固件库介绍

[复制链接]
1220|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
danhong|  楼主 | 2021-1-18 15:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.1 GD32 官方标准固件库简介
GD公司为了方便用户开发程序,提供了一套丰富的GD32F4 固件库。这一节,我们将讲解 GD32 固件库相关的基础知识,后续章节会详细说明固件库的使用方法。

1.1.1 库开发与寄存器开发的关系
固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。
在 51 单片机的开发中我们通常的做法是直接操作寄存器,比如要控制P0口的某些 IO 口的状态,我们对寄存器做如下操作:
P0=0x11;
而在 GD32 的开发中,我们同样可以操作寄存器:
GPIO_BOP(gpio_periph) = (uint32_t)pin;    //这里是针对 GD32F4 系列
这种方法当然可以,但是这种方法的劣势是你需要掌握每个寄存器的用法才能正确使用GD32。为了方便客户开发,GD推出了官方固件库。固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用,大多数场合下,用户不需要知道操作的是哪个寄存器,只需要知道调用哪个函数即可。
比如上面的写 BOP寄存器实现电平控制,官方库封装了如下一个函数:
void gpio_bit_set(uint32_t gpio_periph, uint32_t pin)
{
    GPIO_BOP(gpio_periph) =(uint32_t)pin;
}
这个时候你不需要再直接去操作BOP 寄存器了,你只需要知道怎么使用 gpio_bit_set这个函数就可以了。在你对外设的工作原理有一定的了解之后,再去看固件库函数,基本上通过函数名就大概知道这个函数的功能,该怎么使用,这样开发是不是会方便很多?
任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,您如果想要把 GD32学透,光读 GD32 固件库是远远不够的。你还是要了解一下 GD32的原理,了解 GD32 各个外设的运行机制。只有了解了这些原理,你在进行固件库开发过程中才可能得心应手游刃有余。所以大家在学习库函数的同时,别忘了要了解一下寄存器大致配置过程。


1.1.2 GD32 固件库与 CMSIS 标准讲解
GD32F4 固件库就是函数的集合,那么对这些函数有什么要求呢?这里就涉及到一个 CMSIS 标准的基础知识。经常有人问到 GD32 和 ARM 以及 ARM7 是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,GD这样的公司,他们是芯片公司,根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 Cortex-M4 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。所以你会发现,不同公司设计的Cortex-M4 芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-M4 内核芯片的片上外设也会有很大的区别,比如GD32F407 和GD32F450,他们的片上外设就有很大的区别。
既然大家都使用的是 Cortex-M4 核,也就是说,本质上大家都是一样的,这样 ARM 公司为了能让不同的芯片公司生产的 Cortex-M4 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller SoftwareInterface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。GD 官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于 CMSIS 应用程序基本结构如下图 1.1.2.1:
图 1.1.2.1 基于 CMSIS 应用程序基本结构
CMSIS 分为 3 个基本功能层:
1) 核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
2) 中间件访问层:定义访问中间件的通用 API。由 ARM 提供,芯片厂商根据需要更新。
3) 外设访问层:定义硬件寄存器的地址以及外设的访问函数。
从图中可以看出, CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS 标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而 CMSIS 标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS 这套规范来设计。
一个简单的例子,我们在使用GD32 芯片的时候首先要进行系统初始化, CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公司写自己的库函数的时候就必须用SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化 ,以及函数名字规范化等等一系列规定。至于 CMSIS 的具体内容就不必多讲了,需要了解详细的朋友可以到网上搜索资料。


1.1.3 GD32F4 官方库包介绍
这一节内容主要讲解 GD 官方提供的 GD32F4 固件库包的结构。GD官方提供的固件库完整包可以在官方网站下载,固件库是不断完善升级的,所以有不同的版本,我们使用的是 V2.1.1 版本的固件库
解压即可。下面看看官方库包的目录结构,如下图1.1.3.1 和图1.1.3.2所示:
图 1.1.3.1 官方库包根目录
图 1.1.3.2 官方库目录列表
1.1.3.1 文件夹介绍:
Firmware 文件夹
包含有CMSIS ,GD32F4xx_standard_peripheral,GD32F4xx_usb_library 三个文件夹目录,这三个目录包含固件库所有的核心文件以及USB相关固件。CMSIS :存放的是符合 CMSIS 规范的一些文件。包括 GD32F4 核内外设访问层代码,DSP 软件库, RTOSAPI, 以及 GD32F4 片上外设访问层代码等。
GD32F4xx_standard_peripheral:包含GD32F4 标准外设固件库源码文件和对应的头文件。
GD32F4xx_usb_library :包含GD32F4 USB外设固件库源码文件和对应头文件
inc 目录存放的是 GD32f4xx_xxx.h 头文件,无需改动。
src 目录下面放的是 gd32f4xx_xxx.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应。这里的文件也是固件库外设的关键文件,每个外设对应一组文件。Examples 文件夹
下面GD官方提供的固件实例源码,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重要。
Template 文件夹
下面存放的是工程模板,包含了KEIL,IAR版本。
Utilities 文件夹
下就是官方评估板的一些对应源码,这个对于本手册学习可以忽略不看。

1.1.3.2关键文件介绍:  
在介绍一些关键文件之前,首先我们来看看一个基于固件库的GD32F4 工程需要哪些关键文件
core_cm4.h 文件:
位于\GD32F4xx_Firmware_Library\Firmware\CMSIS目录下面的,这个就是CMSIS 核心文件,提供进入 M4 内核接口,这是 ARM 公司提供,对所有CM4 内核的芯片都一样。你永远都不需要修改这个文件。
gd32f4xx.h 和 system_gd32f4xx.h 文件:
均位于\GD32F4xx_Firmware_Library_V2.1.1\Firmware\CMSIS\GD\GD32F4xx\Include
system_gd32f4xx.h 文件:
片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。与其对应的system_gd32f4xx.c文件,这个里面有一个非常重要的 SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。  gd32f4xx.h 文件:
GD32F4片上外设访问层头文件。这个文件里面主要是系统寄存器定义申明以及包装内存操作,同时该文件还包含了一些时钟相关的定义。
gd32f4xx_it.c,gd32f4xx_it.h文件:   
位于GD32F4xx_Firmware_Library_V2.1.1\Template ,gd32f4xx_it.c和 gd32f4xx_it.h 用来编写中断服务函数 ;
misc.c 和 misc.h 文件:
定义中断优先级分组
gd32f4xx_rcu.c 和 gd32f4xx_rcu.h 是与 RCC 相关的一些操作函数,作用主要是一些时钟的配置和使能。
gd32f4xx_xxx.c 和 gd32f4xx_xxx.h文件:
GD32F4 标准外设固件库对应的源文件和头文件。包括一些常用外设 GPIO,ADC,USART等。

实际上一个完整的 GD32F4 的工程光有上面这些文件还是不够的。还缺少非常关键的启动文件。
GD32F4 的启动文件存放在目录:
GD32F4xx_Firmware_Library_V2.1.1\Firmware\CMSIS\GD\GD32F4xx\Source\ARM下面对于不同型号的 GD32F4 系列对应的启动文件也不一样。我们的开发板是 GD32F450 系列所以选择的启动文件为startup_gd32f450.s。
启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main函数。
Reset_Handler 中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。Reset_handler在我们系统启动的时候会调用,我们看看Reset_handler 这段代码:
这段代码的作用是在系统复位之后引导进入main函数,同时在进入 main 函数之前,首先要调用 SystemInit 系统初始化函数。





460256005322c2189e.png (48.26 KB )

460256005322c2189e.png

使用特权

评论回复
沙发
liangshuang95| | 2021-1-19 23:09 | 只看该作者
讲解详细,支持一下。

使用特权

评论回复
板凳
清心飞扬| | 2021-1-21 11:05 | 只看该作者
正在学习中,支持一下!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝