STM32启动代码分析问题

来源:本站
导读:目前正在解读《STM32启动代码分析问题》的相关信息,《STM32启动代码分析问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32启动代码分析问题》的详细说明。
简介:讲解一下startup_stm32f10x_cl.s启动代码含义。

能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢!

我现在看反汇编如下

0x08000000 0678 LSLS r0,r7,#25(查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故)

0x08000002 2000 MOVS r0,#0x00

0x08000004 1105 ASRS r5,r0,#408

0x08000006 0800 LSRS r0,r0,#00A

。。。。。。。。。。。。。。。。。。。。。。

上面应该对应

__Vectors DCD __initial_sp ; Top of Stack

DCD Reset_Handler ; Reset Handler

DCD NMI_Handler ; NMI Handler

DCD HardFault_Handler ; Hard Fault Handler

DCD MemManage_Handler ; MPU Fault Handler

DCD BusFault_Handler ; Bus Fault Handler

DCD UsageFault_Handler ; Usage Fault Handler

0x08001104 4808 LDR r0,[pc,#32];程序一运行跳到这里,why?

0x08001106 4700 BX r0,r0,#0

上面对应

Reset_Handler PROC

EXPORTReset_Handler [WEAK]

IMPORT__main

LDR R0, =__main

BX R0

ENDP

那位能说一下为什么跳到0x08001104,即PC =0x08001104, 我想应该PC应该先跳到0x08000000?

解答:

cortex-M3和ARM9的架构有很大区别,ARM7、ARM9在复位后是从地址0处开始执行指令,也就是说地址0x00000000的内容是指令。而cortex-M3的异常向量表中的内容并不是指令,0x00000000处(当然也可能映射到别的范围)是主堆栈指针的数值,0x00000004的内容是复位后需要跳转到的地址,是一个地址而不是一条指令。

stm32选择flash启动方式,中断向量表映射到0x08000000,由楼主给出的反汇编可知,复位后主堆栈指针的位置是0x20000678,0x08000004位置的数值是0x08001105,由于cortex-M3只能运行在thumb2状态,所以要保证向PC(R15)写入的数值的bit0必须是1(如果向PC写入的数值的bit0是0,则处理器认为试图切入ARM状态,会产生fault),而实际上stm32的指令是半字对齐的,所以复位后会跳转到0x08001104.

提醒:《STM32启动代码分析问题》最后刷新时间 2024-03-14 01:07:44,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32启动代码分析问题》该内容的真实性请自行鉴别。