一、CMSIS
为了将所有Cortex-M芯片供应商产品的软件接口标准化,ARM公司发布了ARM Cortex-M 微控制器软件接口标准(Cortex Microcontroller Software Interface Standard,CMSIS)
CMSIS软件架构由4层构成:用户应用层、操作系统及中间件接口层、CMSIS层、硬件层
CMSIS层主要包括以下3层
(1)核内外设访问层(Core Peripheral Access Layer,CPAL):由ARM公司实现,包括命名定义、地址定义、存取内核寄存器和外围设备的协助函数,同时定义了一个与设备无关的RTOS内核接口函数
(2)中间件访问层(Middleware Access Layer,MWAL):ARM公司实现,芯片厂商负责更新,主要负责定义中间件访问的应用程序编程接口API(Application Programming Interface)函数,如TCP/IP协议栈、USB等协议
(3)设备外设访问层(Device Peripheral Access Layer,CPAL):芯片厂商实现,负责对硬件寄存器地址及外设接口进行定义,另外,还会对异常向量进行拓展
二、标准库
Libraries文件夹由CMSIS和STM32F10x_StdPeriph_Deiver组成
(1)core_3.c和core_3.h:访问核内外设访问层(CPAL),为采用Cortex-M3内核的芯片外设提供进入M3内核的接口
(2)stm32f10x.h:设备外设访问层(DPAL),包含了外设寄存器的定义、位定义、中断向量表、存储空间的地址映射
(3)system_stm32f10x.c和system_stm32f10x.h:设备外设访问层的源文件和头文件,包含了两个函数和一个全局变量。
函数SystemInit()用来初始化系统时钟,启动文件在完成复位后跳转到main()之前调用该函数
函数SystemCoreClock()用来更新系统时钟,当系统内核时钟变化后必须执行该函数进行更新
全局变量SystemCoreClock包含了内核时钟(HCLK),方便用户在程序中设置SysTick定时器和其他参数
(4)startup_stm32f10x_X.s:汇编语言实现的启动文件,上电复位后首先运行的一段汇编程序
作用:设置初始堆栈指针SP;设置程序计数器PC为复位向量,并在执行main()函数之前调用SystemInit()函数初始化系统时钟;设置向量表入口为异常事件的入口地址;复位后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈
(5)stm32f10x_ppp.c和stm32f10x_ppp.h:外设驱动文件
ppp表示任一外设的缩写
(6)misc.c和misc.h:提供了外设对内核中的嵌套向量中断控制器NVIC的访问函数
这些文件对应到CMSIS标准架构上,如图所示:
在使用标准库开发过程中,把位于CMSIS层的文件中添加到工程中不用修改,用户只需根据需要修改
工程架构如图所示:
注:
1.stm32f10x_it.c和stm32f10x_it.h:用来编写中断服务函数,其中已经定义了一些系统异常的接口,中断服务函数的接口(函数名)在启动文件中已经写好
2.stm32f10x_conf.h文件被包含进stm32f10x.h文件中,用来配置使用了哪些外设的头文件,用这个头文件可以方便的增加和删除外设驱动函数
三、配置环境
3.1 STM32标准工程配置
在工程中建立3个文件夹,分别为System、Libary、User
System:启动文件(startup_stm32f10x_md.s)、核内外设访问层文件(core_3.c和core_3.h)、设备外设访问层(system_stm32f10x.c和system_stm32f10x.h)以及外设寄存器描述文件(stm32f10x.h)
Libary:各个外设驱动的源文件和头文件
User:main.c、stm32f10x_it.c和stm32f10x_it.h、stm32f10x_conf.h
将上述文件添加到工程后,还需要点击魔法棒,设置C/C++选项,在Define选项卡中加入两个重要的宏,一个宏是USE_STDPERIPH_DRIVER(使用标准外设库,也可以在stm32f10x.h文件的末尾找到),另一个是STM32F10X_MD(指明CPU的容量)。之后,还要确定和工程有关的头文件的路径
至此,开发环境已经配置成功,可以进行对STM32F103C8T6芯片的开发
3.2 GD32标准工程配置
(1)新建APP、BSP、CMSIS、Libary文件夹
(2)将GD32F30x_Firmware_Library_V2.2.0\Template中的文件拷贝到新建的BSP文件夹中
将main.c、main.h文件拷贝到APP文件夹中
(3)将GD32F30x_Firmware_Library_V2.2.0\Firmware\CMSIS中的文件拷贝至CMSIS文件夹中
拷贝完成后,文件夹如下图所示:
(4)将标准库拷贝至Libary文件夹中
(5)将对应的文件添加到工程中
将上述文件添加到工程后,还需要点击魔法棒,设置C/C++选项,在Define选项卡中加入两个重要的宏,一个宏是USE_STDPERIPH_DRIVER(使用标准外设库,也可以在stm32f10x.h文件的末尾找到),另一个是GD32F30X_HD(指明CPU的容量)。之后,还要确定和工程有关的头文件的路径
测试程序:
#include "main.h"
int main(void)
{
/*开启GPIOC时钟*/
RCU_APB2EN |= RCU_APB2EN_PCEN;
/*引脚配置*/
GPIO_CTL1(GPIOC) |= GPIO_CTL1_MD13; //50MHz输出
GPIO_CTL1(GPIOC) &= ~GPIO_CTL1_CTL13; //推挽输出
/*输出低电平*/
GPIO_BOP(GPIOC) |= GPIO_BOP_CR13;
while (1)
{
}
}
将测试程序烧录至GD32单片机中,发现LED灯点亮,说明工程创建成功