第7章 CMSIS架构与STM32标准外设库
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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的启动文件详解
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 ;堆空间结束地址
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。
嵌入式系统与应用
Embedded System Development
第7章 CMSIS架构与STM32标准外设库
–7.1 –7.2 –7.3 –7.4 CMSIS简介 C/C++项目建立与调试 CM7的启动文件解析 STM32标准外设库
7.1 CMSIS简介
为解决不同厂商的Cortex微控制器软件的兼容性问题,ARM 与芯片厂商制定了Cortex微控制器软件接口标准CMSIS (Cortex MicroController Software Interface Standard )。 是Cortex-M处理器系列的与供应商无关的硬件抽象层,可 以为处理器和外设实现一致且简单的软件接口。
STM32标准外设库
新建GPIO项目:STM32标准外设库文件必选项:
STM32标准外设库
1、STM32启动文件startup_stm32f10x_ld_vl.s,同时加 载的还有system_stm32f10x.c外设层访问系统的源文件, 主要对系统进行初始化。 与startup_ARMCMx.s启动文件是相似的,只不过实际芯片 对内存、外设等有了更多具体内容。 2、system_stm32f10x.c 文件提供了启动文件调用的两个 函数和一个全局变量:
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的启动文件详解
5、 Reset_Handler复位中断服务程序之后是虚设的其他 各个异常处理程序段,可根据需要自行修改。 各中断函数内把各个异常处理程序标号均声明全局、 外部可调用的。 所有的中断函数全部带有[weak]属性,即弱定义,如 果编译器发现在别处文件中定义了同名函数,在链接时用 别处的地址进行链接。 6、在最后对栈和堆进行了初始化。 启动文件到底什么作用? 主要进行堆、栈初始化,中断向量表以及中断函数定 义,复位中断处理函数Reset_Handler是唯一的实现、其 调用了SystemInit系统初始化函数、引导进入C/C++程序 的main函数。
7.4 STM32标准外设库
在8位单片机的程序开发中,是直接配置单片机外设的寄 存器来控制芯片的工作,如中断、定时器等。常常要查阅 手册,看实现某功能寄存器的某位该置1还是置0。这些都 是很琐碎的、机械的工作。幸好8位单片机较简单、资源 有限,可以通过直接配置寄存器的方式来开发。 STM32外设资源丰富,寄存器的数量多、设置复杂度高, 直接配置寄存器方式开发程序效率低。 STM32库是针对STM32提供的一个函数包,为开发者访问底 层硬件提供了一个中间API,使用库函数就可直接配置寄 存器、系统部件,无需深入掌握底层硬件细节,就可轻松 应用每一个外设。 STM32库涵盖了时钟、GPIO、定时器、CAN、I2C、SPI、 UART和ADC等的所有标准外设。
STM32标准外设库
3、stm32f10x.h头文件:外设寄存器的定义、位定义、中 断向量表、存储空间的地址映射等。 如同51单片机的<reg52.h>头文件一样,stm32f10x.h像一 个大表格,我们在使用的时候就是通过宏定义进行类似查 表的操作。 例:没有这个文件的话,怎样访问STM32的寄存器,有什 么缺点? –需要查手册来确定哪个地址对应哪个寄存器。 –地址易写错、可读性差、易出错、开发效率低。 新建项目选库时必选项:Framework,加载下2个库文件。 4、stm32f10x_conf.h,库配置文件,记录用到的外设库 文件。 5、misc.c,设置NVIC的函数库。
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中栈为满递减
SystemInit函数主要设置STM32的时钟系统:HSI, HSE,
LSI, LSE, PLL倍频因子, SYSCLK、 AHB/APBx预分频、 Flash设置等;
__main函数由编译器生成,负责初始化栈、堆等,并在
最后跳转到用户源程序的main()函数,来到C的世界。 SystemFrequncy,该值代表系统时钟频率。
C/C++项目建立与调试
第一步:新建工程,芯片选择,以Cortex M7核为例:
C/C++项目建立与调试
第二步,选择CMSIS的接口软件组件:CORE内核接口库、 DSP信号处理算法库(可选)、实时操作系统Keil RTX(可 选)、Device的Startup启动文件,编译时自动添加其他 用的库文件。
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; } }
7.2 C/C++项目建立与调试
当前的嵌入式应用程序开发,使用C/C++语言成了绝大部 分场合的最佳选择。 那么main函数成了理所当然的起点。 微控制器上电后,是如何寻找到并执行main函数的呢? 每一种微控制器都必须有启动文件(Bootloader),负责执 行微控制器从“复位”到“开始执行main函数”,这段时 间称为启动过程,进行所必须的工作。 芯片公司都提供了各种芯片的启动文件,开发人员可以方 便地引用启动文件直接进行C/C++应用程序的开发。 Cortex-M3规定,起始地址存放主堆栈指针初值,下一地 址存放复位中断服务程序入口地址即PC复位初值。 所以芯片复位后会自动取出复位中断入口向量给PC,执行 复位中断服务程序。
3、CMSIS的作用
CMSIS层起着承上启下的作用: –对硬件寄存器层进行统一实现、统一定义; –向上层的操作系统及中间件接口层和应用层提供接口 ,简化应用程序开发难度。 CMSIS可实现与处理器和外设之间的一致且简单的软件接 口,从而简化软件的重用,缩短微控制器开发人员新手的 学习过程,并缩短新设备的上市时间。 ARM公司提供的CMSIS组件函数库、芯片厂商提供的外设函 数库都是参照此标准设计的。 device HAL(Hardware Abstraction Layer 硬件抽象层) 芯片厂商的标准外设函数库。
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()函数!
C/C++项目建立与调试
第四步:编译、链接、调试类似于汇编程序。
注意:Project窗口加载的库文件
RTX_前缀的文件为Keil RTX实时操作 系统相关文件。 stdin.h 头文件是ANSI C 文件,独 立于处理器之外,类似熟知的C语言 头文件stdio.h文件。 core_前缀文件核内设备访问函数层 ,进入内核的接口。 ARMCM7.h定义寄存器地址、寄存器数 据结构、中断向量表。 system_ ARMCM7.c /.h 含两个函数 :系统初始化函数SystemInit、 __main 函数; startup_ARMCM7.s 系统启动文件。