开始在IAR中写一个stm32l0的bootloader

Start to writing a bootloader for stm32l0 in IAR

在 IAR 中为 stm32l0 编写添加自定义引导加载程序的适当步骤是什么?以下问题不清楚:

我开始时遇到了问题。

所以 icf 将用于主要项目:

__region_ROM_start__ = 0x08000000;
__region_ROM_end__ = 0x08008FFF;

所以 icf 将用于引导加载程序项目:

__region_Bootloader_ROM_start__ = 0x08009000;
__region_Bootloader_ROM_end__ = 0x08009FFF;

关于 0xFF 的 RAM 也是一样的吗?

您不需要限制 RAM - 您可以使用所有 RAM,因为当您切换到应用程序时,将建立一个新的 运行-time 环境并且 RAM 将被重新使用。

你为bootloader预留的flash必须是从复位地址开始的整数个flash pages STM32L0有非常小的flash pages所以应该有最小的浪费,但是你不想改变它如果您的引导加载程序增长,因为那时您将不得不为新的起始地址重建您的应用程序代码,并且旧的应用程序映像将不再可加载。所以考虑给自己一点空间。

可以像任何其他 STM32L0xx 项目一样构建引导加载程序;应用程序代码 ROM 配置必须从引导加载程序上方的地址开始。例如,假设您有一个 1Kbyte 的引导加载程序:

Boot ROM Start:    0x0800 0000
Boot ROM End:      0x0800 03FF
Application Start: 0x0800 0400
Application End:   Part size dependent.

引导加载程序本身必须有确定更新可用的方法,如果更新可用,则它必须读取应用程序数据并将其写入应用程序闪存,然后它必须禁用任何可能已启用的中断,也可能需要取消初始化任何使用的外围设备(如果在切换到应用程序时它们保持活动状态可能会导致问题),然后切换到应用程序代码是制成。

如果引导加载程序和应用程序都运行来自相同的时钟配置,则可以最小化应用程序中的配置并依赖引导加载程序。这是一个小 space 节省,但不太灵活。例如,如果您使用内部 RC 振荡器制作引导加载程序 运行,它将在可能具有不同应用程序速度和时钟要求以及不同外部振荡器频率

的多个硬件设计中 portable

在 Cortex-M 上切换到应用程序非常简单,只需要将向量 table 切换到应用程序的向量 table,然后加载程序计数器 -后者需要一点汇编代码。以下是针对Cortex-M3的,可能需要适配M0+,但可能不需要:

给定以下内联汇编函数:

__asm void boot_jump( uint32_t address )
{
   LDR SP, [R0]       ;Load new stack pointer address
   LDR PC, [R0, #4]   ;Load new program counter address
}

引导加载程序因此切换到应用程序映像:

// Switch off core clock before switching vector table
SysTick->CTRL = 0 ;

// Switch off any other enabled interrupts too
...

// Switch vector table
SCB->VTOR = APPLICATION_START_ADDR ;

//Jump to start address
boot_jump( APPLICATION_START_ADDR ) ;

其中APPLICATION_START_ADDR为申请区基地址;这个地址是应用程序向量 table 的开始,它以初始堆栈指针和复位向量开始,boot_jump() 函数将它们加载到 SP 和 PC 寄存器中以启动应用程序,就好像它已经在复位时开始。应用程序的复位向量包含应用程序的执行起始地址。

您的需求可能有所不同,但根据我的经验,串行引导加载程序(使用 UART)使用 XMODEM 并解码 Intel Hex 格式的图像需要大约 4Kb 的闪存。在 STM32L0 上,您可能想要使用更简单的东西 - 如果您简单地流式传输原始二进制数据并使用硬件流控制,则 1Kb 可能是可行的(您需要控制数据流,因为擦除和编程闪存需要时间并且还会停止 CPU 来自 运行ning 因为你不能在 STM32 上写入闪存同时从中获取指令)。

另请参阅:How to jump between programs in Stellaris