1> 内存映射
Flash起始地址是 【0x0800 0000】
SRAM起始地址是【0x2000 0000】
2> 启动模式
STM32F103的BOOT1和BOOT0引脚,
决定哪块存储区,映射到4G内存空间【0x0000 0000】地址处。
例如
BOOT0引脚接地后,则Flash的起始地址【0x0800 0000】被映射到【0x0000 0000】处;
3> .map文件
分析.map文件看看一些关键地址,找点感觉
中断向量表的起始地址:0x0800 0000
中断向量表的结束地址:0x0800 0130
__main函数地址: 0x08000131
复位函数地址: 0x080001b1
初始化堆栈函数地址: 0x080001c9
c语言main函数地址:0x08000265
__Vectors 0x08000000
__Vectors_End 0x08000130
__main 0x08000131
Reset_Handler 0x080001b1
__user_initial_stackheap 0x080001c9
main 0x08000265
栈顶地址:0x20000660
栈底地址:0x20000260
__initial_sp 0x20000660
Stack_Mem 0x20000260
堆起始地址
HEAP 0x20000060
4> 上电启动过程
启动模式为:Flash启动;
Step 1> CPU(Cortex-M3)
从地址0x0000 0000处取栈指针(__initial_sp)赋值给堆栈指针【MSP】;
从地址0x0000 0004处取值赋值给程序计数器【PC】,指向复位函数地址;
Step 2> 复位函数
复位函数调用SystemInit(){设置时钟树} // 可省略
调用__main;
Step 3> __main函数
__main调用__user_initial_stackheap初始化堆栈;
__main函数干了不少活, 处理加载域,执行域,
建立c函数执行环境,
最后调用到用户main()函数;