[技术问答] 使用IAP对LD编程

[复制链接]
1076|9
 楼主| 稳稳の幸福 发表于 2025-5-25 21:05 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* SPDX-License-Identifier: Apache-2.0                                                                     */
  4. /* Copyright(c) 2023 Nuvoton Technology Corp. All rights reserved.                                         */
  5. /*                                                                                                         */
  6. /*---------------------------------------------------------------------------------------------------------*/


  7. //***********************************************************************************************************
  8. //  File Function: MS51 IAP program LDROM demo code
  9. //***********************************************************************************************************
  10. #include "MG51_SDCC.H"


  11. /*---------------------------------------------------------------
  12. // Following define by customer
  13. // Please confirm the start addresss not over your code size
  14. //---------------------------------------------------------------*/
  15. #define     DATA_SIZE           1024   
  16. #define     DATA_START_ADDR     0x0000           


  17. void main (void)
  18. {
  19.     unsigned char i;

  20.     MODIFY_HIRC(HIRC_24);
  21.     Enable_UART0_VCOM_printf_24M_115200();
  22.     printf ("\n Toggle P12 to low to start test ...");

  23.     P12_QUASI_MODE;
  24.    
  25.     for (i=0;i<128;i++)
  26.         IAPDataBuf[i]=i;

  27.     while(P12);

  28.     Erase_LDROM(DATA_START_ADDR,128);
  29.     Erase_Verify_LDROM(DATA_START_ADDR,128);
  30.     Program_LDROM(DATA_START_ADDR,128);
  31.     Program_Verify_LDROM(DATA_START_ADDR,128);
  32.     while(1);
  33. }
  34. //-----------------------------------------------------------------------------------------------------------
程序功能
这是一个针对 MS51 单片机(MG51系列) 的 IAP(在应用编程) 示例代码,演示如何对 LDROM(引导加载区) 进行擦除和编程操作。

代码详细解析
1. 头文件和宏定义

  1. #include "MG51_SDCC.H"  // 包含 MS51 的头文件

  2. #define DATA_SIZE 1024      // 定义数据大小(未实际使用)
  3. #define DATA_START_ADDR 0x0000 // 定义操作起始地址(LDROM 起始地址)
MG51_SDCC.H 提供了 MS51 的寄存器定义和库函数。

宏定义了操作的数据大小(1024字节)和起始地址(0x0000),但实际代码中只操作了前128字节。


准备测试数据
  1. for (i=0; i<128; i++)
  2.     IAPDataBuf[i] = i; // 填充缓冲区(0x00~0x7F)
在 IAPDataBuf(IAP 数据缓冲区)中填入 0~127(0x00~0x7F) 的递增数据。


 楼主| 稳稳の幸福 发表于 2025-5-25 21:05 | 显示全部楼层
LDROM 操作流程
  1. Erase_LDROM(DATA_START_ADDR, 128);       // 擦除 LDROM 前 128 字节
  2. Erase_Verify_LDROM(DATA_START_ADDR, 128);// 验证是否擦除成功(全 0xFF)
  3. Program_LDROM(DATA_START_ADDR, 128);     // 将缓冲区数据写入 LDROM
  4. Program_Verify_LDROM(DATA_START_ADDR, 128);// 验证编程是否成功


擦除 LDROM:从 0x0000 开始擦除 128 字节(内容变为 0xFF)。

擦除验证:检查擦除后的区域是否全为 0xFF。

编程 LDROM:将 IAPDataBuf 中的 128 字节数据写入 LDROM。

编程验证:检查写入的数据是否正确。
 楼主| 稳稳の幸福 发表于 2025-5-25 21:06 | 显示全部楼层
关键点说明
IAP(在应用编程):

允许单片机在运行时修改自身的 LDROM(引导区) 或 APROM(用户程序区)。

常用于 固件升级 或 参数存储。

LDROM:

通常是存储 引导程序(Bootloader) 的区域。

本示例演示了如何擦除和编程这部分空间。

安全机制:

通过 P1.2 引脚电平触发,避免意外修改 LDROM。

每次操作后都有 验证步骤,确保操作成功。

数据缓冲区:

IAPDataBuf 是 IAP 操作专用的缓冲区,需提前填充数据。
 楼主| 稳稳の幸福 发表于 2025-5-25 21:07 | 显示全部楼层
实际应用场景
Bootloader 更新:通过此代码可以更新引导程序。

固件自升级:用户程序可以通过 IAP 修改自身(需谨慎设计)。

参数存储:将关键参数存储在 LDROM 的未用空间。
 楼主| 稳稳の幸福 发表于 2025-5-25 21:07 | 显示全部楼层
地址范围:

必须确保 DATA_START_ADDR 和操作长度不超过 LDROM 的实际大小。

电源稳定性:

IAP 操作期间 不能断电,否则可能导致芯片损坏。

保护机制:

实际产品中应增加 加密 或 签名验证,防止未授权修改。
 楼主| 稳稳の幸福 发表于 2025-5-25 21:08 | 显示全部楼层
可能的改进方向
增加错误处理:

检查擦除/编程是否成功,失败时重试或报警。

串**互:

通过串口接收待写入的数据(动态更新内容)。

分段操作:

支持大于 128 字节的数据(分批次处理)。
星空魔法师 发表于 2025-5-26 19:41 | 显示全部楼层
这个示例代码很实用,对于学习如何在MS51单片机上进行IAP操作非常有帮助。
暗夜幽灵骑士 发表于 2025-5-26 21:38 | 显示全部楼层
这个示例代码展示了如何使用IAP对MS51单片机的LDROM进行操作,包括擦除和编程。代码结构清晰,易于理解。
星辰伴梦 发表于 2025-5-26 22:40 | 显示全部楼层
这个示例代码很实用,特别是对于需要在应用编程(IAP)中操作LDROM的开发者来说。你已经详细解释了代码的功能和关键部分,这对于理解代码的工作原理非常有帮助。
旧年胶片 发表于 2025-8-28 12:32 | 显示全部楼层
IAP(In-Application Programming,在应用编程)是芯片在运行中对自身 Flash 编程的技术,可用于 LD(Loader,加载程序)开发。开发时,先在芯片 Bootloader 或主程序中集成 IAP 模块,通过串口、USB 等通信接口接收 LD 数据,再调用芯片 Flash 操作 API(如擦除、写入函数),将 LD 程序写入指定 Flash 地址,完成后可跳转至 LD 运行。需注意地址分配、Flash 保护解锁,确保通信稳定与数据校验,实现 LD 的在线更新或烧录。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

3450

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部