Lu.Shi 发表于 2019-9-2 17:28:13

KEAZ128 UART bootloader跳转应用层程序异常

如题求助,使用KEAZ128 MCU通过UART方式实现bootloader功能,根据NXP官网提供的文档,修改了icf文件配置,但是跳转应用层程序提示HardFault,如附件贴图。所以请教一下,除了修改icf配置文件,还需要修改什么配置吗?目前排除了FLASH写,UART数据传输错误,应该就是应用层程序跳转接口哪设置的不对。

zhaoyuanxian 发表于 2019-9-2 21:52:00

中断向量表需要重定向吗?

Lu.Shi 发表于 2019-9-3 09:17:13

zhaoyuanxian 发表于 2019-9-2 21:52
中断向量表需要重定向吗?

需要的,我的理解修改icf文件就是中断向量重定向,bootloader不熟悉属于新手上路,理解不对请指正哈

security 发表于 2019-9-3 09:29:57

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:31:10

本帖最后由 Lu.Shi 于 2019-9-3 10:37 编辑

security 发表于 2019-9-3 09:29
我贴一段跳转的代码,给你参考一下吧。

多谢回复,我理解的“FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR”就是应用层工程的中断起始地址,不知道理解的对否?其次,我觉得问题应该是跳转应用程序的地址应该还有什么配置的,跳转的程序是NXP官方文档提供的,估计问题可能不再这,我试了试你的方法,结果发现,执行完跳转依然是bootloader工程代码,并没有跳转到应用层程序。

security 发表于 2019-9-3 10:37:35

Lu.Shi 发表于 2019-9-3 10:31
多谢回复,我理解的“FIRMWARE_VECTOR_TABLE_ABSOLUTE_ADDR”就是应用层工程的中断起始地址,不知道理解 ...

是的,应用程序的中断向量表的地址。

Lu.Shi 发表于 2019-9-3 14:49:13

问题已解决,工程配置的时候把icf加载的不对,加载成其他工程的icf文件。上面的icf配置,跳转调用完全正确。PS:找到原因之后发现原来错的如此简单{:sweat:}

HopeTu 发表于 2019-9-24 09:13:15

Lu.Shi 发表于 2019-9-3 14:49
问题已解决,工程配置的时候把icf加载的不对,加载成其他工程的icf文件。上面的icf配置,跳转调用完全正确 ...

如此简单以致于别人很难发现{:lol:}

防滑销钉 发表于 2019-10-17 00:13:27

请问你是怎么抓到hardfault的?一般情况下bootloader和app不是两个工程吗?你在bootloader中debug,当最后调转到app之后,怎么能知道在app中发生了hardfault呢?

Lu.Shi 发表于 2019-11-3 16:46:17

防滑销钉 发表于 2019-10-17 00:13
请问你是怎么抓到hardfault的?一般情况下bootloader和app不是两个工程吗?你在bootloader中debug,当最后 ...

我是在一个工程里面,有一个外部输入,当收到标志信号就跳转到bootloader的部分,准备接收数据写flash

防滑销钉 发表于 2019-11-7 19:10:56

Lu.Shi 发表于 2019-11-3 16:46
我是在一个工程里面,有一个外部输入,当收到标志信号就跳转到bootloader的部分,准备接收数据写flash ...

能简单讲一下,怎么把bootloader 和app置于同一个工程的吗?

Lu.Shi 发表于 2019-11-14 11:17:46

防滑销钉 发表于 2019-11-7 19:10
能简单讲一下,怎么把bootloader 和app置于同一个工程的吗?

可能理解的有误差,bootloader和app是两个工程,但是我记得当时debug bootloader工程的时候程序刷写完之后,运行一会儿就hardfault了,但是能确定是跳转到app之后hardfault的
页: [1]
查看完整版本: KEAZ128 UART bootloader跳转应用层程序异常