本人是初学者,其内容是作为我的一个学习笔记,有从网上查找到的,也有一些自己的理解;我也没有系统的学习过,只能是遇到了什么就记录什么。各位大佬发现内容写错了的,请指点我一下,万分感谢!
-
Warning[25]: Label’Reset_Handler’ is defined pubweak in a section implicitly declared root
将:SECTION.text:CODE:REORDER(1)
改:SECTION .text:CODE:REORDER:NOROOT(1)或者ROOT(1)
因:7.1版本之前,section默认是noroot,但现在是root。NOROOT表示如果符号没有被关联的时候是被优化掉的,如果想不被优化则使用ROOT -
Warning[Pe223]: function “assert_param” declared implicitly
方法:在workspace中,对工程右键–>options–>C/C++ compiler -->preprocessor在Defined symbols处添加:USE_STDPERIPH_DRIVER,
STM32F10X_HD(HD可以为MD和LD,参考产品的容量,对应文件startup_stm32f10x_xx.s,xx可以为hd,md和ld)
因:在文件stm32f10x.h中看可以查找到这三句程序
这是一个条件编译语句,只有定义了USE_STDPERIPH_DRIVER,才能包含stm32f10x_conf.h文件。conf.h文件就像一个开关文件,当它被包含进主函数就相当于可以使用标准外设驱动了,这是因为其中含有对外设驱动头文件的编译预处理命令(如图)
这也就能解释,有时候我们没有将conf.h文件包含进main函数,但在编译之后还是可以调用它。我们也可以在conf.h文件中将不需要的头文件注释掉。
如果main.c文件中包含了conf.h文件,但是没有定义,在编译之后还是会报错。
然后我通过查找"STM32F10X_HD",也是在stmf10x.h文件中找到了类似的条件编译,也是只有在定义了"STM32F10X_HD",其相关代码段才能起作用。
当然"STM32F10X_MD"和"STM32F10X_LD"也是如此。 -
Warning[Pe940]: missing return statement at end of non-void function
改:提示没有返回值,一般是在函数末尾会添加一个return 0;语句。
注:如果将return语句放在if条件语句或者for循环等语句中时,也会提示没有返回值。而且调用的子函数中执行到了return语句,这时将值返回到原来调用这个子函数的代码位置继续执行,也就是说被调用的子函数的return语句之后的语句将不会被执行(可以参考break跳出循环)。
另:如果不想采用return语句进行值的传输,可以在定义指针参数,在函数执行的过程可以改变实参,以达到值的传输作用。 -
仿真在watch窗口查看变量值位not in scope
原因:在函数内部定义的变量为局部变量,用watch窗口观察时,会出现not in scope
解决:将变量定义在函数外部,成为全局变量,就能观察到变量的值;应该是因为全局变量是唯一的,而局部变量只作用于函数内部,在不同的函数内都能重复定义,观测时不清楚观测哪个函数内的变量的值 -
asm(” RPT #N || NOP”)
作用:用来延时几个时钟周期
解释:执行N+1次NOP指令,占用N+1个指令周期。正常情况下占用N+1个时钟周期;NOP指令,第四条指令即“NOP”指令,这是一条空操作指令,有调机的作用;asm允许你在你的代码中直接插入汇编语言指令 -
Keil写代码时出现warning:implicit declaration of function “XXXX“ is invalid in C99解决方法
解决:①#ifndef -> #ifdef;②头文件未包含,比如说我用到了“adc.c”里面的函数但是主函数的头文件里面没有包含到“adc.h”(主要是头文件问题);③FWLIB里面没有包含到相关的库函数,添加了就可以。 -
调试程序,使用程序,不要使用优化编译!!!!
调试程序,使用程序,不要使用优化编译!!!!
调试程序,使用程序,不要使用优化编译!!!!
-
一定需要包含头文件路径:
点击魔法棒->C/C+±>Include Paths一栏右边添加工程中用到的.h文件的路径,不然在编译和仿真时都会提示找不到该.h文件; -
地址分配
点击魔法棒->Target->
Read/Only Memory Areas(ROM存储地址):
ROM指程序存储的地址,分为片内on-chip和片外off-chip。片内一般指片内flash;
Read/Write Memory Areas(RAM存储地址):
与ROM道理一样,
根据芯片数据手册中存储空间地址映射进行配置。 -
生成Project.sct文件
在地址分配好了之后需要生成一个Project.sct文件;
点击魔法棒->Linker
先取消勾选Use Memory Layout from Target Dialog,就可以看到在Scatter File 一栏从灰色不可修改点亮文可修改状态,且自动生成一个sct文件在obj文件的输出路径下;
再重新勾选Usw Menory Layout from Target Dialog,编译工程
编译成功后就生成了一个默认的sct文件,其配置与Target页面的内存布局含义一样,再回到Options->Linker就可以点击Edit打开该sct文件