STM32F10X系列微控制器标准外设库的应用
扫描二维码
随时随地手机看文章
摘要:基于简化Codex-M核微控制器嵌入式软件的开发步骤,增强软件可移植性的目的,时微控制器软件接口标准(CMSIS)、ST公司标准外设库V3.5的文件结构、相互联系、功能作用进行了简要介绍,并以具有Cortex-M3内核的STM32F103VET6为例,给出了IAR FOR ARM6.30编程环境下的开发步骤。结合具体应用,本文对数据端口、中断进行设置,缩短了开发时间,提高了代码效率。
关键词:Cortex-M;微控制器;外设库;CMSIS
Stm32f10x系列微控制器具有Cortex-M3内核结构,它集成了CM3core的中心处理器内核和先进的系统外设,实现了内置的中断控制、存储器保护,以及系统的调试和跟踪功能。在进行嵌入式系统设计时,控制软件首先需要对微控制器的启动、系统时钟、存储器映射、中断向量、异常处理等进行设置,增加了控制软件的前期开发时间,更加造成了初学者的难度。为了缩短开发时间、提高软件的可移植性,同时降低开发成本,ST公司提供了标准外设驱动库,该库集成了CMSIS文件及微控制器所有外设驱动函数,由于屏蔽了不同型号微控制器之间的差异,用户文件仅需调用相应的库函数便可完成系统配置,简化了开发流程,降低了开发难度。
1 CMSIS文件结构
CMSIS为Codex微控制器软件接口标准,提供了独立于Cortex-M处理器的外设、实时操作系统、中间组件的通用接口方法,解决了软件组件应用于不同Cortex核微控制器时所带来的难题,简化了软件复用,降低了Codex-M上操作系统的移植难度。
CMSIS的文件结构如图1所示(以Codex-M3为例),其中stdint.h包括对8位、16位、32位等类型指示符的定义,主要用来屏蔽不同编译器之前的差异。core_cm3.h和core_cm3.c中包括Cortex_M3核的全局变量声明和定义,并定义一些静态功能函数。system_stm32.h和system_ stm 32.c是不同芯片厂商定义的系统初始化函数SystemInit(),以及一些指示时钟的变量。Stm32f10x.h是提供给应用程序的头文件,包含core _cm3.h和system_stm32.h,定义了与特定芯片厂商相关的寄存器以及各中断异常号,并可定制M3核中的特殊设备,如MCU、中断优先级位数以及SysTick时钟配置。虽然CMSIS提供的文件很多,但在应用程序中只需包含h头文件。
2 标准外设库简介
ST官方提供的标准外设库文件包括标准外设库文件、标准外设驱动例程、各种开发环境下的模板示例、评估板专用驱动等几部分,其中,CMSIS和STM32F10x_StdPeriph_Driver是最重要的部分。STM32F10x_StdPeriph_Driver则包括了微控制器所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的函数调用接口。Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,其中很多驱动函数同样可以作为学习的重要参考。
标准外设库文件之间的关系如图2所示,每一个标准外设驱动包括源文件stm32f10x_PPP.C和头文件stm32f10x_ppp.h两个文件(PPP表示外设,如GPIO、EXTI、I2C等),源文件中包含了相应外设的所有驱动函数,在misc.c文件中定义了CMSIS功能的一些附加函数,如对NVIC的配置等。STM32f10x.h为CMSIS Codex-M3设备外设访问层头文件,包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射,以及是否使用标准外设库设置等。System_stm32f10x.C为CMSIS Cortex-M3设备外设访问层系统文件,完成系统初始化及时钟配置。Stm32f10x_conf.h为标准外设驱动配置文件,通过更改包含的外设头文件来选择所使用的外设,在新建程序和进行功能变更之前应当首先修改对应的配置。Stm32f10x_it.c为外设中断函数文件,通过在相应位置加入中断程序代码执行相应中断操作,在实际应用中,中断函数也可以设置在项目主程序文件中,但中断函数名必须正确。
3 基于标准外设库的实现步骤
在IAR FOR ARM6.30编程环境下,采用V3.50的标准外设库,开发步骤如下:
1)首先创建一能够象征项目含义的文件夹(如touch),并在该文件夹下创建名为EVARM和Library的文件夹;
2)STM32F10x_StdPeriph_Lib_V3.5.0中STM32F10x_StdPeriph_Driver和CMSIS文件夹拷贝到touch目录下;
3)将\STM32F10x_StdPeriph_Lib_V350\Project\STM32F10x_StdPeriph_Template下的main.c、stm32f10x_confh、stm32f10x_it.c、stm32f10x_it.h拷贝到touch目录下;
4)将\STM32F10x_StdPeriph_Lib_V350\Project\STM32F10x_StdPeriph_Template\EWARM下的stm32f10x_flashcfstm32f10x_flash_ex tsram.icf、stm32f10x_nor.icf、stm32f10x_ram.icf拷贝至/touch/EVARM;
5)打开IAR Embedded Workbench IDE,创建一个新的workspace,而后按照模板创建一个新空白项目;
6)为项目添加工作组CMSIS、StdPeriph_Driver、EVARM、User、Doc,如图3所示;
7)向各工作组添加文件,将core_cm3.c、system_stm32f10x.c添加到CMSIS;将startup_stm32f10x_hd.s添加到EVARM;将misc.c、stm32f10x_rcc.c及所需其它外设驱动源文件添加到StdPeriph_Driver;将main.c、stm32f10x_it.c添加到User;
8)在Project→options→C/C++Compiler→Preprocessor中设置、添加编译搜索路径,最好包括所有项目中所调用文件的路径,否则需要在源文件中给出被调文件的完整路径;
9)在Project→options→Ceneral Options→Target标签页选择相应器件;
10)勾选Project→Options→General Options→Library Configuration→Use CMSIS选项;
11)在stm32f10x.h文件中配置控制器启动文件,根据所选用产品系列,去掉相应注释即可,如令#defineSTM32F10X_HD有意义;同时,去掉/*#define USE_STDPERIPH_DRIVER*/的注释,表示使用标准外设库;
12)选择使用HSI或HSE,system_stm32f10x.c中相关程序代码段如下:
在不进行任何改动情况下,系统默认使用HIS作为系统时钟,如使用HSE作为系统时钟,则需将/*#define SYSCLK_FREQ_HSE HSE_VALU E*/的注释去掉,屏蔽HSI频率定义项,同时根据所用外部晶振频率在stm32f10x.h中重新定义HSE_VALUE的数值。
13)对main.c文件内容进行修改,但须保留#include“stm32f10x.h”,编译、连接项目文件后生成可执行代码;
14)在仿真器编译环境下,进行系统调试。
4 应用实例
采用STM32F103VET6微控制器实现LCD显示器的各种操作,LCD显示器采用北京宁和公司的480×234TFT256色显示器,配套控制器为NHC_ 36。微控制器PD口高8位作为数据口,PB15、PB14、PC6、PC7、PC8分别作为A0、WR、A1、CS、RD的控制信号,当PBO引脚电平在下降沿时触发外部中断线0中断,在显示器上绘制一条直线。建立项目步骤如3所述,将中断函数设置在主程序文件中,使用HSE为系统时钟,本文且未对LCD操作函数进行说明,仅给出利用标准外设库进行端口及中断设置的代码。
微控制器I/O口配置程序代码如下:
为了将PB0配置为中断输入且中断有效,须开启PB口I/O时钟及AFIO时钟,中断配置代码如下:
在主程序中设置循环状态以等待中断,当PB0口由高电平跳变为低电平时,触发中断,调用外部中断线0中断函数。具体应用中,如果有多个中断源可以触发该外部中断,还须判断中断标志位以确定执行何种操作。
5 结束语
文中介绍了ST公司V3.50标准外设库的文件架构和相互联系,基于IAR FOR ARM6.30开发环境给出了参考编程步骤,并根据实例设计了具体的程序代码。采用标准外设库进行嵌入式软件开发,无需太多了解微处理器底层硬件结构,只要具有C/C++软件基础,根据本文介绍的参考步骤,便可开发出高效直观的程序代码。