已擦除的ADuCM355 闪存由于没有内核引导加载程序,必须首先由用户应用程序通过串行线进行编程。
用户应用程序可以实现自己的引导加载程序,提供一个用于现场自我更新的机制。实现自己的用户引导加载程序要求以适当的方式构建用户应用程序,使其适合用户引导加载程序。
本应用笔记介绍了一种实现用引导加载程序的方法(以下称为"用户引导加载程序"):将用户闪存划分为两个单独的区域,并在一个区域中实现与CrossCore ^®^ 串行闪存编程器兼容的引导加载程序。
ADUCM355背景
用户引导加载程序的实现利用了ADuCM355的以下特性。
ADuCM355具有128 kB的用户闪存,为了擦除和写保护目的,用户闪存被分为多个单独的8 kB块。
复位后,片上内核立即执行以下操作:
- 利用制造商数据引导器件。
- 评估用户闪存元数据,以确定是切换到运行用户应用程序还是留在片上内核中。
- 评估用户闪存元数据,以确定是否对用户闪存空间内的闪存块进行写保护。如果用户应用程序有效,它将应用块写保护并退出用户应用程序。如果用户应用程序无效或BM/P1.1引脚被置为有效,则它不会应用块写保护,而是留在片上内核中(内核执行图参见图7)。
留在片上内核中具有以下优点:
- 恢复。禁止用户代码运行和执行可能阻止对器件进行所需访问的操作。
- 避免写保护。无法擦除写保护块,即使批量擦除也不行。这样就避免了通过用户闪存元数据间接应用于用户闪存或通过用户应用程序执行直接应用于用户闪存的写保护。由于代码执行仍在内核中,因此可以进行用户闪存批量擦除。
用户引导加载程序的实现
用户引导加载程序放置在用户闪存的前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串行闪存编程器窗口
转换步骤
转换现有应用程序以与用户引导加载程序或用户应用程序模型一起使用时,需要执行如下步骤。
- 从GitHub下载或克隆ADuCM355软件开发套件(SDK)文件。在GitHub上搜索ADuCM355,找到aducm355-examples SDK文件。
- 在SDK中,导航至examples > DigitalDie > M355_Bootloader 。将 BootloaderConstantArray .c文件以及iar文件夹中的 user-bootloader-sample-application.icf文件复制并粘贴到要实现引导加载程序的活动项目目录中。
- 在IAR Embedded Workbench中打开所需的项目,然后在项目浏览器中右键点击应用程序文件夹,将BootloaderConstantArray.c文件添加到项目中。然后转到添加(Add) > 添加文件(Add Files) ,选择BootloaderConstantArray.c文件。用户引导加载程序以C文件提供,该C文件包含一个用来实现用户引导加载程序的C指令代码数组。还有一个自定义链接器配置文件,用以确保将此数组正确放置在0x0000 0000处。!
图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绕过用户闪存中所有软件的执行。
BM/P1.1引脚连接到EVAL-ADucM355QSPZ评估板上的开关S3。按住开关S3,随后执行复位操作(按下再释放开关S1),就会将片上内核置于引导模式。
用户引导加载程序引导模式P1.0/SYS_WAKE引脚
P1.0/SYS_WAKE引脚绕过用户闪存中可能存在的用户应用程序的执行。如果置为有效,则用户引导加载程序不检查是否存在有效的用户应用程序,而立即进入下载模式。
P1.0/SYS_WAKE引脚连接到EVAL-ADucM355QSPZ评估板上的开关S2。按住开关S2,随后执行复位操作(按下再释放开关S1),就会将用户引导加载程序置于引导模式。
图7.引导加载程序流程图
审核编辑:郭婷
-
编程器
+关注
关注
9文章
395浏览量
42304 -
应用程序
+关注
关注
37文章
3265浏览量
57677
发布评论请先 登录
相关推荐
评论