1

我正在用 C 语言为嵌入式卡 STM32L152RE 编写引导加载程序。在 USART 上发送消息时会调用此引导加载程序。它调用中断,并在收到消息时执行引导加载程序。然后,我必须用计算机在 USART 上发送的新 HEXA 代码刷新我的卡的内存并重置。

此时,我的引导加载程序能够响应中断并读取计算机发送的帧。

我只是不知道如何闪现我的记忆。我的库中有如下函数:FLASH_Unlock(void)、FLASH_ErasePage(uint32_t Page_Address) 和 FLASH_FastProgramWord(uint32_t Address, uint32_t Data)

我必须擦除闪存,但不是我的引导加载程序所在的部分。这就是为什么我像这样在链接器描述符中创建了一个新部分

  .bootsection :
  {
    . = ALIGN(4);
    KEEP(*(.bootsection)) /* Bootloader code */
    . = ALIGN(4);
  } >FLASH

我的记忆是这样排列的:MEMORY

{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 80K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
}

我的问题是,当我用新程序擦除闪存时,如何保护我的引导加载程序不被擦除,以及如何使用从 USART 发送的 HEXA 代码正确地闪存我的闪存。

4

1 回答 1

0

首先,您必须确保引导加载程序位于正确的位置。这应该与硬件的要求相关联,因为它需要知道它在哪里以便在数据到达时运行它。

其次,您的引导加载程序代码当然可以免费检查传入的数据;它必须包含目标地址。因此,它可以分析传入的数据并确保它不会与引导加载程序所在的位置发生冲突。

这个:

FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K

看起来像整个闪存,你想减少LENGTH到适合引导加载程序的东西,可能是 16 或 32 KB。

于 2015-06-11T09:48:03.257 回答