Intel FPGA 基于NIOS的串口远程升级(中)
【时间:2024 年 06 月 20 日, 来源:本站原创, 作者:】
六、实际应用
6.1 修改例程
实际应用中,我们可能用不到3个镜像的情况,更多的是2个镜像,可以随时通过串口升级软硬件程序即可,并且不用到NIOS的话,NIOS程序一般不需要升级,可以关闭NIOS升级入口。后期升级维护更多的是现场人员,为了防止误操作和缩短升级的时间,我们将程序稍加改动,让串口界面清晰明了,让程序升级人员更容易操作。
1、语言汉化
- 将串口打印信息汉化一下,例如:将之前的Factory打印信息修改
修改为:
- 具体的代码请见工程。
2、NIOS程序去冗余
- 在Factory程序中,只起到跳转的作用,所以可以将APP1&2的Hardware、Software升级功能去掉。
- 在APP1中,不必使用跳转功能,可以将跳转功能去掉,将APP2的有关升级代码去掉。
- 具体的代码请见工程。
3、上电即跳转
上电之后,FPGA默认从0地址启动,即程序会默认从Factory程序启动,然后从原厂程序跳转到APP1启动。在上面的教程中,我们是通过发送“5”来进行跳转,现在我们在Factory程序中,直接将input置为5,这样就可以上电之后,先从Factory启动,然后跳转到APP1启动。
4、缩小升级文件
- 对于生成的RPD文件,不全是有意义的数据,空余的地方使用0XFF填充。
- 举例来说,存放APP1 Hardware地址段0X00400000-0X007BFFFF中,并不全是有效字段,我们截取出来的RPD文件,包含许多无效字段,所以我们剔除无效字段,留下有效的就可以。
- 注意在有效数据结束的时候,地址位选择是0X00859D5F而不是0X00859D50,所以文件长度即为59D5F。选择块,复制,另存为相应的RPD文件即可。
- 在NIOS程序里面,地址也要做相应的修改。修改地址之后,擦除的区域也会相应改变。
修改为:
6.2 实际应用操作
1、板子上电,打开串口,配置。
2、Generate JIC文件配置如下:
3、下载JIC文件,重上电。打印信息如下:
4、串口发送1,则会显示擦除相关区域,然后选择相应的文件,并且发送。
5、等待几分钟后,显示程序升级完成。重上电之后,显示程序已经从APP2启动,升级成功。
6.3 实际应用容易出现的问题以及避免
在上述实际应用中,要求务必一次升级成功。一旦升级失败,就是出现错误导致无法再次升级。因为在Trigger IP Remote Update中设定,一旦升级失败,会跳转到Factory程序执行,但是我们在Factory程序中已经设定直接跳转到APP1,而APP1因为升级失败而无法正常启动,又会跳转回到Factory程序,所以如果升级失败,将是一个死循环。
为了避免出现此类情况,建议在外部放置一个拨码开关,上电之后检测拨码开关的设置来决定从哪个程序启动。例如开始设置:3‘b001:从Factory启动’,如果升级完APP1(可以多次升级,直至升级成功),则设置3‘b002,从APP1启动。
七、常见错误/问题
7.1 新建NIOS II 软件程序
当想把RSU程序移植到其他器件上的时候(尤其是不同系列的器件),尽量不要只通过修改Device来实现,容易出现一些莫名其妙的编译错误。要按照例子工程,重新添加IP,重新新建NIOS II软件程序。
新建NIOS II软件程序遵循以下步骤:
1、“File”-“New”-“Nios II Application and BSP from Template”
2、在弹出的窗口“SOPC Information File Name” 中,选择对应的SOPCINFO文件。Nios II IDE使用.sopcinfo文件来信息来为目标硬件编译软件程序。
3、在“Project Name”输入工程的名字,注意不要有空格
4、在“Templates”中选择“Hello World Small”。
5、点击“Next”创建BSP工程。
6、点击Finish完成工程的创建。
7.2 Scanf函数
在7.1的“Templates”中,可以选择“Hello World”或者“Hello World Small”。后者是前者的简化版,支持的功能少,占用的体积更小。如果片子片上资源够大,考虑前者,如果资源较少,考虑后者。例如“EP4CE10”,前者占用资源太多放不下,只能考虑后者。
在“Hello World Small”中,不支持函数“Scanf”,编译会出现以下错误:
此种情况下,我们用“Alt_getchar()”函数代替。
在程序中,相应的做出修改。
scanf("%2x%2x%2x%2x", &receivedHex[0], &receivedHex[1], &receivedHex[2], &receivedHex[3]);
修改为
for(int i=0;i<4;i++)
receivedHex[i]=alt_getchar();
7.3 UART指向
1、在NIOS工程里面,串口有两个,JTAG UART和UART。
- JTAG UART是要自己添加的Quartus内置IP核,通常用来是实现PC和Nios II系统间的串行通信接口,它用于字符的输入输出。
- 在Qsys中添加了JTAG UART核 ,而在系统生成,例化中并没有关于JTAG UART的端口, 这部分接口软件内部自动添加,就像你不需要在顶层分配EPCS接口,只要你在你的调试代码中调用了打印信息的调试函数就可以。
- UART就是我们普通的串口,通过RS232与PC相连。
2、在调试过程中,我们根据调试需要来切换不同的串口。
- 在BSP Project 右键,选择“NIOS”-“BSP Editor”。
- 在打开的窗口中选择“Common”-“hal”-“stdin”,可以选择UART或者JTAG UART。
- 选择了“Jtag_uart”,串口信息打印在NIOS的Console窗口,选择“uart”,串口信息打印在PC的串口调试助手上。
7.4 写保护开关
在NIOS程序中,下面语句是EPCQ Controller(Intel FPGA Serial Flash Controller Core) 对Flash的开关写保护操作。
IOWR(EPCQ_CONTROLLER_AVL_CSR_BASE, 0x3, 0x00001703);
通过上图可以看到,FLASH_MEM_OP[31:24],FLASH_MEM_OP[7:2]是保留字,不能够操作,我们能操作的是FLASH_MEM_OP[23:8]和FLASH_MEM_OP[1:0]。
对于FLASH_MEM_OP[1:0],选择2‘b11。
对于FLASH_MEM_OP[23:8],我们要操作的也只是低五位,即FLASH_MEM_OP[12:8]。位13到位23是保留的,应该设置为零。低五位提供Flash扇区的组合值,对不同扇区进行操作。
从上图可以看出,我们选择的是1001-所有扇区全部保护和0111,保护低位扇区(因原厂程序存在0地址低扇区,所以升级过程中,原厂程序不能被删除)。对应的寄存器0X00001903和0X00001703。
7.5 Remote Update IP
Remote Update IP 从Flash中将升级的镜像下载到FPGA,然后更新配置电路,来启动重配置。
在配置过程中和配置之后,Remote Update 执行错误检测,当检测到错误时,直接恢复到出厂程序运行,并且提供错误状态信息。
在NIOS程序中,需要操作的寄存器有 0X0C、0X10、0X1D(仅限于Cyclone IV和Cyclone 10 LP,其他系列的根据datasheet来定)。
7.6 数据截取文件从RPD而非JIC
注意数据截取的时候是从RPD文件,而非JIC文件,从JIC文件截取是会出错的。RPD文件在生成JIC的文件一起生成的。
7.7 SOF、JIC、ELF、HEX
1、文件类型
- SOF:SRAM Object File
- JIC:JTAG Indirect Configuration File
- HEX:Hexadecimal (Intel-Format) Output File
2、本文用到的是SOF+HEX=JIC,然载JIC的方式
- SOF文件是由FPGA编译产生。
- HEX文件是由NIOS编译产生,编译方法请见上文。
- HEX文件也可以通过ELF文件转换而来。转换指令
elf="sw.elf"
echo "elf>flash ..."; elf2flash --epcs --input=$elf --output=sw.flash
echo "flash>hex ..."; nios2-elf-objcopy --input-target srec --output-target ihex sw.flash sw.hex
echo "del flash ..."; rm -f *.flash
上述指令存为elf2hex.sh文件,通过Nios II command shell 执行。在NIOS project右键,选择“Nios”-“Nios II Command Shell”
执行命令如下图所示,另外注意这种生成的HEX文件方法仅供参考。
7.8 NIOS调试以及下载
在实际项目开发中,不必每次都合成JIC文件下载,可以先由NIOS里面直接下载,方便调试。
- Nios Project-右键,然后选择“Run as”-“Run Configurations”,打开配置窗口。
- 在配置窗口“Project”-“Project ELF file name”中选择正确的ELF文件。