[英]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,因为当您切换到应用程序时,将建立一个新的运行时环境并且将重复使用 RAM。
您为引导加载程序保留的闪存必须是从复位地址开始的整数闪存页面 STM32L0 具有非常小的闪存页面,因此应该尽量减少浪费,但是如果引导加载程序增长,您不想更改它,因为那样你将不得不为新的起始地址重建你的应用程序代码,并且旧的应用程序图像将不再可加载。 所以考虑给自己一点空间。
引导加载程序可以像任何其他 STM32L0xx 项目一样构建; 应用程序代码 ROM 配置必须从引导加载程序上方的地址开始。 例如,假设您有一个 1Kbyte 的引导加载程序:
Boot ROM Start: 0x0800 0000
Boot ROM End: 0x0800 03FF
Application Start: 0x0800 0400
Application End: Part size dependent.
引导加载器本身必须有确定的更新是可用的,如果有可用的更新,那么它必须读取应用数据并将其写入到应用程序闪存,它必须然后禁用可能已被启用的任何中断的手段,它可以还需要取消初始化任何使用的外围设备(如果它们在切换到应用程序时保持活动状态,则可能会导致问题),然后切换到应用程序代码。
如果引导加载程序和应用程序都从相同的时钟配置运行,则可以最大限度地减少应用程序中的配置并依赖引导加载程序。 这是一个很小的空间节省,但不太灵活。 例如,如果您使用内部 RC 振荡器使引导加载程序运行,它将可移植到多个硬件设计中,这些硬件设计可能具有不同的应用程序速度和时钟要求以及不同的外部振荡器频率
在 Cortex-M 上切换到应用程序非常简单,它只需要将向量表切换到应用程序的向量表,然后加载程序计数器 - 后者需要一些汇编代码。 以下是针对 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是应用区的基地址; 这个地址是应用程序向量表的开始,它以初始堆栈指针和复位向量开始, boot_jump()
函数将这些加载到 SP 和 PC 寄存器中以启动应用程序,就像它在复位时启动一样。 应用程序的复位向量包含应用程序的执行起始地址。
您的需求可能会有所不同,但根据我的经验,使用 XMODEM 并解码 Intel Hex 格式图像的串行引导加载程序(使用 UART)需要大约 4Kb 的闪存。 在 STM32L0 上,您可能想要使用更简单的东西 - 如果您只是将原始二进制数据流式传输并使用硬件流控制(您需要控制数据流,因为擦除和编程闪存需要时间并且还会停止 CPU 运行),那么 1Kb 可能是可行的因为您不能在 STM32 上写入闪存,同时从中获取指令)。
另请参阅: 如何在 Stellaris 中的程序之间跳转
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.