很久没有碰单片机了,两年了吧,因为项目需要,最近入手一块红牛的开发板,核心为STM32F103ZE。虽然以前做过大概半年的stm32的开发,现在天天在.net平台下写代码,已经忘记的差不多,恰逢周末,补补课,以后用的时候也方便点。
ST推出的FW大大提高了单片机SW的开发效率,所以在新建工程前先来了解下这个SDK。我使用的是最新的v3.5固件库,这个固件库可以分为三个部分:
1、内核支持(..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport)
2、硬件系统支持(..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x)
3、外设支持(..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src)
4、评估板支持(..\STM32F10x_StdPeriph_Lib_V3.5.0\Utilities\STM32_EVAL)
下图为这个几个支持模块之间的关系
一、关于内核支持模块
这个模块由文件core_cm3.c和core_cm3.h构成。这部分代码完全由汇编写就,主要完成一些底层操作的基本功能,包括一些加减乘除,移位和拷贝等的一些基本运算。
二、关于硬件系统支持
这个模块的代码包括用于系统的启动代码(startup),和代码编译运行前的初始设置的代码(stm32f10x.h)
stm32f10x.h这个文件,定义了各个寄存器的地址,配置了我们使用的核心类型,是否使用固件库等信息,打开该文件,第95行代码如下
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" #endif
这几行代码告诉我们,如果没有定义自己使用的芯片类型,将无法编译通过,我们可以通过修改第66行的代码定义自己的处理器,也可以通过开发环境设置自己定义的处理器。
该文件第8296行代码如下
#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif
这三行的代码显示,如果我们使用固件库必须定义
USE_STDPERIPH_DRIVER
这样他会把stm32f10x_conf.h文件包含进来。该文件包含了各个外设的头文件。
因此,假如我们在文件stm32f10x.h中定义了USE_STDPERIPH_DRIVER, 编写的源文件时,只需要通过包含stm32f10x.h这个文件,便可以方便使用固件库定义的方法访问和操作外设。
三、关于外设支持
每种外设对应了两个文件,一个头文件和一个源文件,他们定义和实现了外设操作的基本功能
四、关于评估板支持
ST应该是给出集中不同的评估板类型,不同的类型,只要是评估板上的资源不一样,这几个类型通过打开文件stm32_eval.h,查看58行开始的代码,便一目了然。
=================================================================================================================+ STM32 EVAL | LED | Buttons | Com Ports | LCD | IOE | sFLASH | sEE | TSENSOR | SD (SPI) | SD(SDIO) | =================================================================================================================+ STM3210B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO | -----------------------------------------------------------------------------------------------------------------+ STM3210E-EVAL | 4 | 8 | 2 | YES (FSMC)| NO | YES | NO | YES | NO | YES | -----------------------------------------------------------------------------------------------------------------+ STM3210C-EVAL | 4 | 3 | 1 | YES (SPI) | YES | NO | YES | NO | YES | NO | -----------------------------------------------------------------------------------------------------------------+ STM32100B-EVAL | 4 | 8 | 2 | YES (SPI) | NO | YES | NO | YES | YES | NO | -----------------------------------------------------------------------------------------------------------------+ STM32L152-EVAL | 4 | 8 | 2 | YES (SPI) | NO | NO | NO | YES | YES | NO | -----------------------------------------------------------------------------------------------------------------+ STM32100E-EVAL | 4 | 8 | 2 | YES (FSMC)| YES | YES | YES | YES | YES | NO | =================================================================================================================+
查看该文件的150行可看到如下代码
#ifdef USE_STM32100B_EVAL #include "stm32f10x.h" #include "stm32100b_eval/stm32100b_eval.h" #elif defined USE_STM3210B_EVAL #include "stm32f10x.h" #include "stm3210b_eval/stm3210b_eval.h" #elif defined USE_STM3210E_EVAL #include "stm32f10x.h" #include "stm3210e_eval/stm3210e_eval.h" #elif defined USE_STM3210C_EVAL #include "stm32f10x.h" #include "stm3210c_eval/stm3210c_eval.h" #elif defined USE_STM32L152_EVAL #include "stm32l1xx.h" #include "stm32l152_eval/stm32l152_eval.h" #elif defined USE_STM32100E_EVAL #include "stm32f10x.h" #include "stm32100e_eval/stm32100e_eval.h" #else #error "Please select first the STM32 EVAL board to be used (in stm32_eval.h)" #endif
这几行代码告诉我们,如果我们定义不同的开发板类型,他将会包含不同的文件以适合你所选的开发板。
今天先简单的将FW简介下,想要深入了解,可以阅读它的源码,对于提高自己的嵌入式代码的质量是非常有帮助的。下章将介绍使用固件库新建工程。。。。。