新版的固件庫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() 函數。