如题,本人执行以下跳转函数,但并不能进入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) { } } |
很少用到这个地址,从手册中查看应该是BOOT控制启动的地址。这个应该是进入ISP程序的地址。如果是需要自己写BootLoader的程序,写到0x08000000有效范围内地址。 System memory from which the device boots in System memory boot mode
大哥,请问有解决了吗? 我测试STM32F407VET6用这段代码, 可以跳转到内置的BOOTLOADER,但换成STM32F429ZGT6就不行了,系统BootLoader地址 查了是一样的0x1FFF0000 很疑惑,不知道你的型号是?
大哥,你在你不能全局中断后加 试试。参考 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,又没保护,愁....
大哥,你在你不能全局中断后加 试试。参考 https://blog.csdn.net/Simon223/article/details/107564003: ...
这样33. /* 使能全局中断 */34. ENABLE_INT();35. 36. /* 设置重映射到系统Flash */37. __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
大哥,我的已解决了,可以直接从用户代码跳转到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
这样33. /* 使能全局中断 */34. ENABLE_INT();35. 36. /* 设置重映射到系统Flas ...
程序太久远,之前的确在初始化里面确定加了BB级保护,在跳转去BOOTLOADER前还原AA保护就行了。 实测:如果用硬件BOOT0引脚触发,不管是否有BB级保护,均能正常boot。 有可能内置的原厂BOOTLOADER里面做了处理,应该是先读取用户保护设置,然后恢复成AA无保护状态,又或许在最终再恢复成用户的保护位设置