- cortex-M3
- stm32F407zgt6
- 工程设置
128M 1M 512M 128K
256M 64K
- 下载设置
512M 4K
- 擦写设置
总共1MB(1024KB),8sector,1个sector为 128KB,区间为(0x00000-0x1FFFF)
-
boot 配置了(BOOT1 1 BOOT0 0)使用了 user Flash(0x08000000-0x080FFFFF)
-
大小端
stm32 属于 小端模式,比如 0x11223344 在内存中的存储为
0x08000230 : 0x11 0x22 0x33 0x44
- 代码分析
/// 代码 查找分析对象
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
;IMPORT SystemInit ;寄存器代码,不需要在这里调用SystemInit函数,故屏蔽掉,库函数版本代码,可以留下
;不过需要在外部实现SystemInit函数,否则会报错.
IMPORT __main
LDR R0, =0xE000ED88 ; 使能浮点运算 CP10,CP11 // 分析对象
// 根据 调试时出现的 Disassembly 窗口
反编译为
0x08000228 480B LDR r0,[pc,#44] ; @0x08000258
// map文件
Symbol Name Value Ov Type Size Object(Section)
.text 0x08000228 Section 68 startup_stm32f40_41xxx.o(.text)
$v0 0x08000228 Number 0 startup_stm32f40_41xxx.o(.text)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x08000228 0x08000228 0x00000044 Code RO 4 .text startup_stm32f40_41xxx.o
Symbol Name Value Ov Type Size Object(Section)
Reset_Handler 0x08000229 Thumb Code 14 startup_stm32f40_41xxx.o(.text)
说明
1.伪指令 "LDR R0, =0xE000ED88" 被编译为 "LDR r0,[pc,#44] ; @0x08000258" 0x08000258 为 [pc,#44] 的内容
2.伪指令 "LDR R0, =0xE000ED88" 在 符号 Reset_Handler 内,且被编译为 thumb指令(2字节)
3.Reset_Handler 在 .text段内, .text段 还包括除了 Reset_Handler 之外的其他内容
4.伪指令 "LDR R0, =0xE000ED88" 在 bin 文件中的位置 为 0x00000228,被烧写到stm32 主内存后,位置为0x08000228,被映射到0x00000228.(根据BOOT0BOOT1设置)
5.伪指令 "LDR R0, =0xE000ED88" 被汇编成的二进制数据为 0x480B,在内存中以小端格式存放,为0B48.
6. .text段的属性为仅读属性.
7. 为什么 Reset_Handler 的地址 为 0x08000229,而 Reset_Handler 中的 0x08000228 比 Reset_Handler 小?不是应该相等?
8. "LDR R0, =0xE000ED88"为两个字节,"ORR R1,R1,#(0xF << 20)"为四个字节
- 函数入口
Symbol Name Value Ov Type Size Object(Section)
Reset_Handler 0x08000229 Thumb Code 14 startup_stm32f40_41xxx.o(.text)
LED_Init 0x080003bd Thumb Code 48 led.o(i.LED_Init)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x080003bc 0x080003bc 0x00000040 Code RO 250 i.LED_Init led.o
LED_Init
0x080003BC 0000 MOVS r0,r0
- JMem.exe 读出来的0x00000000以及0x08000000以及bin文件以及hex文件的比较
// 前提
0x00000000-0x000FFFFF 从0 开始的 1MB 内容 被 BOOT 脚决定
aliased to Flash, system memory or SRAM depending on the BOOT pins
当前设置为
BOOT0 0
BOOT1 1
启动区域被映射为 主闪存存储器(0x08000000-0x080FFFFF)
// 结论
一样的.
--- C:\Users\admin\Desktop\data\32_mcu\mem\target.bin
+++ C:\Users\admin\Desktop\data\32_mcu\mem\data_read_08000000.bin
@@ -114,3 +114,5 @@
7047 0000 3407 0008 0000 0020 0c00 0000
c401 0008 4007 0008 0c00 0020 2c05 0000
e001 0008 0000 0000 0000 0000 0000 0000
+ffff ffff ffff ffff ffff ffff ffff ffff
+ffff ffff ffff ffff ffff ffff ffff ffff
--- C:\Users\admin\Desktop\data\32_mcu\mem\target.bin
+++ C:\Users\admin\Desktop\data\32_mcu\mem\data_read_00000000.bin
@@ -114,3 +114,5 @@
7047 0000 3407 0008 0000 0020 0c00 0000
c401 0008 4007 0008 0c00 0020 2c05 0000
e001 0008 0000 0000 0000 0000 0000 0000
+ffff ffff ffff ffff ffff ffff ffff ffff
+ffff ffff ffff ffff ffff ffff ffff ffff
data_read_08000000.bin 与 data_read_00000000.bin 没有区别