APP下载

STM 32F10X系列微控制器标准外设库的应用

2012-03-17杨凤彪

电子设计工程 2012年11期
关键词:程序代码外设微控制器

杨凤彪,刘 云

(1.军械工程学院 电气工程系,河北 石家庄 050003;

2.河北普兴电子科技有限责任公司 综合管理部,河北 石家庄 050200)

Stm32f10x系列微控制器具有Cortex-M3内核结构,它集成了CM3core的中心处理器内核和先进的系统外设,实现了内置的中断控制、存储器保护,以及系统的调试和跟踪功能[1]。在进行嵌入式系统设计时,控制软件首先需要对微控制器的启动、系统时钟、存储器映射、中断向量、异常处理等进行设置,增加了控制软件的前期开发时间,更加造成了初学者的难度。为了缩短开发时间、提高软件的可移植性,同时降低开发成本,ST公司提供了标准外设驱动库,该库集成了CMSIS文件及微控制器所有外设驱动函数,由于屏蔽了不同型号微控制器之间的差异,用户文件仅需调用相应的库函数便可完成系统配置,简化了开发流程,降低了开发难度。中stdint.h包括对8位、16位、32位等类型指示符的定义,主要用来屏蔽不同编译器之前的差异。core_cm3.h和core_cm3.c中包括Cortex_M3核的全局变量声明和定义,并定义一些静态功能函数。system_stm32.h和 system_stm32.c是不同芯片厂商定义的系统初始化函数System Init(),以及一些指示时钟的变量。Stm32f10x.h是提供给应用程序的头文件,包含core_cm3.h和 system_stm32.h,定义了与特定芯片厂商相关的寄存器以及各中断异常号,并可定制M3核中的特殊设备,如MCU、中断优先级位数以及SysTick时钟配置。虽然CMSIS提供的文件很多,但在应用程序中只需包含h头文件[3]。

1 CMSIS文件结构

图1 CMISIS文件结构Fig.1 File structure of CMSIS

CMSIS为Cortex微控制器软件接口标准,提供了独立于Cortex-M处理器的外设、实时操作系统、中间组件的通用接口方法,解决了软件组件应用于不同Cortex核微控制器时所带来的难题,简化了软件复用,降低了Cortex-M上操作系统的移植难度[2]。

CMSIS的文件结构如图1所示 (以Cortex-M3为例),其

2 标准外设库简介

ST官方提供的标准外设库文件包括标准外设库文件、标准外设驱动例程、各种开发环境下的模板示例、评估板专用驱动等几部分,其中,CMSIS和STM32F10x_StdPeriph_Driver是最重要的部分。STM32F10x_StdPeriph_Driver则包括了微控制器所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的函数调用接口。Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,其中很多驱动函数同样可以作为学习的重要参考[4]。

图2 标准外设库文件关系Fig.2 Standard peripherals library file inclusions relationship

标准外设库文件之间的关系如图2所示,每一个标准外设驱动包括源文件stm32f10x_ppp.c和头文件stm32f10x_ppp.h 两个文件(PPP 表示外设,如 GPIO、EXTI、I2C 等),源文件中包含了相应外设的所有驱动函数,在misc.c文件中定义了CMSIS功能的一些附加函数,如对NVIC的配置等。STM32f10x.h为CMSISCortex-M3设备外设访问层头文件,包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射,以及是否使用标准外设库设置等。System_stm32f10x.c为CMSISCortex-M3设备外设访问层系统文件,完成系统初始化及时钟配置。Stm32f10x_conf.h为标准外设驱动配置文件,通过更改包含的外设头文件来选择所使用的外设,在新建程序和进行功能变更之前应当首先修改对应的配置。Stm32f10x_it.c为外设中断函数文件,通过在相应位置加入中断程序代码执行相应中断操作,在实际应用中,中断函数也可以设置在项目主程序文件中,但中断函数名必须正确。

3 基于标准外设库的实现步骤

在IAR FOR ARM6.30编程环境下, 采用 V3.50的标准外设库,开发步骤如下[3-6]:

1)首先创建一能够象征项目含义的文件夹(如touch),并在该文件夹下创建名为EVARM和Library的文件夹;

2)STM32F10x_StdPeriph_Lib_V3.5.0 中 STM32F10x_StdPeriph_Driver和CMSIS文件夹拷贝到touch目录下;

3)将 STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template 下 的 main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 拷贝到 touch 目录下;

4) 将 STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_TemplateEWARM 下的 stm32f10x_flash.icf、stm32f10x_flash_extsram.icf、stm32f10x_nor.icf、stm32f10x_ram.icf 拷 贝 至 /touch/EVARM;

5)打开IAR Embedded Workbench IDE,创建一个新的workspace,而后按照模板创建一个新空白项目;

6)为项目添加工作组 CMSIS、StdPeriph_Driver、EVARM、User、Doc,如图 3 所示;

图3 添加工作组界面Fig.3 Interface of add workgroup

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→General 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 中相关程序代码段如下:

#if defined (STM32F10X_LD_VL) ||(defined STM32F10X_MD_VL) ||(defined STM32F10X_HD_VL)

/*#define SYSCLK_FREQ_HSE HSE_VALUE*/

#define SYSCLK_FREQ_24MHz 24000000

#else

/*#define SYSCLK_FREQ_HSE HSE_VALUE*/

/*#define SYSCLK_FREQ_24MHz 24000000*/

/*#define SYSCLK_FREQ_36MHz 36000000*/

/*#define SYSCLK_FREQ_48MHz 48000000*/

#define SYSCLK_FREQ_56MHz 56000000

/*#define SYSCLK_FREQ_72MHz 72000000*/

#endif

在不进行任何改动情况下,系统默认使用HIS作为系统时钟,如使用HSE作为系统时钟,则需将/*#define SYSCLK_FREQ_HSE HSE_VALUE*/的注释去掉,屏蔽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的控制信号,当PB0引脚电平在下降沿时触发外部中断线0中断,在显示器上绘制一条直线。建立项目步骤如3所述,将中断函数设置在主程序文件中,使用HSE为系统时钟,本文且未对LCD操作函数进行说明,仅给出利用标准外设库进行端口及中断设置的代码[5]。

微控制器I/O口配置程序代码如下:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;

GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;

GPIO_Init(GPIOC,&GPIO_InitStructure);

为了将PB0配置为中断输入且中断有效,须开启PB口I/O时钟及AFIO时钟,中断配置代码如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, EN ABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, EN ABLE);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_Pin Source0);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_Struture.NVIC_IRQChannel=EXTI0_IRQn;

NVIC_Struture.NVIC_IRQChannelPreemptionPriority=0;

NVIC_Struture.NVIC_IRQChannelSubPriority=1;

NVIC_Struture.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_Struture);

EXTI_InitStruture.EXTI_Line=EXTI_Line0;

EXTI_InitStruture.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStruture.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStruture.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStruture);

外部中断线0中断函数代码如下:

void EXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)!=RESET)

{

Line_Lcd(50,200,300,50,80); //画直线函数

EXTI_ClearITPendingBit(EXTI_Line0);

}

}

在主程序中设置循环状态以等待中断,当PB0口由高电平跳变为低电平时,触发中断,调用外部中断线0中断函数。具体应用中,如果有多个中断源可以触发该外部中断,还须判断中断标志位以确定执行何种操作。

5 结束语

文中介绍了ST公司V3.50标准外设库的文件架构和相互联系,基于IAR FOR ARM6.30开发环境给出了参考编程步骤,并根据实例设计了具体的程序代码。采用标准外设库进行嵌入式软件开发,无需太多了解微处理器底层硬件结构,只要具有C/C++软件基础,根据本文介绍的参考步骤,便可开发出高效直观的程序代码。

[1]刘波文.ARM Cortex-M3应用开发实例详解 [M].北京:电子工业出版社,2011.

[2]ST.stm32f10x_stdperiph_lib_um.chm[EB/OL].[2011-04].http://www.st.com/STM32

[3]langen.基于CMSIS标准的Cortex-M3应用软件开发[EB/OL].[2009-12].http://www.dzsc.com/data/htm l

[4]emouse.STM32固件库详解[EB/OL].[2011-11].http://www.cnblogs.com/emouse

[5]jhliuzj.IAR FOR ARM 6.20 工程创建建议 (固件库为3.5)[EB/OL].[2011-10].http://hi.baidu.com/jhliuzj.

[6]徐爱钧.IAR EWAR V5嵌入式系统应用编程开发 [M].北京:北京航空航天大学出版社,2009.

猜你喜欢

程序代码外设微控制器
计算机网络信息安全未来发展趋势
物联网技术在微控制器实验教学中的应用
基于图元装接模式由程序流程图自动生成源代码
Atmel针对新一代物联网应用发布全新32位微控制器
最新STM32设计工具增加对混合信号微控制器的支持
意法半导体(ST)推出世界首款基于ARM Cortex-M7的STM32 F7系列微控制器
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
外设天地行情
外设天地行情
外设天地行情