我正在为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/