[技术问答] 请问谁有NC029单片机 IAP升级的代码

[复制链接]
2167|9
 楼主| nuc990 发表于 2025-6-10 10:46 | 显示全部楼层 |阅读模式
请问谁有NC029单片机 IAP升级的代码,谢谢
guijial511 发表于 2025-6-11 08:12 来自手机 | 显示全部楼层
什么接口的IAP,串口还是啥?
 楼主| nuc990 发表于 2025-6-11 09:40 | 显示全部楼层
guijial511 发表于 2025-6-11 08:12
什么接口的IAP,串口还是啥?

串口升级
逆鳞风暴 发表于 2025-6-12 09:51 | 显示全部楼层
我这里有些基础的IAP升级代码示例,需要的话可以分享给你,不过可能需要你根据实际情况调整一下。
瞌睡虫本虫 发表于 2025-6-12 12:39 | 显示全部楼层
IAP升级是一种在线升级程序的方法,NC029单片机支持IAP功能,但具体的代码实现需要根据你的硬件配置和需求来编写。
时光贩卖机 发表于 2025-6-12 13:31 | 显示全部楼层
您好,IAP升级代码通常需要根据具体的硬件和需求定制,不过我可以提供一些基本的IAP升级流程和示例代码,您可以参考一下。
永久冻结 发表于 2025-7-28 19:35 | 显示全部楼层
可以参考这个例程实现了 NC029 单片机的 IAP(在应用编程)功能,主要包括:

扇区擦除函数 - 对指定扇区进行擦除操作
字节编程函数 - 向 Flash 写入单个字节数据
接收升级数据并写入 Flash 的主函数 - 实现完整升级流程
#include "NC029.h"

// IAP功能相关寄存器定义
#define IAP_CONTR   (*(volatile unsigned char *)0xC7)  // IAP控制寄存器
#define IAP_CMD     (*(volatile unsigned char *)0xC8)  // IAP命令寄存器
#define IAP_ADDRH   (*(volatile unsigned char *)0xC9)  // IAP地址高字节
#define IAP_ADDRL   (*(volatile unsigned char *)0xCA)  // IAP地址低字节
#define IAP_DATA    (*(volatile unsigned char *)0xCB)  // IAP数据寄存器
#define IAP_TRIG    (*(volatile unsigned char *)0xCC)  // IAP触发寄存器

// IAP命令码
#define CMD_IDLE    0       // 无操作
#define CMD_READ    1       // 读Flash
#define CMD_PROGRAM 2       // 写Flash
#define CMD_ERASE   3       // 擦除Flash

// 扇区擦除函数
void IAP_EraseSector(unsigned int sectorAddr) {
    IAP_CONTR = 0x81;       // 使能IAP,设置等待时间
    IAP_CMD = CMD_ERASE;    // 擦除命令
    IAP_ADDRH = (unsigned char)(sectorAddr >> 8);
    IAP_ADDRL = (unsigned char)sectorAddr;

    EA = 0;                 // 关中断
    IAP_TRIG = 0x5A;        // 触发序列
    IAP_TRIG = 0xA5;
    __asm NOP __endasm;     // 等待命令执行
    EA = 1;                 // 开中断
}

// 字节编程函数
void IAP_ProgramByte(unsigned int addr, unsigned char dat) {
    IAP_CONTR = 0x81;       // 使能IAP,设置等待时间
    IAP_CMD = CMD_PROGRAM;  // 编程命令
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)addr;
    IAP_DATA = dat;

    EA = 0;                 // 关中断
    IAP_TRIG = 0x5A;        // 触发序列
    IAP_TRIG = 0xA5;
    __asm NOP __endasm;     // 等待命令执行
    EA = 1;                 // 开中断
}

// 接收升级数据并写入Flash
void Receive_And_Update(void) {
    unsigned int updateAddr = 0x2000;  // 应用程序起始地址
    unsigned char dataBuf[128];        // 数据缓冲区
    unsigned char dataLen;
    unsigned char i;

    // 擦除应用程序区
    for (i = 0; i < 8; i++) {  // 假设应用程序区占8个扇区
        IAP_EraseSector(updateAddr + i * 512);
    }

    // 模拟接收数据并写入Flash
    while (1) {
        // 从串口接收数据,实际应用中需根据通信协议实现
        dataLen = UART_Receive(dataBuf, 128);
        if (dataLen == 0) break;

        // 写入Flash
        for (i = 0; i < dataLen; i++) {
            IAP_ProgramByte(updateAddr++, dataBuf[i]);
        }
    }

    // 重启系统
    IAP_CONTR = 0x82;  // 系统复位
}   


神明祷告 发表于 2025-9-21 15:10 | 显示全部楼层
NC029 的 IAP 升级代码需分两部分:1. 应用程序中通过串口 / SPI 接收新固件,校验后写入 Flash 特定区域;2. Bootloader 程序判断升级标志,若有则跳转至新固件执行。关键是配置 Flash 读写函数,处理中断向量表重映射,确保升级安全。可参考新唐官方 IAP 例程修改。
今夜限定月光 发表于 2025-9-23 18:20 | 显示全部楼层
NC029 单片机的 IAP 升级代码通常包含 bootloader 和应用程序两部分。bootloader 负责接收新固件(如通过串口),擦除 Flash 特定区域后写入,再跳转至新程序。需注意 Flash 操作时序、地址分配及跳转指令。可参考新唐官方例程修改,确保校验和验证与异常处理。
一点点晚风 发表于 2025-10-4 13:08 | 显示全部楼层
NC029 单片机的 IAP 升级代码需结合其 Flash 操作特性编写,目前公开的现成代码较少。可参考新唐官方提供的 IAP 示例框架(如 M0 系列通用模板),核心步骤包括:划分 Flash 为 Boot 区和用户区,通过 UART/SPI 接收固件数据,校验后调用 Flash 擦写函数写入,最后跳转至用户程序。需注意 NC029 的 Flash 操作时序和地址映射,建议查阅其数据手册及新唐官网的开发资源,根据具体需求修改适配。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

225

帖子

0

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