硬汉嵌入式论坛

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

IAP跳转很慢

[复制链接]

23

主题

336

回帖

405

积分

高级会员

积分
405
发表于 2020-7-6 21:17:34 | 显示全部楼层 |阅读模式
使用的STM32F429IGT6 1M Flash芯片
IAP跳转代码

if((((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0xFF000000) == 0x20000000) || \
            (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0xFF000000) == 0x10000000))
    {
        /* Jump to user application */
        JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
        Jump_To_Application = (pFunction)JumpAddress;
        /* Initialize user application's Stack Pointer */
#if 1
// 方法1

        __disable_irq();
        __disable_fault_irq();

#else
// 方法2
        HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
        HAL_RCC_DeInit();
        HAL_SuspendTick();
#endif
        __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
        Jump_To_Application();
        /* power off if not success */
        power_off();
    }

APP上电打开了中断
__enable_irq();
__enable_fault_irq();

用#if 1 里面的跳转,时间还比较正常
如果改成#if 0的 用方法2的话,比方法1要多等  10  秒钟左右

这个是什么情况?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2020-7-7 08:42:11 | 显示全部楼层
多等10秒,那你的程序设计有问题了。

回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-7 09:21:42 | 显示全部楼层
eric2013 发表于 2020-7-7 08:42
多等10秒,那你的程序设计有问题了。

是IAP跳转的多等了10秒,
我这边是IAP跳转前打开了LED灯,APP关灯

方法2,LED灯会多亮10秒,有11秒多,方法1就1秒左右就跳转到APP了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2020-7-7 09:31:27 | 显示全部楼层
hpxzw_foxmai 发表于 2020-7-7 09:21
是IAP跳转的多等了10秒,
我这边是IAP跳转前打开了LED灯,APP关灯

那你的程序设计的有点问题了,看我这个试试,是秒跳转的。

分享个基于STM32H7的BOOT和APP代码都使用RTX5的案例,相互之间任意跳转
https://forum.anfulai.cn/forum.p ... 7247&fromuid=58
(出处: 硬汉嵌入式论坛)

基于STM32H7的BOOT和APP代码都使用最新版uCOS-III V3.08.00的案例,相互之间任意跳转
https://forum.anfulai.cn/forum.p ... 7260&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-7 10:30:58 | 显示全部楼层
可以了,
把HAL_SuspendTick();
换成
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-29 16:51:35 | 显示全部楼层
eric2013 发表于 2020-7-7 09:31
那你的程序设计的有点问题了,看我这个试试,是秒跳转的。

分享个基于STM32H7的BOOT和APP代码都使用RT ...

版主,
         __set_PRIMASK(1);

        /* Reset SysTick */
        SysTick->CTRL = 0;
        SysTick->LOAD = 0;
        SysTick->VAL = 0;
        /* Reset clock to HSI */
//        HAL_RCC_DeInit();
        /* clear Interrupt & falg */
        for (i = 0; i < 8; i++)
        {
            NVIC->ICER=0xFFFFFFFF;
            NVIC->ICPR=0xFFFFFFFF;
        }
        __set_PRIMASK(0);
        __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
        __set_CONTROL(0); /* RTOS need */
        Jump_To_Application();

-----------------------------------------------------
我们这边的APP有IWDG看门狗,APP开机会判断是否发生复位,发生复位就有一些操作
int main(void)
{

__enable_irq();
    __enable_fault_irq();
    HAL_Init();

    if(1 == __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) || 1 == __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))   //  这里判断是否发生复位
    {
       // 这里发生了复位

        __HAL_RCC_CLEAR_RESET_FLAGS();
    }
...
}

现在发现,HAL_RCC_DeInit(); 如果IAP跳转的时候调用这一句话,APP里面的if判断就不起作用
如果屏蔽掉HAL_RCC_DeInit(); APP就可以检测到复位  

这个什么情况?解决方案是不是就是屏蔽掉HAL_RCC_DeInit






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2020-7-29 16:54:02 | 显示全部楼层
hpxzw_foxmai 发表于 2020-7-29 16:51
版主,
         __set_PRIMASK(1);

这个就是你具体程序问题了,得你自己查查了。
回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-29 16:59:13 | 显示全部楼层
eric2013 发表于 2020-7-29 16:54
这个就是你具体程序问题了,得你自己查查了。

额,这个地方不涉及程序,因为我发的main函数就是 这样,
上电初始化HAL就立刻进行判断,
所以我只能怀疑是HAL_RCC_DeInit影响了RCC_FLAG_SFTRST和RCC_FLAG_IWDGRST
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2020-7-29 17:03:07 | 显示全部楼层
hpxzw_foxmai 发表于 2020-7-29 16:59
额,这个地方不涉及程序,因为我发的main函数就是 这样,
上电初始化HAL就立刻进行判断,
所以我只能怀 ...

嗯,你自己查下吧,就不帮忙测试了。
回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-29 17:36:45 | 显示全部楼层
我这边测试,在HAL_RCC_DeInit函数前后读取标志位,的确是因为这个函数导致的,会丢掉RCC的复位标记
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2020-7-29 17:43:25 | 显示全部楼层
hpxzw_foxmai 发表于 2020-7-29 17:36
我这边测试,在HAL_RCC_DeInit函数前后读取标志位,的确是因为这个函数导致的,会丢掉RCC的复位标记

这个时候看下源码不就知道了。。。然后进一步锁定问题的位置。
回复

使用道具 举报

23

主题

336

回帖

405

积分

高级会员

积分
405
 楼主| 发表于 2020-7-29 17:47:03 | 显示全部楼层
eric2013 发表于 2020-7-29 17:43
这个时候看下源码不就知道了。。。然后进一步锁定问题的位置。

嗯,看了代码,的确是影响相关的寄存器,
我这边看看是不是得把复位状态保存到其他地方
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 19:33 , Processed in 0.042902 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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