硬汉嵌入式论坛

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

[STM32H7] STM32H743IIT6跳转系统bootloader问题

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2024-1-18 16:15:40 | 显示全部楼层 |阅读模式
本帖最后由 969176707 于 2024-1-18 16:20 编辑

跳转函数如下:

ExtMem_CodeExecution.png

跳转地址:

02.png

测试结果:
1. 跳转到用户应用程序(0x08010000)可以正常运行
2. 跳转到系统bootloader(0x1FF09800)无法连接STM32CubeProgrammer

报错如下:

04.png

附上工程:
https://pan.baidu.com/s/1W3zU_uKBB4WBFkdkA-8JCw?pwd=5k3h

求教是哪里的问题,不胜感激

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-1-18 16:39:39 | 显示全部楼层
main函数里面什么都不要做,上电就之前调用这个函数跳转,看看正常不,如果也不正常,考虑换个串口线试试。另外注意,一定要是指定的串口引脚才支持系统bootloader
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2024-1-18 17:40:26 | 显示全部楼层
会不会是回到BootLoader程序之后没有把中断向量表改回来
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

山川如故

积分
18
发表于 2024-5-17 12:14:55 | 显示全部楼层
之前也遇到了这个问题,发现要调整一下顺序,否则滴答定时器关不掉,影响跳转 /*设置所有时钟到默认状态,使用HSI时钟*/ HAL_RCC_DeInit();  /*关闭滴答定时器,恢复到默认值*/ SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0;
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

山川如故

积分
18
发表于 2024-5-17 22:45:39 | 显示全部楼层
解决STM32单片机从用户程序App无法成功跳转到系统Bootloader实现USB固件升级的问题,可以参考新写的CSDN博客, https://blog.csdn.net/weixin_432 ... 1001.2014.3001.5501
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2024-8-31 17:40:05 | 显示全部楼层
最好的办法就是app和IAP编写同样的中断,比如app会开到定时器1,但是IAP不用,那就IAP移植一下中断函数,然后函数里面清除关闭中断。以此类推,这样IAP就不需要考虑外设中断了入口了。因为都有处理。只不过IAP没有什么逻辑,除了关闭还是关闭。而APP就有逻辑。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-3-27 21:48:49 | 显示全部楼层
我最近遇到的这个无法跳转的问题,发现是开了MPU后,跳转无法进入USB DFU,我的mpu配置是:
void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};
  HAL_MPU_Disable();

  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x0;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.SubRegionDisable = 0x87;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);

        //Strongly ordered memory
        //程序完全按照代码顺序执行,MCU需要等待当前的加载/存储指令执行完毕后才执行下一条指令
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x64000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable =MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);

        //配置为不开cache缓存,如果开了,dma搬到sram的是最新的,需要调用无效化,将数据更新到cache中,后续再从cache中读取
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x24000000; //0x80000 = 512KB
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);   

  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
main程序里的是
  MPU_Config();
  SCB_EnableICache();
  SCB_EnableDCache();
JumpToBootloader(); //这个的实现,是完全复制自硬汉的,但是如果不关闭 mpu,跳转是不行的,可行方案是:
        while(1) //上电前按下按键,进入系统boot用于固件升级
        {
                if(K1_PRESS()==RESET)
                {
                        delay_ms(50);
                        if(K1_PRESS()==RESET)
                        {
                                //https://www.armbbs.cn/forum.php?mod=viewthread&tid=96518&highlight=%CF%B5%CD%B3boot
                                HAL_MPU_Disable(); //MPU一定要关闭,否则无法进入系统boot
                                SCB_DisableICache();
                                SCB_DisableDCache();
                               
                                JumpToBootloader();
                        }
                }else break;
        }       
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2025-3-28 09:01:41 | 显示全部楼层
1。排除硬件问题,比如楼上说的串口引脚,
2。软件方面,跳转前尽可能的还原到系统初始化状态,外设该关的要关,系统相关的配置,该还原的要还原。
3。推栈SP要切换,还要检查当前处于什么模式下(主线程或异常),不要在中断里跳转。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-3-28 09:42:40 | 显示全部楼层
穹顶之下2018 发表于 2025-3-27 21:48
我最近遇到的这个无法跳转的问题,发现是开了MPU后,跳转无法进入USB DFU,我的mpu配置是:
void MPU_Conf ...

这个配置注释掉试试

MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x0;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.SubRegionDisable = 0x87;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 22:09 , Processed in 0.342036 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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