在Keil MDK环境下使用STM32 V3.4库“小”教程
简介
写这篇“小”教程主要是和大家分享使用STM32的基本方法。在一年以前,我开始接触并开始使用STM32。STM32价格便宜,外设丰富,开发和仿真环境使用方便,一下子便爱上了它。我当时使用了IAR 编译环境,固件库也是以前的V2版本。由于ST公司更新了STM32的固件库,所以想试着使用新固件库。刚开始使用新库时也遇到了一些问题,但是慢慢熟悉不但觉得不难不烦,反而觉得V3比V2更好用。在这里我和大家分享一下使用V3.4库的方法,希望大家喜欢,如有错误请指出,在下不慎感激。
这篇“小”教程分以下四步来说,第一步,获得库文件,并进行适当的整理;第二步,建立工程,并建立条理清晰的GROUP;第三步,修改工程的Option属性;第四步:使用JLINK仿真调试。下面就分这四大步来逐个说明。
第一步 获得库文件,并进行适当的整理
第一步非常的简单,访问ST的上就可以获得最新的固件库,在我写“小”教程的时候最新的固件库是V3.4。除了获得固件库之外还可以获得和固件库相关的说明文档。在以前的上可以下载到一篇名为《如何从 STM32F10xxx固件库 V2.0.3 升级为 STM32F10xxx标准外设库 V3.0.0》的应用手册,但是在现
在的ST上却不到这篇十分有用的应用文档,不过却可以在百度文库中到,这篇文档详细说明了新固件库的文件结构,在Keil工程建立之前,值得一看。
图1 CMSIS文件夹包含内容
图1是新固件库改动比较大的部分,ST称为CMSIS。在这个文件夹下面出现了一些新的源文件、头文件和启动代码,新的源文件如core_cm.c system_stm32f10x.c,也有新的启动代码如start_stm32f10x_h/m/ld.s。在第二部分会详细介绍这些文件到底有什么作用,以及和V2版本的区别。在这里我也补充一句,V3.4还是和V3.0有点区别,V3.4又比V3.0多出了几个启动代码。
我个人觉得这些文件“埋”的太深,使用起来有点不方便,所以我一般对这些文件进行一些整理,把相关文件放在一起,并取上一个标准化的名字,这些文件夹的名字一般和原始固件库文件夹的名字相同,只是把需要的文件放在一起。例如我把启动代码(startup)放在一个文件夹下面,而在这个文件下面只放Keil MDK有关的启动代码,把IAR和GCC的文件全部给去除了,这样做不但使得文件夹内容“清爽”也可以避免不必要的错误。一般在工程目录下面我会建立以下几个文件夹,如图2所示。当然还会建立两个很有用的文件夹,一个取名为Listing,另一个取名为Object。这两个文件夹会保存Keil编译连接过程中产生的一些文件,虽然是一个不起眼的细节但是也请大家关注,不然在工程目录下面“邋遢”的很!
图2 工程文件夹的结构和相关文件
下面来简单说说这些文件各有什么作用。在下重在应用,对里面的内容也知之甚少。system的头文件
core_cm3.c/core_cm3.h
该文件是内核访问层的源文件和头文件,查看其中的代码多半是使用汇编语言编写的。在线不甚了解。
stm32f10x.h
该文件是外设访问层的头文件,该文件是最重要的头文件之一。例如定义了CPU是哪种容量的CPU,中断向量等等。除了这些该头文件还定义了和外设寄存器相关的结构体,例如:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
包含了那么多寄存器的定义,那么在应用文件中(例如自己编写的main源文件)只需要包含stm32f10x.h即可,而不是以前固件库的需要包含stm32f10x_conf.h这个头文件。
system_stm32f10x.c/h
该头文件也可以称为外设访问层的头文件和源文件。在该文件中可以定义系统的时钟频率,定义低速时钟总线和高速时钟总线的频率,其中最关键的函数就是SystemInit()了,这个后面会详细介绍。总之这两个文件是新固件库的重点,有了它粮也大大简化了使用stm32的初始化工作。
stm32f10x_conf.h
这个文件和V2版本的库的内容是一样的,需要使用哪些外设就取消哪些外设的注释。例如需要使用GPIO
功能,但不使用SPI功能,就可以这样操作。
#include "stm32f10x_gpio.h"
/*  #include "stm32f10x_spi.h"  */
main.c
这个文件就不用多说了,自己编写。
stm32f10x_it.c/h
这两个文件包含了stm32中断函数,在源文件和头文件中并没有把所有的中断入口函数都写出来,而只写了ARM内核的几个异常中断,其他的中断函数需要用户自己编写。stm32f10x_it.c的最后给了这样一个模板。
/******************************************************************************/
/*                STM32F10x Peripherals Interrupt Handlers          */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */ /*  available peripheral interrupt handler's name please refer to the startup    */ /*  file (startup_stm32f10x_xx.s).                                    */
/******************************************************************************/
/**
* @brief  This function handles PPP interrupt request.
* @param  None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
从注释中的英文提示可以看出,中断向量的名称可以从相应的启动代码中出,例如可以在startup_stm32f10x_md.s中到USART1中断函数的名称——USART1_IRQHandler。其他的中断函数名可以以此类推,一一获得,在这里我就不一一复述了。
StdPeriph_Driver文件夹
该文件夹有包含两个文件夹,一个是src文件夹,另一个是inc文件夹,顾名思义,一个里面放的是元件一个里面放的是头文件。这两个文件夹包含了所有的STM32的外设驱动函数,其实和V2版本也没有太大的变化。简单来说,外设的驱动相当于windows的驱动函数API,这些驱动函数看到函数名基本就可以明白这个函数的作用,例如:GPIO_SetBits可以置位某个IO口,相反GPIO_ResetBits则可以复位某个IO口。我个人认为熟练使用库可以大大提高编程的效率,同时规范使用库函数也可以提高程序的可读性,让团队中的其他程序员可以快速的明白代码的作用。
第二步,建立工程,并建立条理清晰的GROUP
从这一步开始就开始和Keil MDK打交道了。首先建立一个Keil工程,这一小步再简单不过了,Project菜单项中点击New uVision Project,然后保存工程文件,路径自由设定并可以包含中文。  然后选择指定的CPU型号,如图3所示。例如选择STM32F103RB。
图3 选择CPU型号                            图4 取消加载启动代码
接着弹出一个添加启动代码的窗口,在这里请大家点击否。因为这个启动代码是旧版本库的启动代码,新版的启动代码和这个不同,需要自己添加。所谓启动代码就是在main函数之前运行的代码。
以上的几个步骤和在Keil环境下使用51很相似,所以也不必多说。
选择CPU型号后就需要建立一个条理清晰的Group,在这里我强调的是一个“条理性”。我尽可能的把同类的文件放在一起,并取名和工程文件目录中相同的名字,这样便于管理也避免不必要的错误。在Target 1选项上右击,在弹出菜单上选择manage components,如图5所示。
图5 开始添加Group                              图6 新建Group
建立相应的Group。例如User,CMSIS,StdPeriph_Driver和StartUP,这些Group的名称和工程文件夹的名称保持一致,如图6所示。为每个Group添加同名文件夹下的源文件或者头文件,为了便于查看代码,我把源文件和头文件都添加进Group中(除StdPeriph_Driver),在这里注意过滤文件的类型。Std
Periph_Driver中只添加需要的源文件,例如建立一个LED闪烁的工程,那么这个工程除了进行必要的初始化之外,只需要包含GPIO的操作函数,当然需要使用GPIO就必须要使能GPIO的时钟,RCC 是绝对少不了的。所以只需要包含misc.c,stm32f10x_gpio.c和stm32f10x_rcc.c。需要说明的是,虽然在有些Group中包含了一些头文件,但是Keil在编译连接的时却不知道头文件在什么地方,所以一定要指定头文件的路径。添加需要的文件之后,工程目录如图7所示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。