调试总结——(再聊bootloader中的梗)调试无法跳转置APP出现hardfault或者停在B.问题

之前有写过一篇关于IAP的博文,也顺利的启动过好多次,但是昨天用华大的芯片做boot发现始终跳转不到APP中。
现对调试做个总结:

1)调试方法问题

调试方法很重要,调试过程中需要理清思路,这一步会发生什么,下一步会发生什么,去掉冗余的步骤,尽可能的去简化,直到最直接能达到目的的方法。调试bootloader的时,可以先省掉代码搬移,直接烧录进指定地址的代码,然后直接用bootloader去跳转,不用做其他事。先确定最简单的能否实现

2)无法跳转的原因

先上段跳转代码:


void execute_firmware(uint32_t addr)
{
#ifdef __UART_EN__
	printf("execute_firmware\r\n");
#endif
	__disable_irq();
	//if(((*(uint32_t*)addr)&0x2FFE0000)==0x20000000) //0001 1111 1111 1110 0000 0000 0000 0000
	{

		JumpAddress = *(uint32_t*)(addr);
#ifdef __UART_EN__
		printf("JumpAddress1 = %x\r\n",JumpAddress);
#endif
		__set_MSP(JumpAddress);
#ifdef __UART_EN__
		printf("MSP_Address = 0x%x xxxx\r\n",JumpAddress);
#endif
		JumpAddress = *(uint32_t*) (addr + 4);

		Jump_To_Application = (pFunction) JumpAddress;
		
	//	*((volatile uint32_t*) 0xE000ED08) = addr;//矢量偏移
		SCB->VTOR = 0x0000E000;
		Jump_To_Application();
	}	
}

调试现象:

(1)中断有全部关闭,但现象依旧

(2)矢量偏移,我也是有偏移的,偏移地址正确,但现象依旧

(3)APP程序在代码中的准确性,用keil调试比对过,也是正确的,但现象依旧

(4)APP程序中中断有开启,但现象依旧

原因解释:

(1)在APP程序中的.S文件中,华大的启动文件和其他mcu有区别

               ;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
RAMCODE
              ; reset Vector table address.
                LDR     R0, =0xE000ED08   //矢量地址
                STR     R2, [R0]

                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

在SystemInit前,有对矢量进行了重置。所以代码始终跳转不到想要的地址中。

解决方法就是在APP代码中,再次对矢量进行偏移相应的地址:

int main(void)
{
	SCB->VTOR = 0x0000E000;
	__enable_irq();
	....
}

(2)在调试过程中,最好先把flash中的数据先全部清除在烧写,以防数据覆盖导致的不能成功点亮的问题

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhj258258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值