/startup_stm32f10x_md.s/startup_stm32f10x_hd.s 分别适用于小容量/中容量/大容量的STM32芯片,具体判断方法如下:
小容量:FLASH≤32K
在启动代码中,补充几点:
启动代码中的两条语句解释:
一、PROC 为子程序开始,ENDP 为子程序结束
二、[weak] 的意思是该函数优先级比较弱,如果其它地方定义了一个同名函数,那么此处的这个函数就被取代了。语法格式为 EXPORT 标号 {[WEAK]} 。EXPORT 可用GLOBAL代替。
对于_main函数的理解:
事实上,_main 和main是两个完全不同的函数!_main代码是编译器自动创建的,因此无法找到_main代码。MDK文档中有一句说明:it is automatically craated by the linker when it sees a definition of main() .大体意思可以理解为:当编译器发现定义了main函数,那么就会自动创建_main.
_main 和main的关系
_main 主要做两件事:其一,C所需的资源;其二,调用main函数。这就不难理解为什么在启动代码调用的是_main ,最后却能转到main函数中去执行的原因了。
AREA指令的理解
AREA指令是一个伪指令,用于段定义。ARM汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。
AREA参数说明:
*
*
*
READWRITE(读写)、READONLY(只读)
*
例子:开辟一个堆栈段,段名为STACK,定义为可读可写,将内存单元初始化为0,对齐方式为8字节对齐。
AREA STACK,NOINIT,READWRITE,ALIGN=3