(4.1)--《嵌入式系统原理及设计》第4章.pdf





《(4.1)--《嵌入式系统原理及设计》第4章.pdf》由会员分享,可在线阅读,更多相关《(4.1)--《嵌入式系统原理及设计》第4章.pdf(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、62 嵌入式系统原理及设计 第 4 章 STM32 库函数及程序开发 讲解STM32库函数以及开发环境,主要包括:STM32库函数、STM32芯片开发环境介绍以及程序开发下载方面的知识。4.1 STM32 固件库 在以前传统的单片机例如 51 微控制器,程序开发通过直接配置微控制器,通过查询寄存器表,看要用到哪些配置位,这些都是很琐碎和机械的工作,相对于简单微控制器例如 51等寄存器数量少又很简单,可以通过直接配置寄存器的方式来开发。但 STM32 单片机由于功能强到灵活,例如有关 GPIO 的配置寄存器就有十几个,如果去查询寄存器手册开发就很不方便。因此 ST 公司针对 STM32 提供函数
2、接口,即 API(Application Program Interface),开发者可通过调用这些函数接口来配置 STM32 的寄存器,使得开发人员可以脱离最底层的寄存器操作,有开发快速、易于阅读和维护成本低等优点。图 4.1 库函数和寄存器方式对比 4.1.1 STM32 库结构 ST 公司 2007 年 10 月发布了 V1.0 版本的固件库,MDK ARM3.22 之前的版本均支持该库。2008 年 6 月发布了 V2.0 版的固件库,从 2008 年 9 月推出的 MDK ARM3.23 版本至今均使用 V2.0 版本的固件库。V3.0 以后的版本相对之前的版本改动较大,本书使用目前
3、较新的V3.5 版本,STM32 的 3.5 版本库函数可以直接从官方网站下载得到。解压缩库文件进入其目录:STM32F10 x_StdPeriph_Lib_V3.5.0 63 第 4 章 STM32 库函数及程序开发 各文件夹内容:图 4.2 STM32 固件库目录(1)Libraries 文件夹下是驱动库的源代码和启动文件,内部又分 2 个文件夹,如下图:图 4.3 Libraries 文件夹 由于 STM32 采用的 Cortex-M3 内核,Cortex-M3 内核是 ARM 公司提出的,区别主要是核外的片上外设的差异,这些差异会导致软件在同内核、不同外设的芯片上移植困难。为了解决不同
4、芯片厂商生产的 Cortex 微控制器软件的兼容性问题,ARM 与芯片厂商建立了CMSIS 标准。CMSIS 标准实际就是新建了一个软件抽象层,如图 4.4。CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件移植有极大的好处,STM32 固件库就是按照 CMSIS 标准建立的。CMSIS 标准中最主要的是 CMSIS 核心层,包括:内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由 ARM 公司提供。设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提
5、供。64 嵌入式系统原理及设计 用户代码用户代码CortexCortex内核内核SysTickSysTick实实时系统内时系统内核时钟核时钟NVICNVIC中断中断控制器控制器调试跟踪调试跟踪模块模块其它外设其它外设CMSISCMSIS-DSPDSPDSPDSP固件库固件库CMSISCMSIS实时实时实时系统内核实时系统内核设备外设函数设备外设函数(如如STMSTM3232驱动函数库驱动函数库)SIMDSIMDCortexCortex-M M4 4外设寄存器定义外设寄存器定义&中断向量定义中断向量定义核内外设函数核内外设函数用用户户层层CMSISCMSIS层层MCUMCU 图 4.4 CMSI
6、S 架构 2)STM32F10 x_StdPeriph_Driver 文件夹 LibrariesSTM32F10 x_StdPeriph_Driver 文件夹下有 inc(include 的缩写)和 src(source 的缩写)这两个文件夹,这都属于 CMSIS 的设备外设函数部分,由芯片制造商在 Cortex-M3 核外加进去的。在 src 和 inc 文件夹里的就是 ST 公司针对每个 STM32 外设编写的库函数文件,每个外设对应一个.c和.h后缀的文件,本书把这类文件称为:stm32fl0 x_xxx.c和stm32f10 x_xxx.h文件,xxx 表示外设名称。65 第 4 章
7、STM32 库函数及程序开发 图 4.5 驱动的源文件及头文件 这两个文件夹中有一个特别的 misc.c 文件,这个文件提供外设对内核中断向量控制器(NVIC)的访问函数,在配置中断时,需要把这个文件添加到项目中。3)stm32f10 x_it.c 和 stm32f10 x_conf.h 文件 在库目录的 ProjectSTM32F10 x_StdPeriph_Template 目录下,存放了官方的工程模板,在用 库 建 立完 整 项 目时,需 要添 加 这 个目 录 下的 stm32f10 x_it.c、stm32f10 x_it.h 和stm32f10 x_conf.h 这三个文件。stm
8、32f10 x_it.c 是专门编写中断服务程序的,这个文件默认已经定义了一些系统异常的服务程序,其他普通中断服务程序由用户自己添加,这些普通中断服务程序已经默认了函数名,不可以自定义,具体名称可以在 startup_stm32f10 x_md.s 汇编程序中找到,如在汇编的以下这行,说明中断 0 的服务程序名称是 EXTI0_IRQHandler。DCD EXTI0_IRQHandler ;EXTI Line 0 stm32f10 x_conf.h 文件被包含进 stm32f10 x.h 文件,是用来配置使用了什么外设的头文件,这个头文件可以方便地增加或删除上面 Driver 目录下的驱动函
9、数。例如代码配置表示只用到了 gpio、rcc 的函数库,其他不用的可注释掉,如图 4.6。66 嵌入式系统原理及设计 图 4.6 stm32f10 x_conf.h 内容配置 stm32f10 x_conf.h 文件可配置是否使用“断言”编译选项,从而可以在开发时使用“断言”可由编译器检查库函数传入的参数是否正确,软件编写成功后,去掉“断言”编译选项可使程序全速运行。可通过定义 USE_FULL_ASSERT 或取消定义来配置是否使用“断言”。4.1.2 STM32 固件库文件间关系 固件库文件可以直接包含进入工程,不用进行修改,而有的文件就需要在使用过程中进行修改,因此需要整体上把握一下各
10、个文件在库工程中的层次和关系,这些文件都对应在CMSIS 标准架构上。下图描述了 STM32 固件库各文件之间的调用关系,对于用户层的文件来说,就是用户改动开发的程序。在学习库函数时,官方资料是所有关于STM32知识的源头,目前官方主要提供对开发有帮助的资料有如下内容:stm32f10 x_stdperiph_lib_um.chm 库函数帮助文件。在使用库函数时,可以通过查阅此文件来了解库函数原型或库函数调用的方法。67 第 4 章 STM32 库函数及程序开发 图 4.7 库各文件之间的关系 68 嵌入式系统原理及设计 4.2 搭建开发环境及程序开发 4.2.1 搭建开发环境 STM32 芯
11、片软件开发需要用于编译程序代码的开发环境,目前针对 ARM Cortex-M3 的开发环境平台有 ARM 公司的 MDK 开发环境,Embedded Workbench 公司的 IAR 开发环境,以及自己采用 ARM gcc 编译器,并选择合适的编辑器搭建开发一个开发平台。从初学者入手,本书采用 ARM 公司的 MDK 开发环境,目前最新的版本是 MDK5.2,但目前学习资料很多还是以 MDK4 系列版本来开发了,本书采用 MDK4.7 做为学习用的开发环境,其中包括了相应的编译器、汇编器、链接器和基本库函数等,开发环境具体信息如图4.8。图 4.8 MDK4.7 开发环境 4.2.2 程序开
12、发 安装完 MDK 之后,可以建立一个新的项目文件,具体过程如下:(1)新建一个项目文件,创建名称为 STM32Helloworld 图 4.9 创建项目(2)选择所用的目标芯片,本书中以 STM32F103RB 系列芯片为主,所以选择如图 4.10所示:69 第 4 章 STM32 库函数及程序开发 图 4.10 选择合适芯片 在选择后,会弹出对话框,问是否加入 startup_stm32f10 x_md.s 文件,由于采用库文件模式,我们可以后面导入库文件在 startup 目录下的 startup_stm32f10 x_md.s 文件,因此可以选择否。此时建立出的项目没有文件内容如图 4
13、.11,所以需要根据项目需求把相应库文件拷贝到项目中,最后需要编写出合适的 main.c 程序和其他应用程序,并添加到项目中。图 4.11 项目创建成功 本项目作为第一个程序,根据如下电路图 4.12,实现一个控制 LED 灯亮的程序。图 4.12 LED 灯电路 根据电路图,此 LED 连接到 STM32 微控制器 PA1 引脚,所以只要设置 PA1 引脚为低电平,即可以实现灯亮。在此程序中要用到 GPIO 控制,所以要导入 GPIO 库函数;同时由于芯片启动时,需要调用时钟管理程序,所以也需要导入 RCC 库函数。同时根据库文件结构,程序运行正常,还需要导入 startup_stm32f1
14、0 x_md.s,system_stm32f10 x.c 以及相应的头文件和 stm32f10 x.h 文件。注意,由于不直接对内核进行操作,所以 core_cm3.c 暂不用导入。首先从库文件拷贝所需的文件到项目文件目录下,本项目根据需求分别把这些文件拷贝到 core,lib 和 user 文件夹下,如图 4.13。70 嵌入式系统原理及设计 图 4.13 项目文件夹 core 目录下有 startup_stm32f10 x_md.s 文件,lib 目录下主要是有关 GPIO 和 RCC 模块的stm32f10 x_gpio.c,stm32f10 x_gpio.h,stm32f10 x_rc
15、c.c 和 stm32f10 x_rcc.h 文件。user 目录下stm32f10 x.h,stm32f10 x_conf.h,system_stm32f10 x.c 和 main.c 程序,其中 main.c 程序本项目实现的主程序。同时把这些文件导入到项目中,可以通过实现。图 4.14 相应的文件导入到项目中 在项目配置中引入头文件,通过进入 option for Target 界面,并在 C/C+栏导入在本项目要用到的头文件路径,包括:.libinc 和.user;同时需要对 Preprocessor Symbols 进行设置,由于采用中等密度芯片 STM32F103RB,并采用库函数
16、调用的方式,所以设置为:STM32F10X_MD,USE_STDPERIPH_DRIVER,如图 4.15:图 4.15 导入头文件 本项目根据需求,main.c 程序代码如下:#include stm32f10 x.h#include stm32f10 x_rcc.h#include stm32f10 x_gpio.h/*71 第 4 章 STM32 库函数及程序开发 brief 初始化 LED 灯,实现让 LED 亮 paramsNone retval0 程序正常结束*/int main(void)GPIO_InitTypeDef gpio_init;/使能 PA1 时钟 RCC_APB2
17、PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/将 PA1 设置为推挽输出 gpio_init.GPIO_Mode=GPIO_Mode_Out_PP;gpio_init.GPIO_Pin=GPIO_Pin_1;gpio_init.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_init);while(1)/设置 PA1 为低电平,根据电路图 LED 灯亮 GPIO_ResetBits(GPIOA,GPIO_Pin_1);return 0;编译成功后,便可以下载程序到开发板。4.2.3 时钟设定程序说明
18、 时钟是否能启动正常影响着 STM32 微控制器是否能够正常工作,同时由于 STM32 微处理器的时钟源有 HSI(高速内部时钟)、HSE(高速外部时钟)、LSI(低速内部时钟)、LSE(低速外部时钟)、PLL(锁相环倍频输出)这 5 种类型。所以在程序刚开始运行时,需要调用时钟管理函数。(1)STM32 微控制器时钟管理 STM32 具有功能丰富的时钟系统,如图 4.16。72 嵌入式系统原理及设计 图 4.16 STM32F10 xx 时钟系统框图 用户可通过多个预分频器配置 AHB 总线、高速 APB2 总线和低速 APB1 总线的频率。AHB 和 APB2 域的最大频率是 72MHZ。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式系统原理及设计 4.1 嵌入式 系统 原理 设计

限制150内