硬汉嵌入式论坛

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

[STM32H7] stm32H7B0 OTFDEC 使用困惑

[复制链接]

5

主题

19

回帖

34

积分

新手上路

积分
34
发表于 2022-9-8 15:01:59 | 显示全部楼层 |阅读模式
请教下, 目前硬件平台是STM32H7B0VB ,boot里使用了otfdec  实时解密功能,,跳转后到app后直接进入了MemManage_Handler 错误,。跳转之后的程序时可以正确读取0X900000000 映射的地址上的内容的,读取是正确的

以下是boot 的跳转代码


[C] 纯文本查看 复制代码
RT_WEAK void qbt_jump_to_app(void)
{
    OSPI_W25Qxx_MemoryMappedMode();   // 内存映射模式 
    Setup_Regions(OTFDEC_REG_MODE_INSTRUCTION_OR_DATA_ACCESSES);//  使能实时解密模块
   typedef void (*app_func_t)(void);
    uint32_t app_addr = QBOOT_APP_ADDR;
    uint32_t stk_addr = *((__IO uint32_t *)app_addr);
    app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4)));
    if ((((uint32_t)app_func & 0xff000000) != 0x90000000) || ((stk_addr & 0x2ff00000) != 0x20000000))
    {
        TextDisplay("No legitimate application", "", 1);
        return;
    }
    __disable_irq();
    HAL_DeInit();
    for(int i=0; i<128; i++)
    {
        HAL_NVIC_DisableIRQ(i);
        HAL_NVIC_ClearPendingIRQ(i);
    }
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    HAL_RCC_DeInit();
    __enable_irq();
    __set_CONTROL(0);
    __set_MSP(stk_addr);
    app_func();//Jump to application running
}

回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-9-8 15:09:44 | 显示全部楼层
[C] 纯文本查看 复制代码
Reset_Handler    PROC
                 EXPORT  Reset_Handler                    [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)


还没跳转后还没进入到__main 就触发了MemManage_Handle 中断
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-9-8 16:18:39 | 显示全部楼层
这个有个官方例子的,楼主测试是否正常。
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-9-8 18:03:04 | 显示全部楼层
目前测试了下 用了一个LED 灯的例子跳转时正常的,,
用正常的程序 跑了rt_thread的一个app 就是运行不起来
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-9-9 11:08:37 | 显示全部楼层
测试正常了  boot 跳转时 禁止全局中断就好了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-9-9 11:38:49 | 显示全部楼层
1824789902 发表于 2022-9-8 18:03
目前测试了下 用了一个LED 灯的例子跳转时正常的,,
用正常的程序 跑了rt_thread的一个app 就是运行不起 ...

那得排查下APP程序了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-9-9 13:17:33 | 显示全部楼层
1824789902 发表于 2022-9-9 11:08
测试正常了  boot 跳转时 禁止全局中断就好了

如果要禁止全局中断才正常,说明你的BOOT跳转前没有提供干净的运行环境。

这里应该搞错了。
  SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    HAL_RCC_DeInit()

要先DeInit,然后再
  SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

因为  HAL_RCC_DeInit会再开滴答
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-9-14 15:46:09 | 显示全部楼层
eric2013 发表于 2022-9-9 13:17
如果要禁止全局中断才正常,说明你的BOOT跳转前没有提供干净的运行环境。

这里应该搞错了。

感谢,确实是这个问题
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2022-9-16 13:37:23 | 显示全部楼层
想再请教下 ,内存映射模式应该如何退出来,我在boot里操作的 需要反复进入 退出内存映射模式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-9-17 00:50:38 | 显示全部楼层
1824789902 发表于 2022-9-16 13:37
想再请教下 ,内存映射模式应该如何退出来,我在boot里操作的 需要反复进入 退出内存映射模式

跳转到boot或者RAM里面运行,可以随意修改QSPI Flash的模式
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 03:48 , Processed in 0.244850 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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