stm32 内存

mac2022-10-06  33

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-0x000FFFFF0 开始的 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 没有区别
最新回复(0)