当前位置:   article > 正文

STM32F429入门(四):新建工程--寄存器版_startup_stm32f429_439xx.s: error: a3903u: argument

startup_stm32f429_439xx.s: error: a3903u: argument 'dcm' not permitted for o

(一)新建一个文件夹,打开keil5--Project--New uVision project。

给自己的工程起个名字:

 保存后,选择芯片型号:

 弹出来的框的意思是,询问你是否要用keil自带的库软件,我们是不需要使用的,直接关闭:

 之后回到刚刚新建的文件夹中,新建文档,作为你的编程文件,需要一个主函数文件,以及一个后缀为.h的存放寄存器映射文件:

找到固件库STM32F4xx_DSP_StdPeriph_Lib_V1.8.0,找到Libraries,打开CMSIS,点击Device-ST-STM32F4XX-Source-Templates-arm找到下面文件:

这个文件就是芯片的底层,它是使用汇编语言编写,将这份源码复制在我们的文件中。

打开刚刚新建的工程,快速双击Source Group 1,将三个文件文件添加进工程中:

 嗯...然后就出现了一个好像大家都挺常见的问题:

.\Objects\led.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f429_439xx.o).

 这确实让一个刚入门的小白挠了挠头脑...那小白就去网上找了一些资料,最后找到了解决方法,这个错误可以通过升级keil解决,听说升级到5.17就可以解决了,这个问题是由keil的一个功能叫动态语法检查引起的,报错是keil本身的问题。解决方法是,找到keil安装目录下的UV4文件夹,搜索找到文件中的UVCC.ini文件,用记事本打开,将报错的那个头文件添加到文件内,保存后就可以了

 

 嗯...最后发现其实本质不是这个问题,而是这个问题:

 

然后我把这个头文件按照以上方法加进去UV4的那个文件中,发现也没有起作用T T。

然后我就找到了新的解决方法是点击魔法棒,C/C++选项卡,Include Paths,加入以下路径:D:\keil4\ARM\Pack\ARM\CMSIS\4.5.0\CMSIS\Include

 

然后问题...还没有解决T T,啊这...

.\Objects\led.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f429_439xx.o).

这次是这个新的问题,于是我就找到了问题所在,原因是这样的:STM32上电后首先执行启动文件startup_stm32f429_439xx.s,它里边使用汇编语言写好了基本程序,当STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境。

上电复位后先执行Reset_Handler ,里面相继调用了SystemInit函数、main函数。

错误提示 SystemInit 没有定义。从分析启动文件时知道, Reset_Handler 调用了该函数用来初始化 SMT32 系统时钟,为了简单起见,我们在 main 文件里面定义一个SystemInit 空函数,什么也不做,为的是骗过编译器,把这个错误去掉。这时再编译就没有错了。

还有一个方法就是在启动文件中把有关SystemInit 的代码注释掉也可以,不调用SystemInit 函数,直接调用main函数。

补的空函数如下:

void SystemInit(void) { }

这个启动函数可以在这里找到:

 

这个SystemInit系统函数是为了给STM32设置180M的系统时钟用的。

最后设置一下每次编译所产生的文件,我们可以定义一个文件夹专门放这类文件:

 点击魔术棒,选择该文件:

 将Lisiting也定义到一个新的文件夹,步骤如上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/454693
推荐阅读
相关标签
  

闽ICP备14008679号