你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f722x芯片的iap跳转问题

[复制链接]
beta.guo 提问时间:2018-10-11 00:39 /
以前在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后,是可以正常运行的。各位对这种情况有什么建议没有?到底是哪里出现问题呢?

收藏 1 评论2 发布时间:2018-10-11 00:39

举报

2个回答
tanic 回答时间:2018-10-12 13:55:43
IAP没毛病,APPmain前面不用加啥东西,和正常一样写,修改systeminit中的中断向量偏移那一行即可,MDK中IROM1改成APP_ADDR就行。


评分

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

查看全部评分

huangxuejia-292 回答时间:2018-10-12 17:35:30
芯片不知道会不会有区别,
而且,你说的移植到F7,是移植完整了吗?
IAP JMP关键:
1 跳之前关中断。
2 跳到CORE,立刻重定向中断向量。
3 地址修改对。

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

评分

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

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版