芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 5003|回复: 1

【智多晶FPGA-041】基于串口的在线升级方案

[复制链接]

该用户从未签到

56

主题

62

帖子

640

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
640
发表于 2022-6-1 11:50:42 | 显示全部楼层 |阅读模式
案例说明
将SPI FLAS分成两大区域:一部分叫做bootloader区,一部分叫做app用户代码区。通过bootloader区存放的引导程序,对用户代码区的程序进行更新。
操作步骤说明
1.设置串口调试助手
打开串口调试助手,将波特率设置为500000,将发送文件延时设置为连续发送,选择HEX发送,在第一字节的末尾加上校验ModbusCRC16。

image.png

2.下载工程文件
打开HQ软件,找到对应的bin文件进行下载。

image.png

将程序下载之后,串口调试助手中出现“倒计时4!!!”、“ 倒计时3!!!”“倒计时2!!!”、“倒计时1!!!”,前面这4S的倒计时是预留给用户升级程序的。如果用户需要更新程序,就需要通过发送对应的指令对FLASH进行操作,此时程序将会进入更新的状态。如果不需要进行升级的话,这4S过后,串口会显示“正在进入用户程序!!!”,此时将会进入用户需要执行的功能程序,不能再对FLASH进行操作。当功能代码区没有内容时,程序将会一直执行升级部分的代码。下载用户功能代码的步骤如下3~5所示(需要在程序运行升级代码的前4S之内进行)。

image.png

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”。

image.png

3.发送擦除指令
在向Flash中写入数据之前,必须先对其擦除,可以发送擦除扇区指令或者擦除块指令,请勿选择整片擦除,整片擦除之后将会擦除bootloader区的引导升级的代码部分,后续进行升级将需要重新下载程序。下面我们以块擦除为例:
1) 发送擦除指令01 06 00 01 00 03

image.png

2)输入app用户代码区的起始地址(需要注意的是,这里需要预留升级代码的区域,app用户代码区的起始地址都是从0x110000开始)

image.png

3)输入需要擦除的块区的个数,根据不同的Flash芯片进行设置,以W25Q64为例,一个扇区的大小为4K(4096个字节),一个块的大小为64K(65536个字节),一共有128个块,每块16个扇区,如果你需要烧写的文件大小为1059076个字节,选择使用扇区擦除的话,需要擦除的个数为259个,选择用块擦除的话,需要擦除17个块。在进行发送的时候要转换成16进制的数进行发送(需要注意的是定义的输入的数据是24位,如果需要擦除的块区的个数是17的话,需要输入的值为00 00 11)。

image.png

4)等待擦除完成,块擦除完成之后,会出现“BlockErase OK”,此时就可以进行接下来的操作。
5.发送写数据命令
擦除完成之后,发送写数据命令,打开文件,选择需要下载的bin文件。

image.png

文件发送完成之后,串口助手会显示下载完成,如下图所示,这样就完成将文件下载至Flash的操作。

image.png

6.查看结果
文件下载成功之后,程序将会跳转至用户程序执行相关的功能,以我们提供的示例“uart_rtc8563_hex8.bin”为例,文件发送完成之后,串口和数码管会显示相应的时间。

image.png

062-1.jpg

7.给用户代码区添加跳转模块
通过上述步骤完成了从bootloader区的引导程序到app用户代码区的跳转,但是并没有完成从app用户代码区跳回至bootloader区的过程。如果需要更新app用户代码区的内容只能通过重新给开发板上电,在程序运行的前4S发送对应指令进行更新。用户其实可以给自己的app用户代码区加上跳转指令,使其在某种特定的条件下跳回至bootloader区,比如我们提供的bin文件中,是通过开发板上的S1按键来控制地址的跳转,当S1按下之后,程序将重新从bootloader区的代码开始运行。给用户代码区添加跳转指令的方式如下:
1)复制跳转指令文件夹至工程中
找到我们提供的跳转指令代码文件夹“Flash_AddChance”复制至需要执行的工程中。
2)打开HQ软件,添加跳转指令模块

image.png

3)例化模块至工程顶层
在工程顶层添加例化代码,如下所示:

   Flash_addChance Flash_addChance(
    .clk_in(clk25m),  //系统时钟
    .rstn(reset_n),  //系统复位
    .key_in_1(key_in1)  //跳转条件
  );

上述代码的跳转指令对应的是AC208开发板上的按键S1,用户在使用的时候可以通过一个GPIO口来进行控制,使其在特定的情况下输出高电平便可以实现跳转。

更多智多晶FPGA相关资料,请查看下述汇总贴
【智多晶FPGA-001】小梅哥智多晶FPGA产品使用自助服务手册



UART_FLASH.rar

1.61 MB, 下载次数: 766

工程文件

回复

使用道具 举报

该用户从未签到

0

主题

1

帖子

41

积分

新手上路

Rank: 2

积分
41
发表于 2022-8-9 22:37:23 | 显示全部楼层
为什么我发送命令毫无反应
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

GMT+8, 2024-11-21 22:06 , Processed in 0.112789 second(s), 35 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表