STM32F4不会留在Bootloader中

时间:2019-01-08 09:31:24

标签: bootloader stm32f4

当前,我正在尝试使STM32F405从应用程序代码跳转至引导加载程序,而无需使用boot0和boot1引脚。

我已经尝试了多种方法来完成该任务,但是它总是以固件跳转到引导加载程序(至少看起来像这样)结束,并且在大约18秒钟后,固件重新启动(没有看门狗或类似的东西可能会唤醒)据我所知再次使用了芯片)。 在那18秒钟内,如果我尝试更新固件,则找不到引导加载程序。

我测试了以下内容:
1.(STM32F4 Jump to Bootloader via SoftReset and without BOOT0 and BOOT1 Pin

  • 在SRAM中设置一个值
  • 使用NVIC_SystemReset()重新启动STM32F405,以使STM32F405关闭复位条件
  • 检查SRAM中的值(如果已设置,请执行以下操作)
  • 将堆栈指针移至引导加载程序地址
  • 跳转到引导加载程序地址+ 4(0x1FFF0000 + 4)

2。

  • 在运行时调用函数JumpToBootloader()
  • 在该函数中,禁用中断,重置SysTick,重置SYSCLK,调用RCC_DeInit()
  • 将堆栈指针移动到引导程序地址
  • 跳转到引导加载程序地址+ 4(0x1FFF0000 + 4)

我发现但尚无法测试的一种方法基本上是做我在尝试1中描述的方法,但是在STM32F4xx启动文件中使用了汇编代码。 这里的问题是我发现的教程使用了无法使用的KEIL汇编器语法,因为我使用的是Atollic TrueSTUDIO,而且我对汇编器的了解不足,无法将KEIL语法更改为标准的汇编器语法。

最让我感到困惑的是,在另一个项目中,我使用了STM32F3xx(不能记住正确的编号),而我所做的基本上与尝试2相同。但是使用的是STM32F3xx的引导程序地址(0x1FFFD800 ),并且工作正常,我可以通过USB更新固件。

所以我有问题:

  1. 接下来我该怎么做才能使引导加载程序运行?
  2. 在当前情况下X秒钟后重新启动固件可能是什么原因?

1 个答案:

答案 0 :(得分:0)

几天前,我找到了造成问题的原因。

在“ system_stm32f4xx.c”中配置了I2S时钟,而在我的项目中该时钟没有被使用。

我不是100%知道为什么,但是在删除了这段代码后,一切都可以正常工作。

(对不起,我很迟才回答,有点忘记了帖子:D)