赞
踩
案例说明
将SPI FLAS分成两大区域:一部分叫做bootloader区,一部分叫做app用户代码区。通过bootloader区存放的引导程序,对用户代码区的程序进行更新。
操作步骤说明
1.设置串口调试助手
打开串口调试助手,将波特率设置为500000,将发送文件延时设置为连续发送,选择HEX发送,在第一字节的末尾加上校验ModbusCRC16。
2.下载工程文件
打开HQ软件,找到对应的bin文件进行下载。
将程序下载之后,串口调试助手中出现“倒计时4!!!”、“ 倒计时3!!!”“倒计时2!!!”、“倒计时1!!!”,前面这4S的倒计时是预留给用户升级程序的。如果用户需要更新程序,就需要通过发送对应的指令对FLASH进行操作,此时程序将会进入更新的状态。如果不需要进行升级的话,这4S过后,串口会显示“正在进入用户程序!!!”,此时将会进入用户需要执行的功能程序,不能再对FLASH进行操作。当功能代码区没有内容时,程序将会一直执行升级部分的代码。下载用户功能代码的步骤如下3~5所示(需要在程序运行升级代码的前4S之内进行)。
3.通过串口调试助手发送读ID命令
在对Flash进行操作之前,首先必须读取ID,ID读取成功之后,才能进行一系列操作,第一次进行文件烧写的时候,建议执行此步骤,后续进行文件更新的时候可忽略此步骤。对于Flash操作定义的命令列表如下。
命令内容 | 命令意义 |
01 06 00 01 00 01 +CRC校验(通过软件自动添加) | 读Flash ID |
01 06 00 01 00 02 +CRC校验(通过软件自动添加) | 扇区擦除 |
01 06 00 01 00 03 +CRC校验(通过软件自动添加) | 块擦除 |
01 06 00 01 00 04 +CRC校验(通过软件自动添加) | 整片擦除 |
01 06 00 01 00 05 +CRC校验(通过软件自动添加) | 向Flash中写入数据 |
01 06 00 01 00 06 +CRC校验(通过软件自动添加) | 直接跳转至用户程序 |
ID读取成功之后,串口会显示对应的ID信息,本次实验操作的Flash的型号为W25Q64,其ID读取成功之后,串口会显示“FlashIDis 0x684017, Manufacturer Device ID is0x16”。
3.发送擦除指令
在向Flash中写入数据之前,必须先对其擦除,可以发送擦除扇区指令或者擦除块指令,请勿选择整片擦除,整片擦除之后将会擦除bootloader区的引导升级的代码部分,后续进行升级将需要重新下载程序。下面我们以块擦除为例:
1) 发送擦除指令01 06 00 01 00 03
2)输入app用户代码区的起始地址(需要注意的是,这里需要预留升级代码的区域,app用户代码区的起始地址都是从0x110000开始)
3)输入需要擦除的块区的个数,根据不同的Flash芯片进行设置,以W25Q64为例,一个扇区的大小为4K(4096个字节),一个块的大小为64K(65536个字节),一共有128个块,每块16个扇区,如果你需要烧写的文件大小为1059076个字节,选择使用扇区擦除的话,需要擦除的个数为259个,选择用块擦除的话,需要擦除17个块。在进行发送的时候要转换成16进制的数进行发送(需要注意的是定义的输入的数据是24位,如果需要擦除的块区的个数是17的话,需要输入的值为00 00 11)。
4)等待擦除完成,块擦除完成之后,会出现“BlockErase OK”,此时就可以进行接下来的操作。
5.发送写数据命令
擦除完成之后,发送写数据命令,打开文件,选择需要下载的bin文件。
文件发送完成之后,串口助手会显示下载完成,如下图所示,这样就完成将文件下载至Flash的操作。
6.查看结果
文件下载成功之后,程序将会跳转至用户程序执行相关的功能,以我们提供的示例“uart_rtc8563_hex8.bin”为例,文件发送完成之后,串口和数码管会显示相应的时间。
7.给用户代码区添加跳转模块
通过上述步骤完成了从bootloader区的引导程序到app用户代码区的跳转,但是并没有完成从app用户代码区跳回至bootloader区的过程。如果需要更新app用户代码区的内容只能通过重新给开发板上电,在程序运行的前4S发送对应指令进行更新。用户其实可以给自己的app用户代码区加上跳转指令,使其在某种特定的条件下跳回至bootloader区,比如我们提供的bin文件中,是通过开发板上的S1按键来控制地址的跳转,当S1按下之后,程序将重新从bootloader区的代码开始运行。给用户代码区添加跳转指令的方式如下:
1)复制跳转指令文件夹至工程中
找到我们提供的跳转指令代码文件夹“Flash_AddChance”复制至需要执行的工程中。
2)打开HQ软件,添加跳转指令模块
3)例化模块至工程顶层
在工程顶层添加例化代码,如下所示:
Flash_addChance Flash_addChance(
.clk_in(clk25m), //系统时钟
.rstn(reset_n), //系统复位
.key_in_1(key_in1) //跳转条件
); |
上述代码的跳转指令对应的是AC208开发板上的按键S1,用户在使用的时候可以通过一个GPIO口来进行控制,使其在特定的情况下输出高电平便可以实现跳转。
工程文件已置顶绑定
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。