PIC18 bootloader之RS485 bootloader

pic18,bootloader,rs485 · 浏览次数 : 0

小编点评

本文将为您详细介绍如何使用C语言实现基于PIC18单片机的RS485 Bootloader。我们将从以下几个方面展开: 1. Bootloader简介 2. 硬件平台选择与开发环境搭建 3. Bootloader架构设计 4. 上位机通信协议设计 5. 应用程序升级过程 6. 结论 首先,Bootloader是一种引导操作系统启动的程序,它负责将操作系统加载到内存中并初始化硬件设备。在工业控制领域,产品出货后可能需要通过Bootloader更新应用程序,以满足不同场景的需求。 在本文中,我们选择了Microchip的8位单片机PIC18作为主控制器,并使用RS485总线进行通信。为了实现Bootloader,我们需要搭建硬件平台和开发环境。 硬件平台方面,我们选择了XC8和MPLAB X作为开发工具,使用PIC18F46K22作为目标芯片。这个芯片具有丰富的资源,便于我们实现Bootloader功能。 在开发环境方面,我们需要在XC8中编写Bootloader代码,并使用MPLAB X进行编译和调试。此外,我们还需要使用USB转RS485工具来实现与上位机的通信。 接下来,我们来设计Bootloader的架构。由于Bootloader需要支持多种功能,我们可以将其分为三层:应用层、中间层和底层。应用层负责处理用户请求,中间层负责处理通信协议,底层负责控制硬件设备。 在本文中,我们使用了RS485 bootloader作为示例。这个Bootloader采用了三层软件架构,方便移植到不同的单片机上。同时,我们还实现了上位机通信协议,以便在产品出货后通过USB接口更新应用程序。 在应用程序升级过程中,我们需要将新的应用程序代码烧写到ROM空间中。由于Bootloader和应用程序共享单片机的整个ROM空间,因此我们只需要修改Bootloader的代码即可实现应用程序的升级。 最后,我们来总结一下本文的内容。本文详细介绍了如何使用C语言实现基于PIC18单片机的RS485 Bootloader。我们首先介绍了Bootloader的基本概念,然后选择了合适的硬件平台和开发环境。接着,我们设计了Bootloader的架构,并实现了上位机通信协议。最后,我们展示了如何将新的应用程序代码烧写到ROM空间中,并通过Bootloader实现应用程序的升级。 总之,本文提供了一个实用的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;
        }

 

与PIC18 bootloader之RS485 bootloader相似的内容: