我正在为C中的嵌入式卡STM32L152RE编写引导加载程序。
在USART上发送消息时调用此引导加载程序。它调用一个中断,当收到消息时,将执行引导加载程序。
然后,我必须用计算机在USART上发送的新的十六进制代码刷新我的卡存储器,然后重新设置。
此时,我的引导加载程序能够响应中断并读取计算机发送的帧。
我只是不知道如何闪现我的记忆。我的库中有一些函数,比如:
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

我的记忆是这样安排的:
记忆
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 80K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
}

我的问题是,当我用新程序擦除flash时,如何保护bootloader不被擦除,以及如何用USART发送的HEXA代码正确地刷新flash。

最佳答案

首先,您只需确保引导加载程序位于正确的位置。这应该与硬件的需求联系起来,因为它需要知道
当数据到达时运行它的位置。
其次,引导加载程序代码当然可以检查传入的数据;它必须包含目标地址。因此,它可以分析传入的数据,并确保它不会与引导加载程序所在的位置冲突。
这:

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

看起来像整个闪存,您希望将LENGTH减小到适合引导加载程序的大小,可能是16或32 KB。

关于c - 用C语言编写STM32L1系列的自定义 bootstrap ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30776183/

10-11 16:44