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 在 CubeMXSTM32Cube_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如何检查是不是加载了用户代码?的主要内容,如果未能解决你的问题,请参考以下文章
STM32F072B-Discovery_DfuSe_Demo_ 通过USB升级用户程序