硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1162|回复: 4
收起左侧

[BOOT/IAP] BOOT跳转应用程序问题

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2022-7-11 17:56:56 | 显示全部楼层 |阅读模式
硬汉,
问题描述:
在STM32H750XBH6的板子上,使用SRAM调试时运行一切正常,当把这个镜像文件下载到片外SFLASH时,从BOOT中启动时无法跳转成功,
跳转之前将程序文件从片外SFLASH拷贝至内部AXI RAM(0x24000000),校验也没有问题;不知道为何?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106734
QQ
发表于 2022-7-11 19:58:27 | 显示全部楼层
意思是你的程序直接在SRAM里面调试运行没问题,而从SPI Flash复制到AXI SRAM运行就不行,是这个意思吧

可以试试我这个

制作了一个通过BOOT复制APP程序到AXI SRAM运行的案例,适合H750,H7B0玩
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112748


回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2022-7-12 16:01:51 | 显示全部楼层
eric2013 发表于 2022-7-11 19:58
意思是你的程序直接在SRAM里面调试运行没问题,而从SPI Flash复制到AXI SRAM运行就不行,是这个意思吧

...

仔细看了你提供的Demo例程,大同小异,多了关Cache,添加了你提供的HAL_RCC_DeInit,VTOR在用应用程序中也有设置,这边本来希望将中断向量表复制到DTCM,占用1k,以提升点效率,我的代码如下:
typedef  void (*pFunc)(void);

/******************************************************************************
** Function Name    : boot_jump2app
** Descriptions     : Jump from Bootloader to Application
** input parameters : None
** Returned value   : None
** Global variables : None
******************************************************************************/
void boot_jump2app(void)
{           
        DisableInterrupts();
   
    /* NO.1: Feed Watchdog and Turn off LED */
        WDI_Toggle();
        RUN_LED_OFF();       
        ERR_LED_OFF();     
   
    /* Disable CPU L1 cache before jumping to code execution */
    SCB_DisableICache();
        SCB_DisableDCache();  
   
    /* Disable Systick interrupt */
    HAL_RCC_DeInit();   
   
    SysTick->CTRL   = 0;
    SysTick->LOAD   = 0;
    SysTick->VAL    = 0;
   
    for (uint8_t i = 0; i < 8; i++)
        {
                NVIC->ICER=0xFFFFFFFF;
                NVIC->ICPR=0xFFFFFFFF;
        }   
   
        EnableInterrupts();
       
        /* NO.2: Remap Vector Table */
//    memcpy((void*)D1_DTCMRAM_BASE, (void*)D1_AXISRAM_BASE, 0x400);
    SCB->VTOR   =  (uint32_t)D1_AXISRAM_BASE;
       
    /* Initialize user application's Stack Pointer & Jump to user application */
        pFunc   JumpToApplication = (pFunc)(*(__IO uint32_t*)(D1_AXISRAM_BASE + 4));

    __set_MSP(*(__IO uint32_t*)(D1_AXISRAM_BASE));
    __set_CONTROL(0);
       
        JumpToApplication();

    /* We should never get here as execution is now on user application */
    while(1);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106734
QQ
发表于 2022-7-13 15:14:18 | 显示全部楼层
wxjfish_85 发表于 2022-7-12 16:01
仔细看了你提供的Demo例程,大同小异,多了关Cache,添加了你提供的HAL_RCC_DeInit,VTOR在用应用程序中 ...

这部分看着没什么问题,别的问题你再找找。
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2022-7-13 15:57:28 | 显示全部楼层
eric2013 发表于 2022-7-13 15:14
这部分看着没什么问题,别的问题你再找找。

问题初步有了定位,就是在Boot阶段关闭了全局中断后,无法打开,调用的是__set_PRIMASK(0)
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 00:48 , Processed in 0.167948 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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