.. _Example IAP_AP: 范例说明 : IAP_AP =============================== .. important:: - **固件库** 提供 **Example** 范例只是演示 **最基础** 的功能使用方法,用户需对范例理解后,自行评估产品的功能实现方法!! - HT32 LIB 固件库更新已经删除了 **IAP_AP** 范例,变更为使用 :ref:`HT32_CodeConfig ` 生成 **UART IAP** 工程 。 以下内容可供参考IAP_AP 的实现方法。 .. figure:: ../_static/image/Software/Example_IAP_AP/ht32_codeconfig_iap.png :width: 50% :align: center :alt: HT32_CodeConfig IAP_AP 范例 HT32_CodeConfig IAP_AP 范例 以下使用 **固件库** 的 **HT32F52352** KEIL5 ``IAP_Text`` 范例工程对 **IAP + AP** 进行说明。 关于 **IAP** 功能的介绍,可参考 :doc:`/Software/application_iap` 。 联合工程的使用方法 ------------------------------------------- 1. **IAP** 范例工程 : ``固件库\example\IAP\IAP_Text`` .. figure:: ../_static/image/Software/Example_IAP_AP/image001.png :width: 80% :align: center :alt: IAP_AP 范例 IAP_AP 范例 2. ``IAP_Text`` 范例工程中,分别有三个工程: - **IAP工程** ; - **AP工程** ; - **联合工程** : KEIL5 提供联合工程,可在联合工程中操作多个工程,方便联合调试。 .. figure:: ../_static/image/Software/Example_IAP_AP/image002.png :width: 80% :align: center :alt: 联合工程 联合工程 3. 打开 ``Project_52352.uvmpw`` 联合工程,在左侧 **工程窗口** 可分别操作两个工程; .. warning:: - **联合工程** 里面的 **IAP工程** 和 **AP工程** 都是独立的工程,只不过放在 **联合工程** 一起编辑,它们的工程设置也是独立的。 - **联合工程** 的工程配置,是当前 **激活工程** 的工程配置。 - **激活工程** :右键选择激活的工程,激活后工程名变成灰色,表示当前 **激活工程** 。 .. figure:: ../_static/image/Software/Example_IAP_AP/image003.png :width: 80% :align: center :alt: 激活当前工程 激活当前工程 - **联合工程** 编译时,普通编译只能编译当前工程,如需编译多个工程,要使用 **批编译** ``Batch xxx`` 功能选项。 .. figure:: ../_static/image/Software/Example_IAP_AP/image004.png :width: 50% :align: center :alt: 批编译 批编译 **IAP_AP** 框架的关联 ---------------------------------------------------------------- 要实现 **IAP_AP** 框架,需要将 **IAP工程** 和 **AP工程** 进行关联,关联主要是 **固件关联** 和 **程序关联** 。 - **固件关联** : **MCU FLASH** 划分为 **IAP区域** 和 **AP区域** ,对应的工程生成对应的 **x.hex/x.bin** ,关联到对应的 **MCU FLASH** 区域。 - **程序关联** :配置 **IAP程序** 和 **AP程序** 里面跳转到对应的区域。 .. figure:: ../_static/image/Software/Example_IAP_AP/image005.png :width: 80% :align: center :alt: **IAP_AP** 关联 **IAP_AP** 关联 固件关联 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. **IAP工程** 和 **AP工程** 都会生成对应的 **x.bin**,烧录时,需要将两个 **x.bin** 合成一个 **x.bin** ; 2. 在 **AP工程** 生成 **AP.bin**,使用 ``iap.s`` 文件关联后, **AP.bin** 会将 **IAP工程** 生成的 **IAP.bin** 包含。 - ``iap.s`` 文件配置了 **IAP.bin** 的地址, **AP工程** 生成 **x.bin** 时会包含 **IAP.bin** ,默认工程已经配置好。 .. figure:: ../_static/image/Software/Example_IAP_AP/image006.png :width: 60% :align: center :alt: iap.s iap.s 3. 在 **AP工程** 将 **IAP工程** 生成的 **IAP.bin** 包含后 ,KEIL 会通过工程设置里面的 ``Linker.lin`` ,将 **IAP.bin** 和 **AP.bin** 合并,生成 **IAP_AP.hex** 。 - ``Linker.lin`` 文件配置了 **IAP区域** 和 **AP区域** 的地址范围。 .. figure:: ../_static/image/Software/Example_IAP_AP/image007.png :width: 80% :align: center :alt: Linker.lin Linker.lin .. note:: - ``Linker.lin`` 文件中默认配置 **IAP区域** 空间为 **4KB** ,如程序量编译后超过 **4KB** ,则需要进行修改。 - ``x.lin`` 使用方法,可搜索网络资料了解。 1. 在 **AP工程** 进行 **烧录/仿真** 时,下载的是 **IAP_AP.hex**,就 **烧录** 了 **IAP & AP程序** 。 .. figure:: ../_static/image/Software/Example_IAP_AP/image008.png :width: 80% :align: center :alt: AP工程 IAP_AP.hex AP工程 IAP_AP.hex 2. **AP工程** 的输出目录 ``\HT32\52352\AP\OBJ\`` 里面是生成的 **IAP.bin** , **AP.bin** , **IAP_AP.hex** 档案 。 - 工程输出目录 ``\HT32\52352\AP\OBJ\IAP_AP.axf.bin\`` 内含 **IAP.bin** , **AP.bin** ; .. figure:: ../_static/image/Software/Example_IAP_AP/image009.png :width: 80% :align: center :alt: IAP&AP.bin 生成文件夹 IAP&AP.bin .. note:: 因 KEIL5 原因,生成的两个BIN档案无文件类型名,需要自行加上 ``.bin`` 文件类型名。 - 工程输出目录 ``\HT32\52352\AP\OBJ\`` 内含 **IAP_AP.hex** ; .. figure:: ../_static/image/Software/Example_IAP_AP/image010.png :width: 80% :align: center :alt: IAP_AP.hex 生成文件夹 IAP_AP.hex 生成文件夹 3. 生成 **IAP_AP.hex** 档,可用于量产烧录,可以一次性烧录 **IAP&AP程序** ,到此已经完成了 固件关联 / x.hex/x.bin 关联 。 .. note:: 因为 **AP工程** 生成 **IAP_AP.hex** ,需要包含 **IAP.bin** ,所以,**联合工程** 中必须先编译 **IAP工程** 生成 **IAP.bin** ,否则 **AP工程** 会无法找到 **IAP.bin** 。 程序关联 ~~~~~~~~~~~~~~~~~ 1. 在程序中,需要配置 **IAP & AP程序** 中的跳转地址,在 ``ht32_board_config.h`` 中定义了 **IAP & AP程序** 的跳转参数。 .. figure:: ../_static/image/Software/Example_IAP_AP/image011.png :width: 80% :align: center :alt: ht32_board_config.h ht32_board_config.h .. note:: **AP工程 & IAP工程** 共用一个 ``ht32_board_config.h`` 参数文件,用户自行编写时,也应如此设置,避免参数文件不一致问题。 2. **IAP程序** 中,使用 ``IAP_Go()`` 将 **AP区域** 的 ``SP`` 指针 和 ``PC`` 指针 检查正确后, ``IAP_GoCMD()`` 将值赋予当前的 ``SP`` 指针 和 ``PC`` 指针,实现程序的跳转。 .. figure:: ../_static/image/Software/Example_IAP_AP/image012.png :width: 80% :align: center :alt: Program Jump Method Program Jump Method .. warning:: **IAP程序** 使用的外设功能一定要记得要取消,不然跳转 **AP程序** 后,这些外设功能会一直有效,会造成功能异常。 3. **IAP程序** 中,使用 ``IAP_Download()`` 接收 **上位机** 下发的数据,并对 **AP区域** 的 ``FLASH`` 进行擦除和写入。 .. figure:: ../_static/image/Software/Example_IAP_AP/image013.png :width: 80% :align: center :alt: IAP_Download() IAP_Download() IAP_AP 范例操作流程 ---------------------------------------------------------------- 1. IAP_AP 范例操作前准备: - 使用仿真/烧录器,将 **IAP程序** 烧录到 **MCU** 中。 - 接口连接:电脑USB端口 <--> USB转UART板子 <--> MCU - UART端口。 2. 打开串口助手 **Tera Trem** 进行通信,根据串口打印的提示,选择 ``Updata AP`` ,然后串口一直打印出 ``CCCC`` 表示MCU在等待通讯。 .. figure:: ../_static/image/Software/Example_IAP_AP/image014.png :width: 80% :align: center :alt: 流程 1 流程 1 3. 此时,串口助手选择 **Xmodem** 发送,选择 **AP.bin** 发送,然后按提示操作。 .. figure:: ../_static/image/Software/Example_IAP_AP/image015.png :width: 60% :align: center :alt: 流程 2 流程 2 .. figure:: ../_static/image/Software/Example_IAP_AP/image016.png :width: 60% :align: center :alt: 流程 3 流程 3 .. figure:: ../_static/image/Software/Example_IAP_AP/image017.png :width: 60% :align: center :alt: 流程 4 流程 4 .. note:: **Xmodem** 发送需要串口助手的支持,可用串口助手 **Tera Trem** 或者其他有此功能的串口助手。 4. 当运行在 **AP程序** 时,需要跳转 **IAP程序** 进行升级: - **AP程序** 中,将状态变量 ``BOOT_MODE`` 幅值对应的状态,作为 **IAP&AP程序** 中的信息交换; - **AP程序** 中,使用 **软件复位函数** ``NVIC_SystemReset()`` ,复位从FLASH起始区域开始运行 **IAP程序** 。 .. figure:: ../_static/image/Software/Example_IAP_AP/image018.png :width: 80% :align: center :alt: AP程序 设置 BOOT_MODE 和 软件复位 AP程序 设置 BOOT_MODE 和 软件复位 .. figure:: ../_static/image/Software/Example_IAP_AP/image019.png :width: 80% :align: center :alt: IAP 判断 BOOT_MODE IAP 判断 BOOT_MODE .. note:: ``BOOT_MODE`` 变量 为了能在 **IAP&AP程序** 中进行信息交换,使用固定地址的定义方法 ,在 **RAM address : 0x0000 0000** 定义了 ``BOOT_MODE``。 所以在 ``Linker.lin`` 文件中,配置 **AP程序** 的 **RAM区域** 从 **0x2000 0010** 开始。 **范例说明 : IAP_AP** 常见问题,请参考 :ref:`FAQ ` 。