”bootloader程序在跳转app程序的时候,如果bootloader程序和app程序都没有使用中断的情况下可以正常跳转,但是bootloader程序或app程序有一方面使用中断的话就会进入到hardfault_handler,而bootloader程序或app程序单独运行时没有问题。“
是程序代码写得不对吗?是程序的设置不对吗?其实这个就是中断向量表设置的问题。
中断向量表记录着中断函数的入口地址,或者可以理解为记录着中断函数的指针地址。
当嵌入式系统发生中断时,系统会加载中断函数的地址,并跳转。而我们的程序出错便在这里。
试想一下,当中断发生时,嵌入式系统加载一个非法的数值,而这个数值显示不会有对应的函数。这时,系统再跳转执行时,将会发生hardfault_handler。
原理我们理解了,接下来再看看如果设置吧!

首先,我们需要把App的起始地址由0x0800_0000变更为App的起始地址,我这里是0x0800_5000。在Keil中的这个配置将关系到程序跳转后的SP加载的PC指针。配置错误,程序无法正常跳转与运行。
其次,我们需要变更startup.s中的VTECTOR的寄存器向量地址。
经过上述两步,你的Bootloader便可以正常跳转到APP并运行了。
我要赚赏金
