请选择 进入手机版 | 继续访问电脑版
查看: 146|回复: 2

[已解决] stm32f722x芯片的iap跳转问题

[复制链接]

该用户从未签到

1

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2018-10-11
发表于 2018-10-11 00:39:37 | 显示全部楼层 |阅读模式
以前在stm32的f0和f4系列单片机中实现了完整的基于uart的iap处理,包括iap程序,和app程序,通过下面的函数调用就能直接跳转到app运行。
static void jump_to_app(void)
{
    if(((*(__IO uint32_t *)FLASH_APP_ADDR) & 0x2FFE0000) == 0x20000000)        //检查栈顶地址是否合法.0x20000000是sram的起始地址,也是程序的栈顶地址
    {
        //DeInit();
        jump2func = (iapfun) * (__IO uint32_t *)(FLASH_APP_ADDR + 4);        //用户代码区第二个字为程序开始地址(复位地址)
        __set_MSP(*(__IO uint32_t *)FLASH_APP_ADDR);                                //初始化应用堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        jump2func();                                                                        //跳转到应用.
    }
}

在app的main函数最前面调用下面函数
#if   (defined ( __CC_ARM ))
__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#elif (defined (__ICCARM__))
#pragma location = 0x20000000
__no_init __IO uint32_t VectorTable[48];
#elif defined   (  __GNUC__  )
__IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));
#elif defined ( __TASKING__ )
__IO uint32_t VectorTable[48] __at(0x20000000);
#endif
void iap_app_init(void)
{
    uint32_t i = 0;

    /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/
    /* Copy the vector table from the Flash (mapped at the base of the application
       load address 0x08003000) to the base address of the SRAM at 0x20000000. */
    for(i = 0; i < 48; i++)
    {
        VectorTable[i] = *(__IO uint32_t *)(FLASH_APP_ADDR + (i << 2));
    }

    /* Enable the SYSCFG peripheral clock*/
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    __HAL_RCC_SYSCFG_CLK_ENABLE();
    /* Remap SRAM at 0x00000000 */
    //SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
    __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM();

}
在iap中,调用上面的jump_to_app函数就能成功跳转到app程序。
现在想把该框架移植到stm32f722x芯片上,结果调用jump_to_app函数后就死掉了,不会运行app的代码。我把app的keil工程的IROM1起始地址修改成0800000后,直接烧写到08000000后,是可以正常运行的。各位对这种情况有什么建议没有?到底是哪里出现问题呢?

  ST全新域名已上线,大家奔走相告>>                    
回复

使用道具 举报

该用户从未签到

14

主题

146

帖子

47

蝴蝶豆

高级会员

最后登录
2018-10-20
发表于 2018-10-12 13:55:43 | 显示全部楼层
IAP没毛病,APPmain前面不用加啥东西,和正常一样写,修改systeminit中的中断向量偏移那一行即可,MDK中IROM1改成APP_ADDR就行。


评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

18

主题

95

帖子

52

蝴蝶豆

高级会员

最后登录
2018-10-21
发表于 2018-10-12 17:35:30 | 显示全部楼层
芯片不知道会不会有区别,
而且,你说的移植到F7,是移植完整了吗?
IAP JMP关键:
1 跳之前关中断。
2 跳到CORE,立刻重定向中断向量。
3 地址修改对。

可以参考:http://www.stmcu.org.cn/module/forum/thread-617410-1-1.html

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

  ST全新域名已上线,大家奔走相告>>                    
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|意法半导体STM32/STM8技术社区

GMT+8, 2018-10-21 12:35 , Processed in 0.078409 second(s), 10 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表