文章转自ADI官网,版权归属原作者一切
布景
ADuC702x 精细模仿微控制器供给了用于经过规范 PC 机上的串行端口将汇编好的程序加载到片内闪存/EE 存储器的串行下载程序,但要进入这种形式,用户需要在 ADuC702x 重置或上电时手动将 BM 引脚拉低 。想要在工业环境中晋级程序的用户一般无权拜访此引脚,因而难以经过这种办法更新运用程序。运用中编程 (IAP) 答应在不触摸电路板的情况下履行晋级。本文为 ADuC702x 用户供给了轻松晋级其程序的办法。
IAP 功用办法论
ADuC702x 出厂装备的引导加载程序坐落闪存上端从 0x0008F800 到 0x0008FFFF 的地址规模内。假如 BM 引脚已被拉低,ADuC702x 会在重置或上电周期之后主动进入这一区域。但是,BM 引脚一般在一切程序下载到闪存/EE 后会被拉高,因而在改动 BM 逻辑之前,新的程序无法下载。
为了引进一种能够在不更改 BM 引脚硬件状况的情况下将汇编好的运用代码从头下载到所需闪存地址规模的 IAP 功用,三个程序有必要定位在闪存中从 0x00080000 到 0x0008FFFF 的地址规模内,如下所示。
(1).从 0x00080000 到 0x00080FFF,IAP 功用程序。能够把它视为一个由用户规划的引导加载程序。用户能够依据 IAP 功用程序的巨细更改完毕地址。
(2).从 0x00081000 到 0x0008F7FF,用户运用程序。这是由用户规划的实践运用程序。当 IAP 功用运转时,此区域可由新的运用程序替换。
(3).从 0x0008F800 到 0x0008FFFF,出厂装备的引导加载程序。此代码已被躲藏,用户无法对其拜访。
一旦用户将 IAP 和运用程序下载到上面所示的指定区域,将按以下过程持续操作。当进行正常重置(BM 引脚已被拉高)时,履行程序会在出厂编程的内部装备代码中主动发动。之后,ADuC702x 会跳至中止向量地址 0x00000000 以履行用户的重置反常例程。默许情况下,闪存/EE 会被镜像至存储器阵列的底部。
接下来,ADuC702x 将履行 IAP 功用程序。这将初始化 UART 和定时器的硬件装备,并使 UART 接纳和发射多个中止以及一个五秒定时器中止。在此期间,ADuC702x 将会等候五秒钟,以便主机宣布晋级指令。假如 ADuC702x 在五秒钟内未收到此指令,指针会跳至 0x00081040 处的用户运用程序方位,以履行用户运用程序;这是一个正常重置操作。假如 ADuC702x 在五秒钟内收到指令,例如 0xA,它将持续履行 IAP 功用程序,将 IAP 程序复制到 SRAM,然后启用 REMAP(重映射)功用。中止向量和晋级功用均坐落 SRAM 中。在下载期间,闪存将供给存储空间。现在,ADuC702x 估计会收到来自主机的报文音讯,并将新的代码保存到闪存中从 0x00081000 到 0x0008F7FF 的用户运用程序区域。当下载完成后,IAP 功用将重置整个芯片。假如未从 UART 收到进一步的指令,指针将在五秒钟后跳至晋级后的用户运用程序。
图 1 中显现了流程图:
如图 2 所示,可将两种类型的报文从主机发送到 IAP 程序:完好报文,其间第一个字节是计数器值 0xFF,随后的 256 个字节是报文内容;或许简略报文,其间第一个字节代表报文长度,随后的字节是报文内容。例如,假如计数器值为 0x10,则报文具有 16 个字节。
下面介绍了一些有关 ARM7TDMI IAP 功用的重要注意事项。
中止矢向量表和重映射
默许情况下,ARM 中止向量会被镜像至存储器阵列的底部(0x00000000 至 0x0000001F)。链接的中止 ISR 地址坐落从 0x00000020 至 0x0000003F 的区域内。默许情况下,当发作重置时,闪存/EE 会被镜像至存储器阵列的底部。当触发中止时,内核将跳至闪存以查找 ISR 条目。但是,在晋级形式下,闪存将充任可被擦除和重写的存储器,因而将中止向量定位在闪存中会导致过错。为了防止此问题,用户有必要运用 REMAP 功用,以将 SRAM 镜像至存储器阵列的底部。这有助于从 SRAM(而不是闪存)中履行中止例程。要运用 REMAP 功用,用户有必要首先将中止向量表从闪存复制到存储器,而且 SRAM 中开端的 64 字节将不能按正常办法运用。参见图 3。
SRAM 中运转的功用
IAP 供给的功用能够在不将 BM 引脚拉低的情况下擦除和重写闪存,但内核操作需要等至所要求的读取或擦除形式完成后才干开端。为了处理此问题,请将包含 ISR 在内的一切功用放入 SRAM,并从这儿履行它们。运用 Keil uVision3 3.23 版,用户能够在 SRAM 中履行此功用,如下所示:
void Ram_Function() __ram // __ram 特点指示代码置于 RAM 中
将 RO 和 RW 段放在所需的区域。
在方针 ‘IAP_boot’”à LA 定位指令的 “Project” à “选项中,用户能够撤销选中“Use Memory Layout from Target Dialog”,并按以下所示在 “User Classes” 中分配 RO 和 RW 段:
DATA (0x10040-0x11FFF),
CODE (0x80000-0x80FFF), ConST (0x80000-0x80FFF), ERAM(0x10040-0x11FFF)
经过这样的分配,从 0x10040 到 0x11FFF 的区域能够作为 RW 段,从 0x80000 到 0x80FFF 的区域能够作为 RO 段,而且能够在 SRAM 中从 0x10040 到 0x11FFF 的区域运转功用。
用户运用程序组织。
在用户的运用程序中,RO 和 RW 应合理地分配至段。
在方针 ‘IAP_boot’”à LA 定位指令的 “Project” à “选项中,用户能够撤销选中“Use Memory Layout from Target Dialog”,并按以下所示在 “User Classes” 中分配 RO 和 RW 段:
DATA (0x10040-0x11FFF),
CODE (0x81000-0x8F7FF), ConST (0x81000-0x8F7FF)
经过这样的分配,从 0x10040 到 0x11FFF 的区域能够作为 RW 段,而且从 0x81000 到 0x8F7FF 的区域能够作为 RO 段。请注意,应修正发动代码以分配发动目标代码存储区域。为此,可在发动代码中进行如下修正:
AREA STARTUPCODE, CODE, AT 0x00081000
发动目标代码将定位在以 0x00081000 为起点的区域。在主程序中,用户有必要首先将中止向量表从闪存 0x00081000 复制到 0x0008103F,然后启用 REMAP 功用。然后,用户能够正常写入运用程序。
运用程序代码:
ADuC7020 运用程序代码
ADuC7026 运用程序代码