已擦除的ADuCM355 闪存由于没有内核引导加载程序,必须首先由用户应用程序通过串行线进行编程。
用户应用程序可以实现自己的引导加载程序,提供一个用于现场自我更新的机制。实现自己的用户引导加载程序要求以适当的方式构建用户应用程序,使其适合用户引导加载程序。
本应用笔记介绍了一种实现用引导加载程序的方法(以下称为"用户引导加载程序"):将用户闪存划分为两个单独的区域,并在一个区域中实现与CrossCore ^®^ 串行闪存编程器兼容的引导加载程序。
用户引导加载程序的实现利用了ADuCM355的以下特性。
ADuCM355具有128 kB的用户闪存,为了擦除和写保护目的,用户闪存被分为多个单独的8 kB块。
复位后,片上内核立即执行以下操作:
留在片上内核中具有以下优点:
用户引导加载程序放置在用户闪存的前8 kB中。剩余的120 kB可用于用户应用程序开发(见图1)。
图1.内存布局
用户引导加载程序是一个独立的应用程序,位于用户闪存的前8 kB中。用户应用程序必须从0x2000(即8 kB)开始执行,这需要对标准应用程序进行一些细微修改。
为了进行修改,需要使用自定义链接器配置文件,以将用户应用程序放置在用户闪存的适当区域。
自定义链接器文件的加载可以在IAR Embedded Workbench ^®^ 环境中通过访问链接器 > 配置选项卡来实现,如图5所示。完整过程参见"转换步骤"部分。
将.icf链接器脚本文件与GitHub上提供的ADuCM355标准文件进行比较,图2突出显示了一些不同之处。
图2.链接器配置文件修改
用户引导加载程序驻留在用户闪存的前8 kB中。用户引导加载程序的构建与任何其他ADuCM355应用程序一样,带有异常向量表、校验和放置以及用户闪存元数据。
用户应用程序从0x2000开始放置,应用程序可用空间减少0x2000。Cortex ^®^ -M3中断向量表位于0x2000。用户引导加载程序会更新Cortex-M3向量表偏移寄存器(VTOR)以匹配该位置。
用户闪存元数据偏移0x2000。
用户引导加载程序元数据由片上内核检查并执行相应操作。片上内核首先确保用户引导加载程序区域的有效性,然后转移控制权并将用户闪存写保护应用于用户闪存的用户引导加载程序区域。
用户应用程序元数据由用户引导加载程序检查并执行相应操作。用户引导加载程序首先确保用户应用程序区域的有效性,然后转移控制权并将用户闪存写保护应用于用户闪存的用户应用程序区域。
用户引导加载程序对用户应用程序元数据执行的检查和操作,与片上内核对用户引导加载程序元数据(或标准应用程序元数据)执行的检查和操作类型相同,仅更改所使用的地址和范围。这样,标准应用程序只需偏移0x2000便可轻松转换为由用户引导加载程序进行操作。
该协议与ADI公司的CrossCore串行闪存编程器工具兼容,后者可从www.analog.com/crosscore-utilities下载。
CrossCore串行闪存编程器工具支持几种不同的协议变体。用户引导加载程序的这种实现支持 ADuCM3027 和 ADuCM3029所实现的版本。选择Target下的ADuCM302x选项,如图3所示。
操作(Action) 支持的选项有 编程(Program) 和 擦除(Erase) 。
点击 浏览(Browse) 按钮,从 要下载的文件(File to download) 中加载用户应用程序Intel十六进制文件,然后点击 开始(Start) 按钮。
图3.CrossCore串行闪存编程器窗口
转换现有应用程序以与用户引导加载程序或用户应用程序模型一起使用时,需要执行如下步骤。
图4.添加引导加载程序
4. 在IAR Embedded Workbench中访问链接器 (Linker) 配置(Config) 选项卡,选择自定义链接器配置文件,如图5所示。选择覆盖 默认值(Override default) 框,然后浏览查找user-bootloader-sample-application.icf文件。
此更改的链接器配置文件确保用户引导加载程序和用户应用程序根据用户引导加载程序或用户应用程序模型正确放置。
图5.指定自定义链接器配置文件
5. 用户应用程序校验和的计算范围必须根据更改的内存布局加以调整。要在IAR Embedded Workbench中调整校验和计算,请转到链接器(Linker) > 校验和(Checksum) 选项卡,如图6所示。在 起始地址(Start address) 框中输入 0x2000 ,在 结束地址(End address) 框中输入 0x27FB 。
在标准应用程序中,片上内核使用此计算来检查用户闪存中应用程序的完整性。
在用户引导加载程序或用户应用程序模型中,片上内核在切换到用户引导加载程序之前先检查其完整性,用户引导加载程序在切换到用户应用程序之前先检查其完整性。
图6.校验和计算
6. 修改startup_ADuCM355.c文件。
添加以下代码行:
/* Linker provided symbols */
extern uint32_t FINAL_CRC_PAGE;
搜索NumOfCRCPages并将以下行:
__root const uint32_t NumOfCRCPages=0;
替换为以下行:
__root const uint32_t NumOfCRCPages=(uint32_t)&FINAL_CRC_PAGE;
最后一步是向主程序添加一个函数。
void __iar_init_core (void)
{
SCB->VTOR = (uint32_t)
&__vector_table;
}
此函数的作用是将VTOR指向用户固件异常表。引导加载程序已经执行此步骤,但在调试模式下,IAR Embedded Workbench会绕过运行引导加载程序的步骤。IAR Embedded Workbench调试器执行Type 0复位(硬件复位),然后将PC设置到它认为的复位向量。因此,为使中断在调试模式下工作,此函数是必需的。
现在可以正常下载和调试此应用程序。
片上内核和用户引导加载程序具有不同的引导模式引脚,这些引脚会改变各自的执行流程。
片上内核引导模式引脚的优先级高于用户引导加载程序引导模式引脚的优先级。
BM/P1.1绕过用户闪存中所有软件的执行。
BM/P1.1引脚连接到EVAL-ADucM355QSPZ评估板上的开关S3。按住开关S3,随后执行复位操作(按下再释放开关S1),就会将片上内核置于引导模式。
P1.0/SYS_WAKE引脚绕过用户闪存中可能存在的用户应用程序的执行。如果置为有效,则用户引导加载程序不检查是否存在有效的用户应用程序,而立即进入下载模式。
P1.0/SYS_WAKE引脚连接到EVAL-ADucM355QSPZ评估板上的开关S2。按住开关S2,随后执行复位操作(按下再释放开关S1),就会将用户引导加载程序置于引导模式。
图7.引导加载程序流程图
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !