使用C中的STM32L1系列编写自定义引导加载程序

时间:2015-06-11 09:00:33

标签: c bootloader stm32 linker-scripts flash-memory

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

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

我只是不知道如何闪现我的记忆。我的lib中有函数,如: 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代码正确闪存我的闪存。

1 个答案:

答案 0 :(得分:0)

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

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

此:

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

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