PIC18 bootloader之RS485 bootloader

GeekyGeek 2024-06-14 08:15:00 阅读 84

这个PIC18 RS485 bootloader是为工业级产品开发的,是一款工业级的bootloader

了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。

不知道为什么,现在工业控制领域也向汽车领域学习,产品需要带bootloader, 产品出货后也要可以通过bootloader更新应用程序。最近一个老客户就让我給其工控产品开发一个RS485的bootloader,产品使用的芯片是Microchip 的8-bit单片机PIC18,通信总线是RS485。我其实之前没接触过RS485总线,先学习了一下RS485总线,才开始RS485 bootloader的开发。RS485 bootloader 是在Uart bootloader 基础上开发的,由于没有客户产品上的同款PIC18单片机, 我是在PIC18F46K22上开发好,然后由客户自己移植到他们在用的PIC18单片机上。好在RS485 bootloader 三层软件架构,应用层和底层是分开的,非常好移植。架构见图:

RS485 bootloader 是使用XC8 和MPLABX 开发的。RS485 bootloader 上位机是使用C# 和VS2013 开发的,上位机界面如图:

RS485 bootloader 通过烧写器烧写到PIC18 单片机后,后续更新应用程序只需一个USB转RS485工具,USB接电脑,RS485总线和PIC18板子相连,使用上位机即可升级应用程序。RS485可以组网,所以RS485 bootloader 和Uart bootloader 的最大区别就是每帧数据都带有节点地址,RS485节点收到每帧的数据,提取里面的节点地址,在和自己的节点地址进行比较,相同才响应上位机并执行相应的动作完成应用程序的升级。

RS485 bootloader 是一个独立的程序,以PIC18F46K22为例,bootloader存储在ROM空间的0x000 - 0x7FF, 应用程序存储在ROM空间的0x800 - 0xFFFF。所以bootloader 和应用程序共享单片机的整个ROM空间,boot loader 不使用interrupt, interrupt vector 需要重映射到应用程序空间, PIC18的interrupt vector 重映射非常容易,只需在应用程序的MPLAB X工程里配置好ROM offset=0x800即可。

RS485 bootloader 和 上位机之间的通信协议是自定义协议,RS485 bootloader 接收上位机传过来的内容,按照自定义协议的格式解读。格式解读的代码段:

switch (comRxCtrl)

{

case COMRX_SOF:

if (ch == ':')

{

comRxCtrl = COMRX_ADDR;

}

break;

case COMRX_ADDR:

if (ch == COM_ADDRESS)

{

comRxCtrl = COMRX_DATA;

}

else

{

comRxCtrl = COMRX_SOF;

}

break;

case COMRX_DATA:

if (comData.rxIndex <= (comFrame.stuRecord.len + 5))

{

comFrame.rawRecord[comData.rxIndex++] = ch;

}

else

{

comData.status |= COM_RX_OVERFLOW;

}

break;

default:

break;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。