KEAZ128 UART bootloader跳转应用层程序异常
如题求助,使用KEAZ128 MCU通过UART方式实现bootloader功能,根据NXP官网提供的文档,修改了icf文件配置,但是跳转应用层程序提示HardFault,如附件贴图。所以请教一下,除了修改icf配置文件,还需要修改什么配置吗?目前排除了FLASH写,UART数据传输错误,应该就是应用层程序跳转接口哪设置的不对。 中断向量表需要重定向吗? zhaoyuanxian 发表于 2019-9-2 21:52中断向量表需要重定向吗?
需要的,我的理解修改icf文件就是中断向量重定向,bootloader不熟悉属于新手上路,理解不对请指正哈 Lu.Shi 发表于 2019-9-3 09:17
需要的,我的理解修改icf文件就是中断向量重定向,bootloader不熟悉属于新手上路,理解不对请指正哈 ...
我贴一段跳转的代码,给你参考一下吧。
// 引导固件的接口的类型定义
typedef void (*pfn_load_firmware_t)(void);
void BOOT_LoadFirmware(uint32_t firmwareEntry)
{
static pfn_load_firmware_t s_loadFirmware;
static uint32_t s_stackPointer;
AlwaysDisableInterrupt();
SCB->VTOR = (uint32_t)FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR;
s_stackPointer = FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR;
__set_MSP(s_stackPointer);
__set_PSP(s_stackPointer);
s_loadFirmware = (pfn_load_firmware_t)firmwareEntry;
s_loadFirmware();
while (1)
{
;
}
} 本帖最后由 Lu.Shi 于 2019-9-3 10:37 编辑
security 发表于 2019-9-3 09:29
我贴一段跳转的代码,给你参考一下吧。
多谢回复,我理解的“FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR”就是应用层工程的中断起始地址,不知道理解的对否?其次,我觉得问题应该是跳转应用程序的地址应该还有什么配置的,跳转的程序是NXP官方文档提供的,估计问题可能不再这,我试了试你的方法,结果发现,执行完跳转依然是bootloader工程代码,并没有跳转到应用层程序。 Lu.Shi 发表于 2019-9-3 10:31
多谢回复,我理解的“FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR”就是应用层工程的中断起始地址,不知道理解 ...
是的,应用程序的中断向量表的地址。 问题已解决,工程配置的时候把icf加载的不对,加载成其他工程的icf文件。上面的icf配置,跳转调用完全正确。PS:找到原因之后发现原来错的如此简单{:sweat:} Lu.Shi 发表于 2019-9-3 14:49
问题已解决,工程配置的时候把icf加载的不对,加载成其他工程的icf文件。上面的icf配置,跳转调用完全正确 ...
如此简单以致于别人很难发现{:lol:} 请问你是怎么抓到hardfault的?一般情况下bootloader和app不是两个工程吗?你在bootloader中debug,当最后调转到app之后,怎么能知道在app中发生了hardfault呢? 防滑销钉 发表于 2019-10-17 00:13
请问你是怎么抓到hardfault的?一般情况下bootloader和app不是两个工程吗?你在bootloader中debug,当最后 ...
我是在一个工程里面,有一个外部输入,当收到标志信号就跳转到bootloader的部分,准备接收数据写flash Lu.Shi 发表于 2019-11-3 16:46
我是在一个工程里面,有一个外部输入,当收到标志信号就跳转到bootloader的部分,准备接收数据写flash ...
能简单讲一下,怎么把bootloader 和app置于同一个工程的吗? 防滑销钉 发表于 2019-11-7 19:10
能简单讲一下,怎么把bootloader 和app置于同一个工程的吗?
可能理解的有误差,bootloader和app是两个工程,但是我记得当时debug bootloader工程的时候程序刷写完之后,运行一会儿就hardfault了,但是能确定是跳转到app之后hardfault的
页:
[1]