位掩码“0x2FFE0000”在 STM32 UART IAP 引导加载程序中意味着什么?

问题描述 投票:0回答:1

我正在尝试了解STM32微控制器的固件更新代码。从

STM32
找到了 IAP over UART 存储库的示例代码(链接)[https://github.com/eziya/STM32F4_HAL_IAP_UART/blob/master/STM32F4_HAL_IAP_UART/Src/main.c#L112C3-L112C75]。我了解代码功能的高级视图,如下所示:

    /* Check PA0 Input */
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
    {
        FLASH_If_Init();
        Main_Menu ();
    }
    else
    {
        /* STM32F407VG MSP 0x20020000, So I've changed 0x2FFE0000 => 0x2FFD0000 */
        if (((*(__IO uint32_t*)USER_START_ADDRESS) & 0x2FFD0000 ) == 0x20000000)
        {
            /* Jump to user application */
            JumpAddress = *(__IO uint32_t*) (USER_START_ADDRESS + 4);
            JumpToApplication = (pFunction) JumpAddress;
            /* Initialize user application's Stack Pointer */
            __set_MSP(*(__IO uint32_t*) USER_START_ADDRESS);
            JumpToApplication();
        }
    }

据我了解,上述代码块检查连接到引脚的按钮是否已断言,如果已断言,则它使用 YMODEM 协议通过串行进入固件下载逻辑,否则,它检查应用程序中的 32 位值是否为OFFSET 等于 STM32 MCU SRAM 的起始地址,如果是,则知道固件闪存偏移处存在有效的应用程序二进制文件。

但是,为了检查此条件,代码使用此位掩码:

0x2FFD0000
0x2FFE0000
。我不明白这个位掩码是什么?作者是如何得出微控制器的这个位掩码的?

我意识到为 STM32F0 系列编写的原始固件代码使用

0x2FFD0000
作为位掩码,而
STM32F4XX
系列使用
0x2FFE0000
。哪些规格表应包含此信息?我查看了Datasheet、STM32应用程序开发人员手册以及ARM ARM for M-profile,但找不到任何具体细节。

flash embedded stm32 uart bootloader
1个回答
0
投票

Cortex-M4 PM0214 编程手册,第 227 页(在 SCB 部分):

enter image description here

注意,掩码 0x2FFE0000 中有一个跳过位,不会检查其值。是 0x2 <- here. Bit 28 is not checked, but bit 29 must be set to indicate that the vector table is in SRAM. At the same time, the original 0x2FFE0000 mask takes the higher bits and supposedly checks that the application start address is within RAM? The question is, why is it hardcoded and not even with some kind of #define. I suspect someone tried to write an overly clever RAM size check and it just didn't crash, but it still seems incorrect.

我建议编辑该部分并编写正确且易于理解的检查。应用程序启动应该在 RAM 内,并且向量表之后有足够的 RAM 来保存任何内容(USER_START_ADDRESS 之后有超过 128 个字节)。起始地址包含向量表,因此 USER_START_ADDRESS 应为 128 字节对齐。另外,我没有看到向量表偏移配置。由于您将堆栈指针设置为 USER_START_ADDRESS 中的任何内容,因此您还需要在实际跳转到应用程序之前设置 VTOR。

© www.soinside.com 2019 - 2024. All rights reserved.