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

关于STM32F4 无法通过系统存储器地址0x1fff0000进入BootLoader引导代码

[复制链接]
月无神 提问时间:2022-5-26 20:29 / 未解决
如题,本人执行以下跳转函数,但并不能进入BootLoader引导代码,反而出现单片机复位的现象,请问是什么原因,谢谢!
static void JumpToBootloader(void)
{
        uint32_t i=0;
        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
        __IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */

        /* 关闭全局中断 */
        DISABLE_INT();

        /* 关闭滴答定时器,复位到默认值 */
        SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

        /* 设置所有时钟到默认状态,使用HSI时钟 */
        HAL_RCC_DeInit();

        /* 关闭所有中断,清除所有中断挂起标志 */
        for (i = 0; i < 8; i++)
        {
                NVIC->ICER[i]=0xFFFFFFFF;
                NVIC->ICPR[i]=0xFFFFFFFF;
        }       

        /* 使能全局中断 */
        ENABLE_INT();

        /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

        /* 设置主堆栈指针 */
        __set_MSP(*(uint32_t *)BootAddr);
       
        /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
        __set_CONTROL(0);

        /* 跳转到系统BootLoader */
        SysMemBootJump();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}

收藏 评论6 发布时间:2022-5-26 20:29

举报

6个回答
废鱼 回答时间:2022-5-27 08:47:49
很少用到这个地址,从手册中查看应该是BOOT控制启动的地址。这个应该是进入ISP程序的地址。如果是需要自己写BootLoader的程序,写到0x08000000有效范围内地址。
System memory from which the device boots in System memory boot mode
zhengwen 回答时间:2022-6-24 10:06:22
大哥,请问有解决了吗? 我测试STM32F407VET6用这段代码, 可以跳转到内置的BOOTLOADER,但换成STM32F429ZGT6就不行了,系统BootLoader地址 查了是一样的0x1FFF0000 很疑惑,不知道你的型号是?
zhengwen 回答时间:2022-6-24 11:04:17
大哥,你在你不能全局中断后加 试试。参考 https://blog.csdn.net/Simon223/article/details/107564003

36.        /* 设置重映射到系统Flash */37.        __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();我的STM32F429ZGT6加了__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); ,但STM32CubeProgrammer 连接时一直提示芯片RDP保护了,但用STLINK连接看RDP位是AA,又没保护,愁....


Screenshot 2022-06-24 105907.png
zhengwen 回答时间:2022-6-24 11:05:43
zhengwen 发表于 2022-6-24 11:04
大哥,你在你不能全局中断后加 试试。参考 https://blog.csdn.net/Simon223/article/details/107564003:

...

这样33.        /* 使能全局中断 */34.        ENABLE_INT();35.    36.        /* 设置重映射到系统Flash */37.        __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
zhengwen 回答时间:2022-6-24 15:11:05
大哥,我的已解决了,可以直接从用户代码跳转到system memory的bootloader, 再配合 STM32CubeProgrammer就可以升级程序了。我的芯片型号是:STM32F429ZGT6, 有双BANK,要加_HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();  详见 AN2606 Rev 54
Note: For STM32 devices having the Dual Bank Boot feature, to jump to system memory from
user code the user has first to remap the System Memory bootloader at address
0x00000000 using SYSCFG register (except for STM32F7 Series), then jump to bootloader.
For STM32F7 Series, the user has to disable nDBOOT and/or nDBANK features (in option
bytes), then jump to bootloader



代码详见:https://blog.csdn.net/zhengwenbang/article/details/125445658?spm=1001.2014.3001.5502

zhengwen 回答时间:2022-6-24 15:14:55
zhengwen 发表于 2022-6-24 11:05
这样33.        /* 使能全局中断 */34.        ENABLE_INT();35.    36.        /* 设置重映射到系统Flas ...

程序太久远,之前的确在初始化里面确定加了BB级保护,在跳转去BOOTLOADER前还原AA保护就行了。

实测:如果用硬件BOOT0引脚触发,不管是否有BB级保护,均能正常boot。 有可能内置的原厂BOOTLOADER里面做了处理,应该是先读取用户保护设置,然后恢复成AA无保护状态,又或许在最终再恢复成用户的保护位设置

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版