本帖最后由 liuyanhb 于 2020-7-7 14:44 编辑
接上一层
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
; ;reset NVIC if in rom debug
; LDR R0, =0x20000000
; LDR R2, =0x0
; MOVS R1, #0 ; for warning,
; ADD R1, PC,#0 ; for A1609W,
; CMP R1, R0
; BLS RAMCODE
; ; ram code base address.
; ADD R2, R0,R2 ; R2 = R0 + R2 = 0x20000000 (RAM_BASE)
; RAMCODE
; ; reset Vector table address.
; LDR R0, =0xE000ED08 ; SCB_VTOR的地址
; STR R2, [R0] ; SCB_VTOR = R2 (如果 PC 在 FALSH, R2 = 0, 否则 R2 = 0x20000000)
; 以上为MCU厂家增加的代码,其目的是:当发现PC指向RAM,设置 SCB_VTOR 为0x20000000,否则设置为0.
; SCB_VTOR默认为0,我不会让代码在RAM中运行,如果需要在C代码中修改SCB_VTOR寄存器更合理,所以注释掉以上代码。
; 且STM32的做法是:如果代码在RAM中运行,定义一个宏 VECT_TAB_SRAM ,在 SystemInit 函数中给 SCB_VTOR 赋值为RAM_BASE。
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
以上复位中断函数实际上只有4句话,其它MCU厂家的启动文件都是这样的,华大增加了一些代码被我注释掉了。
APP启动做的第一件事情就是设置向量表的地址到APP的存放开始地址。楼主的问题原因就在于,厂家的启动汇编代码里面统一设置成了0X00000000为向量表的地址,所以APP烧录到0X0地址是可以运行的,但是烧录到其它地址就不能运行了。
中断发生后CPU会去中断向量表寻找中断函数入口,如果向量表设置的还是0X0,那在APP中发生中断却执行了BOOTLOADER的中断处理函数!自然会有问题。 |
大佬,为什么我下的官方驱动库里面没有 L110 bootload的驱动历程呀,跪求分享