STM32 demo USB-DFU boot loader如何检查是不是加载了用户代码?

Posted

技术标签:

【中文标题】STM32 demo USB-DFU boot loader如何检查是不是加载了用户代码?【英文标题】:How does STM32 demo USB-DFU boot loader check if user code is loaded?STM32 demo USB-DFU boot loader如何检查是否加载了用户代码? 【发布时间】:2021-11-06 09:27:00 【问题描述】:

STM32 HAL 演示 USB-DFU 引导加载程序包含以下代码:

/* Test if user code is programmed starting from address 0x0800C000 */
if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFC0000) == 0x20000000)

  /* Jump to user application */
  JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4);
  JumpToApplication = (pFunction) JumpAddress;

  /* Initialize user application's Stack Pointer */
  __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD);
  JumpToApplication();

这个谓词((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFC0000) == 0x20000000如何判断用户代码是否加载到STM32H7A3 MPU上? 这个神奇的 0x2FFC0000 掩码是什么?

【问题讨论】:

【参考方案1】:

这是非常简单且非常糟糕的方法。它只是检查 USBD_DFU_APP_DEFAULT_ADD 地址(初始堆栈指针值应该在哪里)的值 AND-et 与掩码是否等于某个值。

我个人总是在应用程序末尾添加 CRC32 以检查应用程序是否存在以及应用程序是否有效

...判断STM32H7A3 MPU上是否加载了用户代码?

它与 MPU 没有任何共同之处

【讨论】:

有道理。检查指针值似乎还不够。但即使 ST 在 CubeMX STM32Cube_FW_H7_V1.9.0 包中展示的那种简单方法似乎也不正确。我怀疑这个掩码值不正确,因为我的测试应用程序的第一个 MSB 字节(即第 4 个字节,因为 STM32 是小端序)似乎总是 0x24 和 0x2F & 0x24 != 0x20。换句话说,这个演示代码可能有一个错误。问题:这个掩码的正确值应该是什么?为什么? 没关系,这很明显。此示例代码验证应用程序起始地址(堆栈顶部)是否在 RAM 地址空间中 - 介于 0x20000000 和 0x2003FFFF (256k) 之间。对于 STM32H7A3,这是不正确的,因为“常规”RAM(不是 DTCRAM)从地址 0x24000000 开始,大小为 1024k。【参考方案2】:

这个随 CubeMX STM32Cube_FW_H7_V1.9.0 包分发的示例代码最初验证应用起始地址(堆栈顶部)是否位于 RAM 地址空间中 - 介于 0x20000000 和 0x2003FFFF (256k) 之间。 对于 STM32H7A3ZI MPU(例如 Nucleo-H7A3ZI-Q),这是不正确的,因为“常规”RAM(不是 DTCRAM)从地址 0x24000000 开始,大小为 1024k。看来这个 MPU 的正确检查应该是:if((stackAddr & 0x24E00000) == 0x24000000) ... 虽然我不太明白为什么 CubeMX 配置的这个 MPU 默认堆栈地址是 0x24100000,即顶部 RAM 地址 + 1。

【讨论】:

以上是关于STM32 demo USB-DFU boot loader如何检查是不是加载了用户代码?的主要内容,如果未能解决你的问题,请参考以下文章

使用Keil下载Hex文件进STM32

STM32F072B-Discovery_DfuSe_Demo_ 通过USB升级用户程序

华为云技术分享基于小熊派STM32芯片的通过MQTT上报JSON数据到华为物联网平台的自动售货机Demo解析

stm32上电跑boot吗

stm32boot应该接多大电阻

STM32 BOOT0 BOOT1 配置