0

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掩码是什么?

4

2 回答 2

1

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

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

...确定是否在 STM32H7A3 MPU 上加载了用户代码?

它与 MPU 没有任何共同之处

于 2021-09-09T21:59:51.730 回答
1

这个随 CubeMXSTM32Cube_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。

于 2021-09-10T11:51:16.800 回答