stm32库函数升级设置选项寄存器启动文件加载问题.docx

上传人:b****5 文档编号:6132442 上传时间:2023-01-04 格式:DOCX 页数:8 大小:178.89KB
下载 相关 举报
stm32库函数升级设置选项寄存器启动文件加载问题.docx_第1页
第1页 / 共8页
stm32库函数升级设置选项寄存器启动文件加载问题.docx_第2页
第2页 / 共8页
stm32库函数升级设置选项寄存器启动文件加载问题.docx_第3页
第3页 / 共8页
stm32库函数升级设置选项寄存器启动文件加载问题.docx_第4页
第4页 / 共8页
stm32库函数升级设置选项寄存器启动文件加载问题.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

stm32库函数升级设置选项寄存器启动文件加载问题.docx

《stm32库函数升级设置选项寄存器启动文件加载问题.docx》由会员分享,可在线阅读,更多相关《stm32库函数升级设置选项寄存器启动文件加载问题.docx(8页珍藏版)》请在冰豆网上搜索。

stm32库函数升级设置选项寄存器启动文件加载问题.docx

stm32库函数升级设置选项寄存器启动文件加载问题

stm32库函数配置

STM32新手学习系列-stm32库函数配置(转载)

2012-03-3023:

53

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) 

  /*#defineSTM32F10X_LD*/     /*!

STM32Lowdensitydevices*/

  /*#defineSTM32F10X_LD_VL*/  /*!

STM32LowdensityValueLinedevices*/  

  /*#defineSTM32F10X_MD*/     /*!

STM32Mediumdensitydevices*/

  /*#defineSTM32F10X_MD_VL*/  /*!

STM32MediumdensityValueLinedevices*/  

  /*#defineSTM32F10X_HD*/     /*!

STM32Highdensitydevices*/

  /*#defineSTM32F10X_HD_VL*/  /*!

STM32Highdensityvaluelinedevices*/  

  /*#defineSTM32F10X_XL*/     /*!

STM32XL-densitydevices*/

  /*#defineSTM32F10X_CL*/     /*!

STM32Connectivitylinedevices*/

#endif

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

#defineSTM32F10X_HD      /*!

STM32Highdensitydevices*/

其它部分代码不变。

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

 #defineSTM32F10X_MD      /*!

STM32Mediumdensitydevices*/

 

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

 #ifdefSTM32F10X_CL  

  #defineHSE_VALUE  ((uint32_t)25000000)/*!

 #else 

  #defineHSE_VALUE  ((uint32_t)8000000)/*!

 #endif/*STM32F10X_CL*/

#endif/*HSE_VALUE*/

注意:

STM32F10X_CL是stm32f105 和stm32f107 互联型的device,用到此器件外部要选用25MHz的晶体,由于前面的代买没有取消  /*#defineSTM32F10X_CL*/  /*!

STM32Connectivitylinedevices*/的注释,所以此处默认的外部8MHz的晶体。

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------------------------------------------------------------------*/

/*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)*/

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

 

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

先在keilMDK中点击tagartoption选项,弹出如下图所示窗口:

 

然后点击C/C++选项,弹出如下窗口:

 

最后在Difine的方框中添加上需要声明的宏定义即可。

 

 

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

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

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

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

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

 

注意:

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

#ifdefUSE_STDPERIPH_DRIVER

  #include"stm32f10x_conf.h"

#endif

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

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

 

启动文件加载问题

N多人问我这个简单的问题。

说实话,我是很烦了。

一个都不肯来论坛提问。

没办法我来个自问自答吧,摆脱烦躁的重复工作。

   由于标题不能输入过长的英文字符(但是中文字符可以),错误提示的全部信息如下:

STM32_TEST.axf:

 Error:

 L6218E:

 Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

    此问题错误提示已经十分清楚的告诉你错在哪里了,UndefinedsymbolSystemInit,翻译过来就是:

SystemInit这个符号没有定义,随后的小括号告诉你了,是在startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。

所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_md.s了。

  在此文件里面可以找到SystemInit的所在:

Reset_Handler   PROC

                EXPORT Reset_Handler            [WEAK]

    IMPORT __main

    IMPORT SystemInit

                LDR    R0,=SystemInit

                BLX    R0

                LDR    R0,=__main

                BX     R0

                ENDP

  原来在复位中断服务函数里面,调用了SystemInit这个函数,而这个函数在.s文件里面没有定义。

   所以解决的办法有两个。

  1,在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。

   2,把   

  IMPORT SystemInit 

                LDR    R0,=SystemInit

                BLX    R0

     这三句话去掉。

   

   至此,此问题解决。

   回头看看,此问题够简单吧?

提示已经说得明明白白了,为什么这么多人不会解决呢?

我想不是因为不认识这几个单词(不认识可以XX,google啊),是懒惰和浮躁让他们失去了发现错误的能力和耐心。

这也是任何想要成功的人,所要克服的最基本的两点。

   所以,还有此类问题的朋友,请看完此文后自己反省反省。

   另外,请有问题的朋友尽量论坛提问。

求求你们了....

    一个问题回答N次,真的很痛苦。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1