如何更简单的给单片机更新固件 点击:1025 | 回复:0



嵌入式学习中

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:26帖 | 1回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2018年5月13日
发表于:2018-06-23 11:14:08
楼主

 当单片机已经焊接到电路板上时,如何更简单更便捷的为单片机升级固件便成了一件值得深思的问题。纵观市面上现有的大多数升级方式,不仅需要硬件支持,还需要专用的烧写工具或软件来升级固件,升级过程较为复杂。本文介绍了一种更简单更便捷的固件升级方式,不需要任何专用工具,只是简单的一个删除粘贴操作,便可实现固件更新



当程序运行时,按住指定的按键后按一下复位按键。就启动了升级程序,此时将单片机的USB从机端口连接电脑。在电脑中可以发现一个U盘设备,

将原文件删除,然后将最新固件的bin文件复制到此U盘中,此时U盘中只有用户用于升级的bin文件。然后拔下USB线,复位重启,便可运行最新固件。


以上就是详细的升级步骤,相比其他方法更便捷也更简单。接下来以NXP公司的LPC54608单片机为例来介绍这种升级方法的制作流程。


1. 硬件基础


此升级方法的制作至少需要单片机有一个硬件的USB从机。和足够的flash用来存放一段bootloade的代码。


2. 编写USB驱动程序


首先要写好USB驱动程序,将片内FLASH的前半段用作代码空间,后半段用作存储空间。使电脑能将其识别为一个U盘,并能够进行读写操作。USB驱动的编写可参考官方例程。更多学习交流可以加Q3472880374


3. 对存储空间进行修改


在步骤2中,我们已经将FLASH的后半段用作U盘的存储空间,在LPC54608中,片内flash是512K,存储起始地址是0x40000;结束地址是0x80000。根据FAT文件系统的存储协议,存储起始地址开始的前几个扇区存放的是引导部分,FAT表项部分和根目录部分。数据是从根目录结束扇区的下一个扇区的开始存储。


在本步骤中,对程序的改进就是将数据扇区之前的几个扇区,放在RAM中,使0x40000地址开始存放的即为bin文件的数据。


4. 对存储内容进行修改


完成步骤3之后。每次接上USB线,电脑都要对u盘进行格式化,因为RAM区的数据为0,电脑需要从新格式化建立FAT文件系统并将存储的相关信息写到RAM中对应的区域。在window10的电脑中,格式化之后电脑还会在U盘中增加几个必要文件使我们写入的bin文件数据并不是从0x40000开始,因此要进行优化。


在程序初始化的时候。根据FAT的协议填充RAM区域数据。包括引导扇区,FAT表项和根目录。可以在引导扇区中优化FAT表个数和根目录大小来节省RAM空间。并在根目录中放入一个大小为整个U盘大小的bin文件,之后在FAT表项中填充所有可用的簇,使USB线连接上之后,电脑端不需要再格式化并如图1和图2所示。


5. 编写bootloader


完成步骤4之后,大部分工作已经完成。接下来就要编写跳转函数来实现向用户程序的跳转。在LPC54608中,我们以flash的前32K用作升级程序的bootloader区域,就是0x0~0x8000之间。32K之后用作用户代码区域。


对于我们制作的U盘存储空间来说,0x8000处开始存放的就是用户bin文件。因此,我们只要在更新完固件后跳转到0x8000处执行程序就行了。跳转代码要包括SP指针的重新赋值,中断向量表的重映射。


6. 增加按键判断


程序在上电之后,从0x0地址处取址,此处运行的是bootloader程序,程序在开始的时候判断按键是否按下,如果按下,就进入bootloader程序,如果没有按下,就跳转到用户代码。


至此,整个升级方法的时间就完成了!现在开始体验便捷的升级方式吧




热门招聘
相关主题

官方公众号

智造工程师