stm32库函数升级设置选项寄存器启动文件加载问题Word文件下载.docx
- 文档编号:19132677
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:8
- 大小:178.89KB
stm32库函数升级设置选项寄存器启动文件加载问题Word文件下载.docx
《stm32库函数升级设置选项寄存器启动文件加载问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《stm32库函数升级设置选项寄存器启动文件加载问题Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
defined(STM32F10X_CL)
/*#defineSTM32F10X_LD*/
/*!
<
STM32F10X_LD:
STM32Lowdensitydevices*/
/*#defineSTM32F10X_LD_VL*/
STM32F10X_LD_VL:
STM32LowdensityValueLinedevices*/
/*#defineSTM32F10X_MD*/
STM32F10X_MD:
STM32Mediumdensitydevices*/
/*#defineSTM32F10X_MD_VL*/
STM32F10X_MD_VL:
STM32MediumdensityValueLinedevices*/
/*#defineSTM32F10X_HD*/
STM32F10X_HD:
STM32Highdensitydevices*/
/*#defineSTM32F10X_HD_VL*/
STM32F10X_HD_VL:
STM32Highdensityvaluelinedevices*/
/*#defineSTM32F10X_XL*/
STM32F10X_XL:
STM32XL-densitydevices*/
/*#defineSTM32F10X_CL*/
STM32F10X_CL:
STM32Connectivitylinedevices*/
#endif
该代码的是让用户根据自己所使用的芯片的存储器(flash)大小,选择相应的flash编程算法,如果用户使用的是大容量存储芯片(如STM32F103VCT6),则只需要将对应大大容量存储器前面的屏蔽符去掉即可,去掉后为:
#defineSTM32F10X_HD
其它部分代码不变。
如果使用的是中等容量的存储器芯片(如stm32f103c8t6),同样是将对应代码前面的屏蔽符去掉即可,如:
#defineSTM32F10X_MD
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_24MHz
24000000*/
/*#defineSYSCLK_FREQ_36MHz
36000000*/
/*#defineSYSCLK_FREQ_48MHz
48000000*/
/*#defineSYSCLK_FREQ_56MHz
56000000*/
#defineSYSCLK_FREQ_72MHz
72000000
由上述代码可见默认是使用72MHz的时钟频率,如果需要使用其它频率,只需做相应的修改即可,如果使用的是72MHz时钟频率可以不用配置此项。
3.
选择外部时钟(配置函数stm32f10x.h,具体配置方法如下:
defined
HSE_VALUE
#ifdefSTM32F10X_CL
#defineHSE_VALUE
((uint32_t)25000000)/*!
ValueoftheExternaloscillatorinHz*/
#else
((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,具体配置方法如下:
USE_STDPERIPH_DRIVER
/**
*@briefCommentthelinebelowifyouwillnotusetheperipheralsdrivers.
Inthiscase,thesedriverswillnotbeincludedandtheapplicationcodewill
bebasedondirectaccesstoperipheralsregisters
*/
/*#defineUSE_STDPERIPH_DRIVER*/
默认情况下STM32的标准是关闭的,如果不适用片内外设,则不要取消
/*#defineUSE_STDPERIPH_DRIVER*/的注释
,如果需要使用STM32的标准外设则需要开启固件外设,即去掉前面的屏蔽符,修改后如下:
#defineUSE_STDPERIPH_DRIVER
5.
最后一步是开启需要使用的外设(配置函数:
stm32f10x_config.h,具体配置步骤如下:
/*Includes------------------------------------------------------------------*/
/*Uncommentthelinebelowtoenableperipheralheaderfileinclusion*/
/*#include"
stm32f10x_adc.h"
stm32f10x_bkp.h"
stm32f10x_can.h"
stm32f10x_cec.h"
stm32f10x_crc.h"
stm32f10x_dac.h"
stm32f10x_dbgmcu.h"
stm32f10x_dma.h"
/*#include"
stm32f10x_exti.h"
stm32f10x_flash.h"
stm32f10x_fsmc.h"
stm32f10x_gpio.h"
stm32f10x_i2c.h"
stm32f10x_iwdg.h"
stm32f10x_pwr.h"
stm32f10x_rcc.h"
stm32f10x_rtc.h"
stm32f10x_sdio.h"
stm32f10x_spi.h"
stm32f10x_tim.h"
stm32f10x_usart.h"
stm32f10x_wwdg.h"
misc.h"
*/
/*HighlevelfunctionsforNVICandSysTick(add-ontoCMSISfunctions)*/
默认是关闭所有外设的,用户需要使用哪个外设,就将该外设前面的注释去掉即可。
到这里库函数的配置就全部介绍完毕了,建一个工程需要修改这么多配置是不是太麻烦了呢,的确是比较麻烦,最后再给大家介绍一种简单的配置方法,用宏定义配置这些参数,keilMDk
支持在编译器中添加宏定义,这里就以keilMDK为例,给大家介绍。
先在keilMDK中点击tagartoption选项,弹出如下图所示窗口:
然后点击C/C++选项,弹出如下窗口:
最后在Difine的方框中添加上需要声明的宏定义即可。
这里总结一下一般工程中需要添加的宏定义:
1.
STM32F10X_HD
//选择用户所使用芯片的存储器容量(这里选择的是大容量存储)
USE_STDPERIPH_DRIVER
//打开标准外设总开关
SYSCLK_FREQ_72MHz
//选择时钟频率(默认也是该选项)
HSE_VALUE
//选择使用外部高速时钟(默认也是该选项)
注意:
stm32f10x.h文件的最后有这样的代码:
#ifdefUSE_STDPERIPH_DRIVER
#include"
stm32f10x_conf.h"
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
SystemInit
LDR
R0,=SystemInit
BLX
R0
R0,=__main
BX
ENDP
原来在复位中断服务函数里面,调用了SystemInit这个函数,而这个函数在.s文件里面没有定义。
所以解决的办法有两个。
1,在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。
2,把
SystemInit
这三句话去掉。
至此,此问题解决。
回头看看,此问题够简单吧?
提示已经说得明明白白了,为什么这么多人不会解决呢?
我想不是因为不认识这几个单词(不认识可以XX,google啊),是懒惰和浮躁让他们失去了发现错误的能力和耐心。
这也是任何想要成功的人,所要克服的最基本的两点。
所以,还有此类问题的朋友,请看完此文后自己反省反省。
另外,请有问题的朋友尽量论坛提问。
求求你们了....
一个问题回答N次,真的很痛苦。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 库函数 升级 设置 选项 寄存器 启动 文件 加载 问题