tag 标签: 华大单片机HC32L110

相关博文
  • 热度 4
    2022-5-11 13:13
    1700 次阅读|
    0 个评论
    通常实现 IAP 功能时,需要在设计固件程序时编写两个项目代码,第一个项目程序即 BOOT 程序不执行正常的功能操作,而只是通过某种通信方式 ( 如 USB 、 USART) 接收程序或数据,执行对第二部分代码的更新;第二个项目程序即 APP 程序用户真正的功能代码。这两部分项目代码同时烧录在 Flash 中,当芯片上电后,首先是第一个项目程序 BOOT 开始运行,它主要实现如下功能: 1) 检查是否需要对第二部 APP 程序代码进行更新 2) 如果不需要更新则转到 4 ) 3) 执行更新操作 4) 跳转到第二部分代码执行 第一部分 BOOT 代码可以通过 SWD 或者离线编程器下载到芯片 Flash 内部,第二部分 APP 和第一部分 BOOT 一起烧入芯片内部,以后需要程序更新再通过第一把 BOOT 代码更新。根据芯片系列的 Flash 存放不同地址范围,从最低地址区域开始存放 BOOT ,紧跟其后的就是 APP 程序,本篇笔记受限于芯片内部 Flash 容量,只是存放一个 APP 程序。即在芯片内部有两个程序即 BOOT 和 APP 程序。 IAP 功能具体实现 芯片程序一般从 Flash 地址 0x0000_0000 开始执行,基于 Cortex-M0+ 内核特性,内部通过中断向量表来响应中断,程序从中断向量表取出复位中断向量执行中断程序,当中断产生,芯片内部 PC 指针定位到中断向量表来取出对应的中断服务程序执行。如果没有中断产生,在芯片执行完复位中断服务程序后,跳转到 main 函数顺序执行死循环。如果有中断产生,通过中断向量表执行对应的中断服务程序。 当加入 IAP 后,芯片还是从中断向量表取出复位中断向量执行中断程序,如果没有中断产生,在芯片执行完复位中断服务程序后,跳转到 main 函数。在执行完 IAP 后,新程序的复位中断向量地址为 0x0000_0004 + BOOT 程序大小,跳转到 APP 程序的复位向量表,执行 APP 的复位中断服务程序,随后跳转到 APP 程序的 main 函数执行。 其中: BOOT 程序大小 3.5KB Para 区域存放 IAP 升级期间参数和标志占用 0.5KB APP 程序大小为 24KB Demo 程序,操作流程如下: 先将 APP 工程 HEX 下载到芯片内部 打开 BOOT 工程 HEX 下载到芯片,或者可以使用工具将两个 HEX 文件合并在一起下载到芯片内部。 使用上位机演示程序,打开串口波特率固定为 9600 。按照协议将 APP 工程的 bin 文件下载到 0x1000 开始的芯片内部,其中要求 APP 的 bin 文件小于 28KB 。 参考样例及驱动 通过上述介绍,使用演示 Demo 程序 IAP 需要特定协议。 通信协议格式如下: ///*frame:68A0A1CPage L0L1D0... DN-1 CRC0CRC1 16*/// ///*offset :0 1 2 3 4 5 6 7 8+N 9+N 10+N 11 +N*/// 头字符: 固定字符为 0x68 一个字节 地址: A0 A1 两个字节 控制码 C : 读地址为 0x15 写地址为 0x25 页地址 page : 一个字节 代表现在要操作的那个页 长度 L0 L1 : 两个字节 L0 代表高字节, L1 代表低字节,此处长度仅代表数据区域长度 数据域 D0…DN-1 : 代表读出或者写入的数据 数据校验 CRC : 采用 CRC-16 方式 , 代表数据域数据的校验。 结束符号:固定字符为 0x16 一个字节 读指令如下: 68 A0 A1 15 Page 0x00 0x00 CRC0 CRC1 16 正确回复: 68 A0 A1 95 Page 0x04 0x00 D0 ………… D1023 CRC0 CRC1 16 错误回复 68 A0A1D5 Page 0x00 0x00CRC0CRC1 16 Page 选择( 0 -- 27 ) 每次读取 1K 字节数据 写指令如下: 68 A0 A1 25 Page 04 00 D0 ………… D1023 CRC0 CRC1 16 正确回复: 68 A0 A1 A5 Page 04 00 CRC0 CRC1 16 错误回复 68 A0 A1 E5 Page 00 00 CRC0CRC1 16 Page 选择( 0 -- 27 ) 每次写 1K 字节数据 开始 IAP 升级指令 68 A0 A1 36 00 00 00 00 00 16 正确回复 68A0 A1 B6 00 000000 00 16 错误回复 68A0 A1 F6 00 000000 00 16 结束 IAP 升级指令 68 A0 A1 49 00 00 00 00 00 16 正确回复 68A0 A1 C9 00 000000 00 16 错误回复 68A0 A1 09 00 000000 00 16 发送数据帧如果发送结束到接收小于 2s, 如果超过说明 IAP 升级通信错误。 以下部分简要介绍 IAP 实现关键代码: 1 ) BOOT 实现跳转到 APP 代码: if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) // 检查栈顶地址是否合法 { jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4);//APP 程序复位地址 MSR_MSP(*(__IO uint32_t*)appxaddr); // 初始化 APP 堆栈指针 jump2app(); // 跳转到 APP 程序 } 2 ) APP 程序中断向量偏移: new_vect_tableEQU 0x00001000 ; 中断向量偏移长度 ; reset Vector table address. LDR R0, =0xE000ED08 LDR R2, =new_vect_table STR R2, ; 向量表重定义点击并拖拽以移动 总结 以上章节简要介绍了 HC32L110 系列的 IAP 控制模块基本功能,详细说明了该模块的各个功能及操作步骤,用户在实际的应用开发过程中,如果需要更深一步了解该模块的使用方法及操作事项,应以 HC32L110 的用户手册为准。本章中提到的样例既可以作为用户进一步的实验与学习,也可以在实际开发中直接应用。