gpt4 book ai didi

c - 用C语言编写STM32L1系列的自定义bootloader

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:43 27 4
gpt4 key购买 nike

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

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

我只是不知道如何闪现我的内存。我的库中有以下功能:FLASH_Unlock(void)、FLASH_ErasePage(uint32_t Page_Address) 和 FLASH_FastProgramWord(uint32_t 地址、uint32_t 数据)

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

  .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
}

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

最佳答案

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

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

这个:

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com