找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

M487 IAP跳跳转RTT应用失败,进入hard fault

[复制链接]
yestin 发表于 2023-9-12 18:21:27 | 显示全部楼层 |阅读模式
使用新唐M487做ota,boot(非rtt代码)跳转rtt应用失败,进入hardfault.使用非rtt程序跳转是没问题的。请大神帮忙看看问题出哪了。
19cc80e594a38cd3ecce562b6034ea88.png

使用的是APRPM含IAP的配置

int main()
{
    upgradeTypedef upgradeParam;
    SYS_Init();                     /* Init System, IP clock and multi-function I/O */
    UART0_Init();                   /* Initialize UART0 */
    /* Configure SPI_FLASH_PORT as a master, MSB first, 8-bit transaction, SPI Mode-0 timing, clock is 20MHz */
    SPI_Open(SPI_FLASH_PORT, SPI_MASTER, SPI_MODE_0, 8, 20000000);
    /* Disable auto SS function, control SS signal manually. */
    SPI_DisableAutoSS(SPI_FLASH_PORT);
    SYS_UnlockReg();                   /* Unlock register lock protect */
    FMC_Open();                        /* Enable FMC ISP function */
//    printf("w25q16 ID:%04x\n", SpiFlash_ReadMidDid());
    upgradeParam = get_upgrade_mark();
    if(upgradeParam.mark == 0x01)                   //升级文件已经下载
    {   
        if(0 != copy_new_firmware(upgradeParam))    //拷贝失败,回退
        {
            restore_factory_settings();
        }
    }
    iap_load_app(APP_1_ADDR);
    while(1){}
}
跳转程序如下:

#define APP_1_ADDR                  0x00003000
void iap_load_app(__IO uint32_t appAddr)
{  
    int i;
    if (((*(__IO uint32_t*)appAddr) & 0x2FFC0000 ) == 0x20000000)
    {
        FMC_Close();                       /* Disable FMC ISP function */
        SYS_LockReg();  
        printf("Jump to application running ... \n");
        JumpAddress = *(__IO uint32_t*) (appAddr + 4);
        Jump_To_Application = (pFunc) JumpAddress;
        __disable_irq();        
        SysTick->CTRL = 0;
        SysTick->LOAD = 0;
        SysTick->VAL = 0;
        for( i=0;i<8;i++)
        {
            NVIC->ICER = 0xFFFFFFFF;
            NVIC->ICPR = 0xFFFFFFFF;
        }
        __set_MSP(*(__IO uint32_t*) appAddr);
        __set_CONTROL(0);
        __ISB();
        Jump_To_Application();//执行函数跳转
        printf("Qboot jump to application fail.\n");
    }
    else
        printf("No legitimate application.\n");
}
APP代码中,linker和utilites配置如下:
98d20c13ee61d72573fb2c0f7672c42a.png
9ed43c0422fa14b24787a1b125cb3744.png
734464a34883ed6d38316a01d0bc8d7e.png
boot代码配置的keil配置和ICP配置如下:
e83be32eb3f1756a23b5919f02a892bb.png
ec7a8f98de6edba0b506a97eaea231a4.png
b4292369a04a3ef40ee9996129c45b89.png
43b0ba9f1b4af9d4b28562d8ce14a601.png

改的简单的非rtt点灯程序就可以正常跳转
6211737ed690eafb92f6992a9ef7dabe.png

回复

使用道具 举报

admin 发表于 2023-9-13 11:56:49 | 显示全部楼层
是不是简单的程序没有用到中断,可能是中断向量表的问题    建议工程启动位置设置成APROM+ IAP    跳转前先关闭中断向量,再关闭总中断    然后设置0页映射(映射地址=app地址),再调用系统复位实现跳转
牛卧堂
回复 支持 反对

使用道具 举报

admin 发表于 2023-9-13 11:57:03 | 显示全部楼层
FMC_SetVectorPageAddr(addr); //0页映射
牛卧堂
回复 支持 反对

使用道具 举报

 楼主| yestin 发表于 2023-9-14 09:08:32 | 显示全部楼层
admin 发表于 2023-9-13 11:56
是不是简单的程序没有用到中断,可能是中断向量表的问题    建议工程启动位置设置成APROM+ IAP    跳转前先 ...

谢谢您的回答,程序现在能跳转了,但具体什么原因不知道,是RTT程序中,时钟初始化里有把PLL disable的操作,把这个操作屏蔽后就可以跳过来了
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU