开始在IAR中为stm32l0编写引导加载程序

时间:2016-10-18 09:50:49

标签: c embedded stm32 bootloader iar

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

  • 我是否制作了新的IAR项目?
    • 如果是的话,我是否像普通项目一样编写引导加载程序并只更改我原来的.icf文件,以便引导加载程序有一个小ROM和一个小RAM区域?
    • 如果不是,除了icf文件和代码之外,我还需要在IAR项目中配置什么?
  • 我需要考虑哪些其他事项?

我在开始这个时遇到了麻烦。

所以icf将用于主项目:

__region_ROM_start__ = 0x08000000;
__region_ROM_end__ = 0x08008FFF;

所以icf将用于bootloader项目:

__region_Bootloader_ROM_start__ = 0x08009000;
__region_Bootloader_ROM_end__ = 0x08009FFF;
对于约0xFF的RAM,

和同样的事情是什么?

1 个答案:

答案 0 :(得分:4)

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

您为引导加载程序保留的闪存必须是从重置地址开始的整个闪存页面STM32L0具有非常小的闪存页面,因此应该尽量减少浪费,但您不希望必须更改它如果您的引导加载程序增长,那么您将不得不为新的起始地址重建应用程序代码,旧的应用程序映像将不再可加载。所以考虑给自己一点余量。

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

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的串行引导加载程序(使用UART)和解码Intel Hex格式的图像需要大约4Kb的Flash。在STM32L0上,您可能希望使用更简单的东西 - 如果您只是简单地对原始二进制数据流进行流式处理并使用硬件流控制,则1Kb可能是可行的(您需要控制数据流,因为擦除和编程闪存需要时间并且还会阻止CPU运行因为你无法在STM32上写入闪存同时从中获取指令。)

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