第7章 CMSIS架构与STM32标准外设库
STM32固件库V3.3.0的CMSIS文件简析

1CMSIS标准ARM公司于2008年11月12日发布了ARM Cortex微控制器软件接口标准CMSIS 1.0。
CMSIS是独立于供应商的Cortex-M处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本,图4-1为近年来软件开发与硬件开发花费对比图。
因此,ARM与Atmel、IAR、KEIL、Luminary Micro、Micrium、NXP、SEGGER和ST等诸多芯片和软件工具厂商合作,将所有Cortex芯片厂商的产品的软件接口标准化,制定了CMSIS标准。
此举意在降低软件开发成本,尤其针对进行新设备项目开发或将已有的软件移植到其他芯片厂商提供的基于Cortex处理器的微控制器的情况。
有了该标准,芯片厂商就能够将他们的资源专注于对其产品的外设特性进行差异化,并且能够消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成本的目的。
如图1软件与硬件开发成本对比图CMSIS的现有标准是CMSIS 2.0,与之前的版本有了一些新的变化。
CMSIS 2.0标准包含Cortex-M0、Cortex-M3、Cortex-M4以及SVD(System View Description)这四部分。
目前,各芯片厂商也还没有都推出各自基于CMSIS标准的完整BSP包。
但未来的Cortex-M处理器应用将统一在CMSIS的标准之下是一个不可避免的趋势。
本节将以STM32F10x处理器为对象,介绍CMSIS 2.0标准的Cortex-M3部分。
4.1.1基于CMSIS标准的软件架构基于CMSIS 2.0标准的软件架构如图4-2所示。
与CMSIS 1.x版本相比,CMSIS 2.0去除了中间层,增加了一个可选的外设访问函数(Access Functions for Peripherals)。
stm32标准外设库详解

stm32标准外设库使用详解分类:stm32 2011-07-17 10:57 2233人阅读评论(11) 收藏举报转载请注明出处:/lbl1234下载代码stm32标准外设库是stm32全系列芯片的外设驱动,有了它可以大大加速我们开发stm32。
首先从st公司的网站下载最新的stm32标准外设库,写本文时最新的版本是V3.5.0。
解压该zip文件,得到如下文件夹和文件STM32F10x_StdPeriph_Lib_V3.5.0\_htmrescLibrariesProjectUtilitiesRelease_Notes.htmlstm32f10x_stdperiph_lib_um.chm其中Libraries包含库的源代码,Project包含stm32各个外设的使用范例和一个工程模板,Utilities是使用st公司评估板的例子,stm32f10x_stdperiph_lib_um.chm教我们怎么用标准外设库。
工程目录结构既然准备使用32位单片机,应该是个不小项目,因此工程目录也应该做个规划。
这里我推荐一下我所使用的目录结构。
假设工程名字叫template,建一个名为template的文件夹,该目录下有个3个固定文件夹doc,src,include,doc用来存放工程相关的资料文件,src放源代码,在src下每个功能模块一个文件夹,include放各个模块都要使用的公共头文件。
output放编译输出文件,内含两个子文件夹obj和list。
template\docsrcincludeoutput\obj\list整理库代码由于Libraries下的CMSIS文件夹中很多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程维护,实际上一个项目往往是用固定的编译器和芯片,因此有必要对库进行整理。
在src下建立libstm32目录1. 把Libraries\STM32F10x_StdPeriph_Driver\下的内容拷贝到libstm32目录下2. 在libstm32目录下建立cmsis文件夹,把Libraries\CMSIS\CM3\CoreSupport\下的core_cm3.c,core_cm3.h;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h拷贝到cmsis文件夹中。
STM32F4xx标准外设固件库

一、标准固件库简介本文下载的是STM32F4xx_DSP_StdPeriph_Lib_V1.5.0,其文件夹如下图所示:其中Project文件夹为各个开发环境(MDK-ARM、EWARM、TrueSTUDIO)的模板工程,Utilities文件夹为官方评估板的标准固件库应用例程,而真正的标准固件库在Libraries文件夹中。
在Libraries文件夹中:CMSIS文件夹主要包含于内核相关的文件;STM32F4xx_StdPeriph_Driver文件夹为STM32F4xx处理器外设相关的底层驱动。
以下为固件库移植时CMSIS文件夹中的重要源文件:core_cm4.h :内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置。
在CMSIS/Include中core_cmFunc.h :内核核心功能接口头文件。
在CMSIS/Include中core_cmInstr.h :包含一些内核核心专用指令。
在CMSIS/Include中core_cmSimd.h :包含与编译器相关的处理。
在CMSIS/Include中stm32f4xx.h :包含了stm32f4的寄存器结构体的定义(类似于c51的reg52.h)。
在CMSIS\Device\ST\STM32F4xx\Include中system_stm32f4xx.h :system_stm32f4xx.c的头文件。
在CMSIS\Device\ST\STM32F4xx\Include中system_stm32f4xx.c :stm32f4的系统时钟配置。
在CMSIS\Device\ST\STM32F4xx\Source\Templates中startup_stm32f40_41xxx.s:启动文件:设定SP的初始值;设置PC的初始值;设置中断向量表的地址;配置时钟;设置堆栈;调用main。
这个启动文件先调用system_stm32f4xx.c里面的systeminit()在调用main()之前。
STM32固件库详解

STM32固件库详解.blogs./emouse/archive/2011/11/29/2268441.html1.1 基于标准外设库的软件开发1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。
2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。
V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规X的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32固件库详解

STM32固件库详解最近考试较多,教材编写暂停了一下,之前写了很多,只是每一章都感觉不是特别完整,最近把其中的部分内容贴出来一下,欢迎指正。
本文内容基于我对固件库的理解,按照便于理解的顺序进行整理介绍,部分参考了固件库的说明,但是也基本上重新表述并按照我理解的顺序进行重新编写。
我的目的很简单,很多人写教程只是告诉你怎么做,不会告诉你为什么这么做,我就尽量吧前因后果都说清楚,这是我的出发点,水平所限,难免有很大的局限性,具体不足欢迎指正。
1.1 基于标准外设库的软件开发1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。
2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。
V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
STM32 3.5库文件中文说明

STM32库文件1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。
2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。
V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
STM32F4标准外设固件库文件关系图

1、文件夹介绍网上下载STM32F4xx_DSP_StdPeriph_Lib_V1.4.0,其中Libraries文件夹下面就是固件库相关程序文件。
包括CMSIS和STM32F4xx_StdPeriph_Driver 文件夹CMSISCMSIS文件夹存放的是符合CMSIS规范的一些文件。
STM32F4xx_StdPeriph_Driver存放的是STM32F4xx标准外设固件库源码文件和对应的头文件。
1)main主程序中引用:stm32f4xx.h 头文件。
stm32f4xx.h 是 STM32F4 片上外设访问层头文件。
非常重要。
2)stm32f4xx.h中引用:<stdint.h> 、system_stm32f4xx.h、core_cm4.h、stm32f4xx_conf.h3)system_stm32f4xx.h 是片上外设接入层系统头文件。
主要是申明设置系统及总线时钟相关的函数。
4)core_cm4.h 文件,这个就是 CMSIS 核心文件,提供进入 M4 内核接口,这是 ARM 公司提供,对所有CM4 内核的芯片都一样。
5)stm32f4xx_conf.h 是外设驱动配置文件。
包括misc.h、stm32f4xx_rcc.h和各种外设头文件stm32f4xx_ppp.h6)misc.c 和 misc.h 是定义中断优先级分组以及 Systick 定时器相关的函数。
7)stm32f3xx_rcc.c 和 stm32f4xx_rcc.h 是与 RCC 相关的一些操作函数,作用主要是一些时钟的配置和使能。
在任何一个 STM32 工程 RCC 相关的源文件和头文件是必须添加的。
8)对于文件 stm32f4xx_ppp.c 和 stm32f4xx_ppp.h,这就是 stm32F4 标准外设固件库对应的源文件和头文件。
包括一些常用外设 GPIO,ADC,USART 等。
9)文件 Application.c 实际就是说是应用层代码。
STM32固件库详解

STM32固件库详解1.1 基于标准外设库的软件开发1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
可以从ST的官方网站下载到各种版本的标准外设库,首先看一下3.4版本标准外设库的文件结构,如图5-3所示。
3.0以上版本的文件结构大致相同,每个版本可能略有调整。
标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。
Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CM7的启动文件详解
3、第3个数据段,定义中断向量表,复位后映射到地址0 AREA RESET, DATA, READONLY EXPORT __Vectors ;声明全局符号,表示中断向量表入口地址 EXPORT __Vectors_End; 表示向量表结束地址 EXPORT __Vectors_Size; 表示向量表大小 __Vectors DCD __initial_sp ;地址0x0,第0字,栈指针R13(MSP)初值 DCD Reset_Handler ;地址0x4,第1字,复位中断入口,PC初值 DCD NMI_Handler ;地址0x8,非屏蔽异常 … … __Vectors_End ; 中断向量结束处 __Vectors_Size EQU __Vectors_End - __Vectors;向量表长度
CM7的启动文件详解
2、第2个声明数据段,开辟堆(Heap)空间。 Heap_Size EQU 0x00000C00 ;定义常量,堆大小3K字节 AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;定义数据段,8字节对齐, __heap_base ;堆的空间基址 Heap_Mem SPACE Heap_Size ;开辟堆空间3k字节, 并用0填充 __heap_limit ;堆空间结束地址
STM32标准外设库
6、stm32f10x_rcc.c必选项,设置系统时钟相关函数的库 ;除了在SystemInit()函数中对时钟初始化。 标准外设库文件: 每个外设对应一个 .c 和 .h 文件。 stm32f10x_adc.c stm32f10x_gpio.c stm32f10x_bkp.c stm32f10x_i2c.c stm32f10x_can.c stm32f10x_iwdg.c stm32f10x_cec.c stm32f10x_pwr.c stm32f10x_crc.c stm32f10x_rcc.c stm32f10x_dac.c stm32f10x_rtc.c stm32f10x_dbgmcu.c stm32f10x_sdio.c stm32f10x_dma.c stm32f10x_spi.c stm32f10x_exti.c stm32f10x_tim.c stm32f10x_flash.c stm32f10x_usart.c stm32f10x_fsmc.c stm32f10x_iwdg.c
CM7的启动文件详解
4、第4个代码段, Reset_Handler复位中断服务程序 AREA |.text|, CODE, READONLY ; 只读代码段 Reset_Handler PROC;复位中断服务程序的入口 EXPORT Reset_Handler [WEAK] ;声明复位中断向量为全局、外部可调用 IMPORT SystemInit ;通知编译器要用的标号在其他文件 IMPORT __main ; c库中的标号,不是main函数 LDR R0, =SystemInit ;此处LDR是伪指令 BLX R0 ;跳到SystemInit,系统初始化 LDR R0, =__main ; BX R0 ;跳到c库中的__main, 链接、添加c库中的_mian代码,用来进行flash到RAM的存储 器映射,执行lib_init等c库的初始化工作,最后进入我们自 编源程序的mian()函数!
CM7的启动文件详解dler复位中断服务程序之后是虚设的其他 各个异常处理程序段,可根据需要自行修改。 各中断函数内把各个异常处理程序标号均声明全局、 外部可调用的。 所有的中断函数全部带有[weak]属性,即弱定义,如 果编译器发现在别处文件中定义了同名函数,在链接时用 别处的地址进行链接。 6、在最后对栈和堆进行了初始化。 启动文件到底什么作用? 主要进行堆、栈初始化,中断向量表以及中断函数定 义,复位中断处理函数Reset_Handler是唯一的实现、其 调用了SystemInit系统初始化函数、引导进入C/C++程序 的main函数。
STM32标准外设库
3、stm32f10x.h头文件:外设寄存器的定义、位定义、中 断向量表、存储空间的地址映射等。 如同51单片机的<reg52.h>头文件一样,stm32f10x.h像一 个大表格,我们在使用的时候就是通过宏定义进行类似查 表的操作。 例:没有这个文件的话,怎样访问STM32的寄存器,有什 么缺点? –需要查手册来确定哪个地址对应哪个寄存器。 –地址易写错、可读性差、易出错、开发效率低。 新建项目选库时必选项:Framework,加载下2个库文件。 4、stm32f10x_conf.h,库配置文件,记录用到的外设库 文件。 5、misc.c,设置NVIC的函数库。
1、基于CMSIS应用程序的架构
用户层
RTOS、中间件层
中间件
CMSIS层 MCU层
外设函数库
内核访问函数、外设寄存器与中断向量定义
2、CMSIS包含的主要组件:
CMSIS-CORE库: –访问内核及其设备、寄存器、内核外设函数,如ARM提 供core_cm3.h、 core_cm3.c等core_前缀的文件; –片上外设寄存器与中断定义,如由芯片生产商提供 device.h、system_device.c等文件; CMSIS-DSP库:包括向量运算、矩阵计算、复杂运算、筛 选函数、控制函数、PID 控制器、傅里叶变换和很多其他 常用的 DSP 算法。有C源代码允许修改。 CMSIS-RTOS API库:用于线程控制、资源和时间管理的实 时操作系统的标准化编程接口。 CMSIS-SVD库:系统视图描述 (SVD) 文件以基于格式化的 XML提供了外设信息和其他设备参数。 编译器+微控制器专用启动文件startup_device.s。
SystemInit函数主要设置STM32的时钟系统:HSI, HSE,
LSI, LSE, PLL倍频因子, SYSCLK、 AHB/APBx预分频、 Flash设置等;
__main函数由编译器生成,负责初始化栈、堆等,并在
最后跳转到用户源程序的main()函数,来到C的世界。 SystemFrequncy,该值代表系统时钟频率。
STM32标准外设库
新建GPIO项目:STM32标准外设库文件必选项:
STM32标准外设库
1、STM32启动文件startup_stm32f10x_ld_vl.s,同时加 载的还有system_stm32f10x.c外设层访问系统的源文件, 主要对系统进行初始化。 与startup_ARMCMx.s启动文件是相似的,只不过实际芯片 对内存、外设等有了更多具体内容。 2、system_stm32f10x.c 文件提供了启动文件调用的两个 函数和一个全局变量:
C/C++项目建立与调试
第一步:新建工程,芯片选择,以Cortex M7核为例:
C/C++项目建立与调试
第二步,选择CMSIS的接口软件组件:CORE内核接口库、 DSP信号处理算法库(可选)、实时操作系统Keil RTX(可 选)、Device的Startup启动文件,编译时自动添加其他 用的库文件。
7.3 CM7的启动文件解析
打开startup_ARMCM7.s启动文件,前面注释部分为版权信息 ,后面每段的作用: 1、第1个为数据段,用于开辟栈(Stack)空间。 Stack_Size EQU 0x00000400 ;定义常量,栈空间大小1KB AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定义一个数据段,8(2的3次方)字节对齐 Stack_Mem SPACE Stack_Size ;开辟栈大小1KB,并用0填充 __initial_sp ;标号,栈顶地址指针,CM3中栈为满递减
3、CMSIS的作用
CMSIS层起着承上启下的作用: –对硬件寄存器层进行统一实现、统一定义; –向上层的操作系统及中间件接口层和应用层提供接口 ,简化应用程序开发难度。 CMSIS可实现与处理器和外设之间的一致且简单的软件接 口,从而简化软件的重用,缩短微控制器开发人员新手的 学习过程,并缩短新设备的上市时间。 ARM公司提供的CMSIS组件函数库、芯片厂商提供的外设函 数库都是参照此标准设计的。 device HAL(Hardware Abstraction Layer 硬件抽象层) 芯片厂商的标准外设函数库。
7.4 STM32标准外设库
在8位单片机的程序开发中,是直接配置单片机外设的寄 存器来控制芯片的工作,如中断、定时器等。常常要查阅 手册,看实现某功能寄存器的某位该置1还是置0。这些都 是很琐碎的、机械的工作。幸好8位单片机较简单、资源 有限,可以通过直接配置寄存器的方式来开发。 STM32外设资源丰富,寄存器的数量多、设置复杂度高, 直接配置寄存器方式开发程序效率低。 STM32库是针对STM32提供的一个函数包,为开发者访问底 层硬件提供了一个中间API,使用库函数就可直接配置寄 存器、系统部件,无需深入掌握底层硬件细节,就可轻松 应用每一个外设。 STM32库涵盖了时钟、GPIO、定时器、CAN、I2C、SPI、 UART和ADC等的所有标准外设。
C/C++项目建立与调试
第三步:在Source Group 1中添加C语言源程序即可。 #define uint32 unsigned int #define N 10 uint32 sum; // 计算1+2+3+...+N的值。 int main(void) { uint32 i; sum = 0; for(i=0; i<=N; i++) { sum += i; } }
C/C++项目建立与调试