一种MCU固件升级方法与流程

文档序号:17761540发布日期:2019-05-24 21:43阅读:8504来源:国知局
一种MCU固件升级方法与流程

本发明涉及电子信息技术领域,特别涉及一种mcu固件升级方法。



背景技术:

目前针对标准的通用型外部flash模块,市面上有很多第三方下载工具如jlink配套工具j-flash,都提供了flash烧写功能,对于不同品牌和不同型号的flash芯片,由于下载工具内部都集成了相应的驱动,因此可以完全支持各类外部flash芯片的烧写功能。

对于大多数芯片内部集成的flash模块,即嵌入式eflash,上述下载工具也根据不同品牌和不同型号的芯片,集成了相应的flash驱动程序,因此这类下载工具也可以比较好地支持嵌入式flash的程序烧写。

然而,针对少数非通用型嵌入式flash芯片,尤其是某些芯片厂商自行开发,并且用在特定产品和领域中的嵌入式flash芯片,因为与多数标准通用型flash芯片并不兼容,所以上述下载工具并不能很好地支持这类芯片。

为了解决少数非通用型嵌入式flash芯片的程序烧写问题,大多数设计厂商或开发者会自己编写flash驱动程序,通过集成开发环境配合调试下载工具,将固件升级程序烧写到flash中。

参见申请号cn201810844547.8的专利申请,其公开了一种mcu固件程序的下载方法,该方法通过设计者自行开发flash驱动程序,并利用arm集成开发工具,配合jlink下载工具和vs集成开发环境,设计了基于windows可视化界面的嵌入式flash烧写工具,解决了少数非通用型嵌入式flash芯片的固件升级问题。

然而,该方法也存在一些不足,例如设计者在设计烧写工具初期,设计复杂度高、设计周期长;需要完成arm集成开发工具和vs集成开发环境的配合,配合难度较大,各版本兼容性差;用户在使用烧写工具过程中需要手动设置固件路径、烧写地址、固件长度等参数,增加了操作复杂性,降低了效率和可靠性。因此,如何降低烧写工具的设计复杂度和操作难度,提高烧写速度,提升效率,成为一个急需解决的问题。



技术实现要素:

本发明的目的是克服上述背景技术中不足,提供一种mcu固件升级方法,可以有效地解决背景技术中提到的技术问题,显著降低烧写工具初期设计复杂度和操作难度,且用户在操作过程中无需手动设定flash烧写地址及长度,极大地简化了烧写过程,提升了烧写准确度和操作效率。

为了达到上述的技术效果,本发明采取以下技术方案:

一种mcu固件升级方法,包括以下步骤:

a.编写mcu初始化和嵌入式flash驱动程序;

b.安装jlink下载器驱动程序包;

c.拷贝jlink.exe可执行文件和jlinkarm.dll库文件到同一目录下;

d.编写flash.txt命令脚本文件和flash.bat批处理文件;其中,flash.bat批处理文件用于调用flash.txt命令脚本文件,flash.txt命令脚本文件包含各行命令,这些命令可以通过调用jlink.exe文件执行,从而实现jlink仿真器对mcu的控制;

e.导入固件升级程序;

f.运行flash.bat批处理文件,mcu通过jlink自动烧写固件程序到flash。

进一步地,所述步骤a具体包括以下步骤:

a1.复位mcu计数器和主时钟,解锁时钟配置功能,选择外部mcu时钟源,设置时钟分频系数,锁定时钟配置功能,复位串口;

a2.复位flash控制器,解锁flash写保护,设置flash控制器时钟为80mhz;

a3.全片擦除flash;

a4.设置sram起始地址,flash起始地址和块写入长度,等待接收写入命令;

a5.接收到写入命令后,将sram起始地址处的数据分多次写入到flash起始地址处,每次写入单块数据长度,并将写入flash中的数据读出,与写入前的数据比较,完成校验,其中,每次写入数据长度由步骤a4中规定的块写入长度决定,写入次数由固件程序的总长度决定。

进一步地,所述步骤a4具体为:设置sram起始地址为0x20000000,设置flash起始地址为0x1000000,块写入长度设置为4k字节,即每次写入数据的长度为4k字节;写入命令通过内存的一个标志位写入,当标志位未写入时,cpu一直处于查询等待状态,标志位一旦写入,cpu就开始执行flash写入过程。

进一步地,所述步骤d中编写flash.txt命令脚本文件具体包括:

d1.设置目标芯片型号为cortex-m3,设置下载接口方式为swd,设置jlink工作频率为4mhz;

d2.将mcu初始化和嵌入式flash驱动程序boot.bin载入到sram起始地址处,规定cpu起始运行的程序内容和程序地址;

d3.设置cpu主堆栈指针和程序计数器值,使cpu运行驱动程序;

d4.将固件程序片段1载入到内存指定地址;

d5.对写入标志位置位,使cpu开始运行,将内存指定地址中的固件程序片段1烧入flash中;

d6.延时600ms,等待烧写完成;

d7.将固件程序片段2直到固件程序片段n载入到内存指定地址,并置位标志位,完成剩下所有固件程序片段的写入;其中固件程序片段个数n由固件程序长度决定。

进一步地,所述步骤e具体为将固件升级程序以bin文件的方式,与驱动程序boot.bin、jlink.exe可执行文件、jlinkarm.dll库文件、flash.txt命令脚本文件、flash.bat批处理文件一起放在同一个目录下。

本发明与现有技术相比,具有以下的有益效果:

通过本发明提出的mcu固件升级方法,针对特定的非通用型内嵌式flash芯片,将flash驱动、jlink驱动和flash读写功能,都集成到一个烧写工具中,并且通过批处理文件和命令行脚本文件,实现了flash一键式烧写功能,简化了固件升级步骤,提高了操作效率。

同时,针对不同的固件程序,只需将对应的bin文件放在与其它相关驱动文件同一目录下,系统就可以自动载入固件并烧写到flash中。该方法操作流程简单,无需专业知识,具有较大的推广和实用价值。

附图说明

图1是本发明的mcu固件升级方法流程示意图。

具体实施方式

下面结合本发明的实施例对本发明作进一步的阐述和说明。

实施例:

实施例一:

如图1所示,一种mcu固件升级方法,具体包括以下步骤:

步骤101:编写mcu初始化和嵌入式flash驱动程序:

其中,编写mcu初始化和嵌入式flash驱动程序boot.bin,包括:首先,复位mcu计数器和主时钟,解锁时钟配置功能,选择外部mcu时钟源,设置时钟分频系数,锁定时钟配置功能,复位串口,复位flash控制器,解锁flash写保护,设置flash控制器时钟为80mhz,全片擦除flash,保证mcu和flash基本功能能够正常工作;其次,设置sram起始地址,flash起始地址和块写入长度,等待接收写入命令;最后,接收到写入命令后,将sram起始地址处的数据分多次写入到flash起始地址处,每次写入单块数据长度,并将写入flash中的数据读出,与写入前的数据比较,完成校验。这样,就可以完成整个flash写入和校验流程。

具体的,在本实施例中,编写mcu初始化和嵌入式flash驱动程序具体为:

首先,根据芯片手册编写mcu初始化程序,完成mcu时钟源选择、系统时钟设置、分频系数设置等功能。

本实例以所使用的mcu型号hcm32为例进行说明,mcu时钟源选择,可以通过设置系统控制单元scu的rc_ctrl寄存器,选择外部8mhz晶振为时钟源;系统时钟设置通过系统控制单元scu的ckcfg_lock和rstcfg_lock寄存器,设置解锁、锁定系统时钟和系统软件复位;分频系数设置通过设置系统控制单元scu的sys_pllc寄存器参数为9,使主时钟经过pll倍频后,输出72mhz时钟。

其次,根据芯片flash模块手册,编写flash读、写、擦除功能接口函数,本实施例中,分别对应flash_read()函数、flash_write()函数和flash_erase()函数。其中,flash写和擦除默认是按照块操作的,且每一块大小为512字节,因此由flash写和擦除函数构成实际上的flash写块操作函数。flash读函数构成数据检验功能函数。

最后,编写程序,利用上述已实现的flash写块操作函数,将sram内存数据区的数据写入到flash起始地址0x1000000处;再设置mcu的程序存储区地址和写入flash的数据存储区地址。

其中,设置mcu的程序存储区地址和写入flash的数据存储区地址的具体方法如下:

首先,以iar集成编译环境为例进行说明,新建一个工程并导入程序代码;进入project->options->linker->config,在overridedefault项前打钩,并在下面的文件路径栏中填入$proj_dir$\sram.icf;

之后进入工程目录,并在目录下新建一个.icf后缀名文件,并编辑文件。在文件中加入内容definesymbol__icfedit_region_rom_start__=0x1fff0000;definesymbol__icfedit_region_rom_end__=0x1fff2ff0两行,设置程序运行的起始地址为0x1fff0000。

然后,再进入project->options->outputconverter->output,在generateadditionaloutput项前打钩,并在outputformat下拉列表框中选择binary;在overridedefault项前打钩,并在下面的文本框中填写boot.bin;

最后,点击project->make完成程序代码的编译链接过程,之后可以在工程目录下的debug/exe/文件夹中找到生成的boot.bin文件。此文件包含了mcu初始化和flash驱动程序。

步骤102:安装jlink下载器驱动程序包。

步骤103:将安装目录下的jlink.exe文件和jlinkarm.dll文件拷贝到同一目录下。

步骤104:编写flash.txt命令脚本文件和flash.bat批处理文件:

编写的flash.bat批处理文件用来直接调用flash.txt命令脚本文件中的各行命令,这些命令又是通过调用jlink.exe可执行文件,执行jlinkarm.dll库文件中支持的各类命令来实现的。

编写flash.txt命令脚本文件,具体操作如下:

首先,用devicecortex-m3命令设置芯片内核参数;用si1命令设置jlink连接方式为swd四线模式;用speed4000k命令设置jlink频率为4mhz;用loadbinboot.bin0x1fff0000命令完成mcu向内存0x1fff0000地址处载入flash驱动程序;用wregmsp0x1fff3618和setpc0x1fff0879命令设置mcu主栈指针和pc指针地址,启动mcu开始执行flash驱动程序。

此时,驱动程序会完成mcu初始化流程和flash初始化配置,之后不断查询内存标志位,并等待标志位置位。

然后,再用loadbinbinslice0.bin0x20000000命令完成mcu向内存指定地址载入固件程序片段;用w40x1fff3ff41命令对内存标志位置位。此时,程序检测到内存标志位置位,开始把内存指定地址处的数据搬移到flash起始地址处。

最后,再依次把其它多个固件程序片段载入到内存指定地址处,并对内存标志位置位,完成内存到flash的数据搬移。

具体的,本实施例中,flash.bat批处理文件执行2个任务:第1个任务是将固件升级程序文件拆分为多个固件程序片段,以方便后期mcu载入内存指定地址。具体方法是在此处执行一个文件拆分程序partition.exe,该程序用vs集成开发编译工具自行编写程序,并生成可执行文件;第2个任务是调用jlink.exe程序,执行flash.txt命令脚本文件,完成上述一系列功能,将数据写入flash中。

步骤105:导入固件升级程序;

将需要升级的固件程序文件与jlink.exe、jlinkarm.dll、flash.txt、flash.bat文件放入同一目录下,并执行flash.bat文件,就可以将固件程序一次性写入flash。

步骤106:运行flash.bat批处理文件,使mcu通过jlink自动烧写固件程序到flash。

可以理解的是,以上实施方式仅仅是为了说明本发明的原理而采用的示例性实施方式,然而本发明并不局限于此。对于本领域内的普通技术人员而言,在不脱离本发明的精神和实质的情况下,可以做出各种变型和改进,这些变型和改进也视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1