打印
[技术问答]

请问谁有NC029单片机 IAP升级的代码

[复制链接]
1452|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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升级代码示例,需要的话可以分享给你,不过可能需要你根据实际情况调整一下。

使用特权

评论回复
5
瞌睡虫本虫| | 2025-6-12 12:39 | 只看该作者
IAP升级是一种在线升级程序的方法,NC029单片机支持IAP功能,但具体的代码实现需要根据你的硬件配置和需求来编写。

使用特权

评论回复
6
时光贩卖机| | 2025-6-12 13:31 | 只看该作者
您好,IAP升级代码通常需要根据具体的硬件和需求定制,不过我可以提供一些基本的IAP升级流程和示例代码,您可以参考一下。

使用特权

评论回复
7
永久冻结| | 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;  // 系统复位
}   


使用特权

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

本版积分规则

114

主题

225

帖子

0

粉丝