立即注册 登录
返回首页

uid:201965的个人空间

日志

初学STM32之官方库

已有 663 次阅读2017-5-17 21:32

新版的固件库V3.0以上 main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h,stm32f10x.h则定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:1、device选择#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)/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices *//* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices *//* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */#define STM32F10X_MD/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices *//* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices *//* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices *//* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices *//* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */#endif此段代码在stm32f10x.h的开始处,根据所用的器件 取消合适的注释。我常用的是stm32f103c8t6 属于Medium density Value Line devices.2、外部时钟频率选择#if !defined HSE_VALUE#ifdef STM32F10X_CL#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */#else#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */#endif /* STM32F10X_CL */#endif /* HSE_VALUE */注意STM32F10X_CL,STM32F10X_CL是stm32f105 和stm32f107 互联型的device,用到此器件外部要选用25MHz的晶体,由于前面的代码没有取消 /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */的注释,所以此处默认的外部8MHz的晶体3、外设宏定义USE_STDPERIPH_DRIVER#if !defined USE_STDPERIPH_DRIVER/*** @brief Comment the line below if you will not use the peripherals drivers.In this case, these drivers will not be included and the application code willbe based on direct access to peripherals registers*//*#define USE_STDPERIPH_DRIVER*/#endif如果不适用片内外设,则不要取消 /*#define USE_STDPERIPH_DRIVER*/的注释注意stm32f10x.h文件的最后有这样的代码:#ifdef USE_STDPERIPH_DRIVER#include "stm32f10x_conf.h"#endifstm32f10x_conf.h中包含了所有外设的头文件,因此任意源文件只要包含了stm32f10x.h,就可以在源文件调用任意外设的函数。若有外设为使用到,在stm32f10x_conf.h注释相应部分,项目编译时就不会在编译去掉的外设。

4. core_cm3.c文件

CoreSupport中的是位于CMSIS标准的核内设备函数层 的M3核通用的源文件core_cm3.c和头文件core_cm3.h,它们的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。这两个文件在其它公司的M3系列芯片也是相同的。至于这些功能是怎样用源码实现的,我们可以不用管它,我们只需把这个文件加进我们的工程文件即可,有兴趣的朋友可以深究。


较重要的是在core_cm3.c文件中包含了stdin.h 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的C语言头文件 stdio.h 文件一样。位于RVMDK这个软件的安装目录下,主要作用是提供一些新类型定义,如:

/* exact-width signed integer types */

typedef   signed          char int8_t;

typedef   signed short     int int16_t;

typedef   signed           int int32_t;

typedef   signed       __int64 int64_t;

/* exact-width unsigned integer types */

typedef unsigned          char uint8_t;

typedef unsigned short     int uint16_t;

typedef unsigned           int uint32_t;

typedef unsigned       __int64 uint64_t;

    这些新类型定义屏蔽了在不同芯片平台时,出现的诸如int的大小是16位,还是32位的差异。所以在我们以后的程序中,都将使用新类型如int8_t 、int16_t……

    在稍旧版的程序中还可能会出现如u8、u16、u32这样的类型,请尽量避免这样使用,在这里提出来是因为初学时如果碰到这样的旧类型让人一头雾水,而且在以新的库建立的工程中是无法追踪到u8、u16、u32这些的定义的。        core_cm3.c跟启动文件一样都是底层文件,都是由ARM公司提供的,遵守CMSIS标准,即所有CM3芯片的库都带有这个文件,这样软件在不同的CM3芯片的移植工作就得以简化。 

5.system_stm32f10x.c

    system_stm32f10x.c,是由ST公司提供的,遵守CMSIS标准。该文件的功能是设置系统时钟和总线时钟, M3比51单片机复杂得多,并不是说我们外部给一个8M的晶振,M3整个系统就以8M为时钟协调整个处理器的工作。我们还要通过M3核的核内寄存器来对8M的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。

    system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h 这个头文件。

6. stm32f10x.h文件

    stm32f10x.h 这个文件非常重要,是一个非常底层的文件。

    所有处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了。

在3.5版的启动文件还调用了在system_stm32f10x.c文件中的SystemIni() 函数配置系统时钟,在旧版本的工程中要用户进入main函数自己调用SystemIni() 函数。 

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部