打印
[技术问答]

使用IAP对LD编程

[复制链接]
56|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2025-5-25 21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* SPDX-License-Identifier: Apache-2.0                                                                     */
/* Copyright(c) 2023 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/


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


/*---------------------------------------------------------------
// Following define by customer
// Please confirm the start addresss not over your code size
//---------------------------------------------------------------*/
#define     DATA_SIZE           1024   
#define     DATA_START_ADDR     0x0000           


void main (void)
{
    unsigned char i;

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

    P12_QUASI_MODE;
   
    for (i=0;i<128;i++)
        IAPDataBuf[i]=i;

    while(P12);

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

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

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

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

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


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


使用特权

评论回复
沙发
稳稳の幸福|  楼主 | 2025-5-25 21:05 | 只看该作者
LDROM 操作流程
Erase_LDROM(DATA_START_ADDR, 128);       // 擦除 LDROM 前 128 字节
Erase_Verify_LDROM(DATA_START_ADDR, 128);// 验证是否擦除成功(全 0xFF)
Program_LDROM(DATA_START_ADDR, 128);     // 将缓冲区数据写入 LDROM
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 的未用空间。

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2025-5-25 21:07 | 只看该作者
地址范围:

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

电源稳定性:

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

保护机制:

实际产品中应增加 加密 或 签名验证,防止未授权修改。

使用特权

评论回复
6
稳稳の幸福|  楼主 | 2025-5-25 21:08 | 只看该作者
可能的改进方向
增加错误处理:

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

串**互:

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

分段操作:

支持大于 128 字节的数据(分批次处理)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

194

主题

3382

帖子

8

粉丝