DSP280039C的串口升级方案 提供boot源码,用户示例app源码,上位机。

最近在搞DSP280039C的IAP升级,发现串口烧录真是嵌入式工程师的祖传手艺。今天咱们直接上干货,聊聊如何用C2000实现空中升级。先剧透个冷知识:这个方案实测传输速度能达到115200bps还能稳如老狗。

先看bootloader部分,最核心的跳转APP操作其实就这几行:

void JumpToApp(void) {
    typedef void (*AppEntry)(void);
    AppEntry StartApp = (AppEntry)(0x80000); //APP起始地址
    
    __disable_interrupts();
    asm(" EALLOW");
    SysCtrlRegs.WDCR = 0x0068; //关看门狗
    asm(" EDIS");
    
    StartApp();  //纵身一跃
}

这哥们儿关键操作都在这里了:关全局中断、解除寄存器保护、关狗,最后直接函数指针跳转。注意0x80000这个地址要和你的APP工程里定义的FLASH起始地址严丝合缝,差一个字节都得翻车。

APP工程这边有个骚操作——中断向量重定向。在CMD文件里把程序入口改成0x80000不说,代码里还得加这个:

#pragma CODE_SECTION(epwm1_isr, "ramfuncs");
void epwm1_isr(void) {
    //中断处理
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

把中断服务函数扔到RAM里执行,毕竟FLASH在烧写时会掉电。实测发现如果不这么做,升级过程中突然来个中断,芯片能给你表演个当场去世。

DSP280039C的串口升级方案 提供boot源码,用户示例app源码,上位机。

通信协议必须得自己定,这里给个万能模板:

struct Packet {
    uint8_t head[2] = {0xAA, 0x55};  //帧头
    uint16_t seq;                    //包序号
    uint32_t addr;                   //烧写地址
    uint8_t data[128];               //数据体
    uint8_t checksum;                //校验和
}

校验和用累加和就行,别整什么CRC给自己挖坑。上位机用PyQt做的界面,关键发送代码长这样:

def send_flash_data(self):
    with open(self.bin_file, 'rb') as f:
        chunk = f.read(128)
        while chunk:
            packet = self.build_packet(chunk)
            self.serial.write(packet)
            while not self.get_ack():  #等硬件握手
                time.sleep(0.01)
            chunk = f.read(128)

注意这个128字节的data长度不是拍脑袋定的——DSP280039C的FLASH每次写入最小单位是128bit,不对齐会触发硬件错误。实测发现把data设成128字节刚好是16个写入单元,效率最高。

最后说几个血泪教训:boot和APP的时钟配置必须完全一致,特别是PLL倍频设置;FLASH烧写前务必执行擦除操作,但别整片擦除非必要;通信超时要设3倍理论时间,毕竟无线环境有玄学延迟。手头有示波器的老铁可以抓个波形看看,正常通信时RXD引脚会呈现规律性脉冲群,跟心电图似的特别治愈。

完整代码已经扔在Github(地址私聊),上位机支持拖拽烧录和进度回传。下次打算试试用CAN总线玩升级,有没有想一起掉头发的?

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐