DSP280039C串口升级方案:完整Boot源码与用户示例App源码及上位机集成实现
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总线玩升级,有没有想一起掉头发的?

更多推荐
所有评论(0)