• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【工程师6】+理论类+STM32新手学习系列-stm32F103库函数配置

STM32F103新手入门库函数配置

在这申明一点,虽然现在STM32的CUBEMX图形界面可以帮我们配置,但是建议新手还是要熟悉一下STM32时钟树和库函数这块,仅个人观点


stm32 固件库V3.0以上的版本,main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h,stm32f10x.h则定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:

使用V3.0以上版本固件库的方法如下:

1.选择device(配置函数STM32F10x.h,具体配置方法如下)

在STM32F10x.h中有如下代码:

#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_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

该代码的是让用户根据自己所使用的芯片的存储器(flash)大小,选择相应的flash编程算法,如果用户使用的是大容量存储芯片(如STM32F103VCT6),则只需要将对应大大容量存储器前面的屏蔽符去掉即可,去掉后为:

#define STM32F10X_HD      /*!< STM32F10X_HD: STM32 High density devices */

其它部分代码不变。

如果使用的是中等容量的存储器芯片(如stm32f103c8t6),同样是将对应代码前面的屏蔽符去掉即可,如:

 #define STM32F10X_MD      /*!< STM32F10X_MD: STM32 Medium density devices */

 


全部回复(12)
正序查看
倒序查看
2019-09-23 14:23

2. 时钟频率配置(配置函数: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

由上述代码可见默认是使用72MHz的时钟频率,如果需要使用其它频率,只需做相应的修改即可,如果使用的是72MHz时钟频率可以不用配置此项。

0
回复
2019-09-23 14:23
@lihui710884923
2. 时钟频率配置(配置函数:system_stm32f10x.c,具体配置方法如下:)#ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)/*#defineSYSCLK_FREQ_HSE    HSE_VALUE*/ #defineSYSCLK_FREQ_24MHz  24000000#else/*#defineSYSCLK_FREQ_HSE    HSE_VALUE*//*#defineSYSCLK_FREQ_24MHz  24000000*/ /*#defineSYSCLK_FREQ_36MHz  36000000*//*#defineSYSCLK_FREQ_48MHz  48000000*//*#defineSYSCLK_FREQ_56MHz  56000000*/#defineSYSCLK_FREQ_72MHz  72000000#endif由上述代码可见默认是使用72MHz的时钟频率,如果需要使用其它频率,只需做相应的修改即可,如果使用的是72MHz时钟频率可以不用配置此项。

3. 选择外部时钟(配置函数stm32f10x.h,具体配置方法如下:)

#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是stm32f105 和stm32f107 互联型的device,用到此器件外部要选用25MHz的晶体,由于前面的代买没有取消  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */的注释,所以此处默认的外部8MHz的晶体。

0
回复
2019-09-23 14:24
@lihui710884923
3. 选择外部时钟(配置函数stm32f10x.h,具体配置方法如下:)#if!defined HSE_VALUE #ifdefSTM32F10X_CL    #defineHSE_VALUE  ((uint32_t)25000000)/*!

4. 开启外设总开关USE_STDPERIPH_DRIVER (配置函数:stm32f10x.h,具体配置方法如下:)

#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 will 

   be based on direct access to peripherals registers 

   */

  /*#define USE_STDPERIPH_DRIVER*/

#endif

默认情况下STM32的标准是关闭的,如果不适用片内外设,则不要取消  /*#define USE_STDPERIPH_DRIVER*/的注释

,如果需要使用STM32的标准外设则需要开启固件外设,即去掉前面的屏蔽符,修改后如下:

#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 will 

   be based on direct access to peripherals registers 

   */

  #define USE_STDPERIPH_DRIVER

#endif

0
回复
2019-09-23 14:24
@lihui710884923
4. 开启外设总开关USE_STDPERIPH_DRIVER (配置函数:stm32f10x.h,具体配置方法如下:)#if!defined USE_STDPERIPH_DRIVER/** *@briefCommentthelinebelowifyouwillnotusetheperipheralsdrivers.  Inthiscase,thesedriverswillnotbeincludedandtheapplicationcodewill   bebasedondirectaccesstoperipheralsregisters   */  /*#defineUSE_STDPERIPH_DRIVER*/#endif默认情况下STM32的标准是关闭的,如果不适用片内外设,则不要取消  /*#defineUSE_STDPERIPH_DRIVER*/的注释,如果需要使用STM32的标准外设则需要开启固件外设,即去掉前面的屏蔽符,修改后如下:#if!defined USE_STDPERIPH_DRIVER/** *@briefCommentthelinebelowifyouwillnotusetheperipheralsdrivers.  Inthiscase,thesedriverswillnotbeincludedandtheapplicationcodewill   bebasedondirectaccesstoperipheralsregisters   */  #defineUSE_STDPERIPH_DRIVER#endif

5. 最后一步是开启需要使用的外设(配置函数:stm32f10x_config.h,具体配置步骤如下:)

/* Includes ------------------------------------------------------------------*/

/* Uncomment the line below to enable peripheral header file inclusion */

/* #include "stm32f10x_adc.h" */

/* #include "stm32f10x_bkp.h" */

/* #include "stm32f10x_can.h" */

/* #include "stm32f10x_cec.h" */

/* #include "stm32f10x_crc.h" */

/* #include "stm32f10x_dac.h" */

/* #include "stm32f10x_dbgmcu.h" */

/* #include "stm32f10x_dma.h" */

/*#include "stm32f10x_exti.h" */

/* #include "stm32f10x_flash.h" */

/* #include "stm32f10x_fsmc.h" */

/*#include "stm32f10x_gpio.h" */

/* #include "stm32f10x_i2c.h" */

/* #include "stm32f10x_iwdg.h" */

/* #include "stm32f10x_pwr.h" */

/*#include "stm32f10x_rcc.h" */

/* #include "stm32f10x_rtc.h" */

/* #include "stm32f10x_sdio.h" */

/* #include "stm32f10x_spi.h" */

/* #include "stm32f10x_tim.h" */

/*#include "stm32f10x_usart.h" */

/* #include "stm32f10x_wwdg.h" */

/*#include "misc.h" */    /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */

默认是关闭所有外设的,用户需要使用哪个外设,就将该外设前面的注释去掉即可。

 

0
回复
2019-09-23 14:34
@lihui710884923
5. 最后一步是开启需要使用的外设(配置函数:stm32f10x_config.h,具体配置步骤如下:)/*Includes------------------------------------------------------------------*//*Uncommentthelinebelowtoenableperipheralheaderfileinclusion*//*#include"stm32f10x_adc.h"*//*#include"stm32f10x_bkp.h"*//*#include"stm32f10x_can.h"*//*#include"stm32f10x_cec.h"*//*#include"stm32f10x_crc.h"*//*#include"stm32f10x_dac.h"*//*#include"stm32f10x_dbgmcu.h"*//*#include"stm32f10x_dma.h"*//*#include"stm32f10x_exti.h"*//*#include"stm32f10x_flash.h"*//*#include"stm32f10x_fsmc.h"*//*#include"stm32f10x_gpio.h"*//*#include"stm32f10x_i2c.h"*//*#include"stm32f10x_iwdg.h"*//*#include"stm32f10x_pwr.h"*//*#include"stm32f10x_rcc.h"*//*#include"stm32f10x_rtc.h"*//*#include"stm32f10x_sdio.h"*//*#include"stm32f10x_spi.h"*//*#include"stm32f10x_tim.h"*//*#include"stm32f10x_usart.h"*//*#include"stm32f10x_wwdg.h"*//*#include"misc.h"*/    /*HighlevelfunctionsforNVICandSysTick(add-ontoCMSISfunctions)*/默认是关闭所有外设的,用户需要使用哪个外设,就将该外设前面的注释去掉即可。 

到这里库函数的配置就全部介绍完毕了,建一个工程需要修改这么多配置是不是太麻烦了呢,的确是比较麻烦,最后再给大家介绍一种简单的配置方法,用宏定义配置这些参数,keil MDk 支持在编译器中添加宏定义,这里就以keil MDK为例,给大家介绍。

先在keil MDK中点击tagart option选项,弹出如下图所示窗口:


0
回复
2019-09-23 14:38
@lihui710884923
到这里库函数的配置就全部介绍完毕了,建一个工程需要修改这么多配置是不是太麻烦了呢,的确是比较麻烦,最后再给大家介绍一种简单的配置方法,用宏定义配置这些参数,keilMDk 支持在编译器中添加宏定义,这里就以keilMDK为例,给大家介绍。先在keilMDK中点击tagartoption选项,弹出如下图所示窗口:[图片]

然后点击C/C++选项,弹出如下窗口:最后在Difine的方框中添加上需要声明的宏定义即可。


0
回复
2019-09-23 14:47
@lihui710884923
然后点击C/C++选项,弹出如下窗口:最后在Difine的方框中添加上需要声明的宏定义即可。[图片]

这里总结一下一般工程中需要添加的宏定义:

1. STM32F10X_HD   //选择用户所使用芯片的存储器容量(这里选择的是大容量存储)

2. USE_STDPERIPH_DRIVER //打开标准外设总开关

3. SYSCLK_FREQ_72MHz     //选择时钟频率(默认也是该选项)

4. HSE_VALUE      //选择使用外部高速时钟(默认也是该选项)

 

注意:stm32f10x.h文件的最后有这样的代码:

#ifdef USE_STDPERIPH_DRIVER

  #include "stm32f10x_conf.h"

#endif

stm32f10x_conf.h中包含了所有外设的头文件,因此任意源文件只要包含了stm32f10x.h,就可以在源文件调用任意外设的函数。

若有外设为使用到,在stm32f10x_conf.h注释相应部分,项目编译时就不会在编译去掉的外设。

0
回复
ruohan
LV.9
9
2019-09-23 20:17
@lihui710884923
这里总结一下一般工程中需要添加的宏定义:1. STM32F10X_HD   //选择用户所使用芯片的存储器容量(这里选择的是大容量存储)2. USE_STDPERIPH_DRIVER //打开标准外设总开关3. SYSCLK_FREQ_72MHz     //选择时钟频率(默认也是该选项)4. HSE_VALUE      //选择使用外部高速时钟(默认也是该选项) 注意:stm32f10x.h文件的最后有这样的代码:#ifdefUSE_STDPERIPH_DRIVER  #include"stm32f10x_conf.h"#endifstm32f10x_conf.h中包含了所有外设的头文件,因此任意源文件只要包含了stm32f10x.h,就可以在源文件调用任意外设的函数。若有外设为使用到,在stm32f10x_conf.h注释相应部分,项目编译时就不会在编译去掉的外设。

MARK 

0
回复
2019-09-26 16:19
@ruohan
MARK 

再看看stm32F103的固件库版本的区别

STM32F10x标准外设库驱动程序更新历史记录

V3.6.1 / 2012年3月5日

主要变化

所有源文件:许可证免责声明文本更新,并在ST Internet上添加指向许可证文件的链接。

V3.6.0 / 2012年1月27日

主要变化

所有源文件:更新免责声明以添加对新许可协议的引用stm32f10x_sdio.cSDIO_SetPowerState()函数:修复POWER寄存器配置,仅允许一次访问(用于读取或写入)stm32f10x_usart.h / .C更新程序以检查溢出错误中断未决位,并添加了以下标志的定义:USART_IT_ORE_RX:如果发生溢出错误中断并且RXNEIE位置1,则设置此标志 USART_IT_ORE_ER: 如果发生溢出错误中断并且EIE位置1,则设置此标志 删除IS_USART_PERIPH_FLAG宏(不使用)stm32f10x_rtc.c更新RTC_GetCounter()函数以解决读取RTC计数器寄存器(CNTL和CNTH寄存器)并且计数器翻转时的问题stm32f10x_flash.c闪存键已从移动到stm32f10x.h文件stm32f10x_tim.cTIM_UpdateRequestConfig(): 更正函数头的注释 stm32f10x_exti.hEXTI_InitTypeDef结构:对于“ EXTI_Trigger”成员,将“ @ref EXTIMode_TypeDef”更改为“ @ref EXTITrigger_TypeDef” 

0
回复
2019-09-26 16:23
@lihui710884923
再看看stm32F103的固件库版本的区别STM32F10x标准外设库驱动程序更新历史记录V3.6.1/2012年3月5日主要变化所有源文件:许可证免责声明文本更新,并在STInternet上添加指向许可证文件的链接。V3.6.0/2012年1月27日主要变化所有源文件:更新免责声明以添加对新许可协议的引用stm32f10x_sdio.cSDIO_SetPowerState()函数:修复POWER寄存器配置,仅允许一次访问(用于读取或写入)stm32f10x_usart.h/.C更新程序以检查溢出错误中断未决位,并添加了以下标志的定义:USART_IT_ORE_RX:如果发生溢出错误中断并且RXNEIE位置1,则设置此标志 USART_IT_ORE_ER: 如果发生溢出错误中断并且EIE位置1,则设置此标志 删除IS_USART_PERIPH_FLAG宏(不使用)stm32f10x_rtc.c更新RTC_GetCounter()函数以解决读取RTC计数器寄存器(CNTL和CNTH寄存器)并且计数器翻转时的问题stm32f10x_flash.c闪存键已从移动到stm32f10x.h文件stm32f10x_tim.cTIM_UpdateRequestConfig(): 更正函数头的注释 stm32f10x_exti.hEXTI_InitTypeDef结构:对于“EXTI_Trigger”成员,将“@refEXTIMode_TypeDef”更改为“@refEXTITrigger_TypeDef” 

V3.5.0 / 2011年3月11日主要变化

§ stm32f10x_can.h / .c文件:

§ 增加5个新功能

§ 控制计数器错误的3个新函数:CAN_GetLastErrorCode(),CAN_GetReceiveErrorCounter()和CAN_GetLSBTransmitErrorCounter()。

§ 1个用于选择CAN工作模式的新函数:CAN_OperatingModeRequest()。

§ 1个支持CAN TT模式的新功能:CAN_TTComModeCmd()。

§ CAN_TransmitStatus()函数已更新,以支持所有CAN传输中间状态

§ stm32f10x_i2c.h / .c文件:

§ 增加1个新功能:

§ I2C_NACKPositionConfig():此函数与I2C_PECPositionConfig()配置相同的位(POS),但旨在在I2C模式下使用,而I2C_PECPositionConfig()用于SMBUS模式。

§ stm32f10x_tim.h / .c文件:

§ 将TIM_DMABurstLength_xBytes定义更改为TIM_DMABurstLength_xTansfers

0
回复
wxgsnake
LV.4
12
2019-09-27 18:54
挺好的 学习了 谢谢
0
回复
2019-09-30 16:31
@wxgsnake
挺好的学习了谢谢
有啥问题可以共同讨论
0
回复