使用UART 对ZYNQ 进行远程(在线)升级

摘要:

        本文介绍了如何使用ZYNQ的串口实现BOOT.BIN程序的在线升级。在Vivado工程中启用相关支持后,通过vitis裸机实现UART 升级。

基本知识

        在线升级程序,是只替换Flash中固化的程序,即BOOT.bin,BOOT.bin一般是FSBL+PL.bit+PS.elf构成,其生成BOOT.bin的大致过程请查看XILINX 手册UG821。

        程序固化就是将生成的 BOOT.bin 文件烧写到 QSPI 中,其实质是将 BOOT.bin 文件的数据写入到 QSPI 中。将数据写入到 QSPI 中的方式有多种,通过 Vitis 软件工具使用 JTAG 接口写入是一种常用的方式,但是实际的产品中,不可能会有JTAG这些工具,一般只会有串口或者网口这一个外部接口。所以,在线升级就是利用网口或者串口,将BOOT.bin通过串口或者网口发送到板卡,并调用相关函数操作 QSPI向 QSPI 中写入boot.bin。网口的简单教程网上较多,这里提供串口的在线升级方法

具体操作

1 vivado

要用函数操控QSPI,就要先在vivado中操控勾选相关信息,如下图一所示,我这里是使用的MLK_ZYNQ7100 ,他的FLASH 连接方式是Dual quad spi ,这个具体看自己板卡的连接方式。

2 vitis

         在vitis中,配置好串口,然后设置中断,由于自己不会上位机,就用的网上的,只要能发送文件,都可以。首先是更新命令,只有板卡接收到连续5个aa ,才开始接收更新BOOT.bin,。其中断处理函数如下

if(Event == XUARTPS_EVENT_RECV_DATA || Event == XUARTPS_EVENT_RECV_TOUT || Event == XUARTPS_EVENT_RECV_ERROR){
		if(EventData == 0){
			XUartPs_Recv(&UartPs, RecvCmd, 5);
		}
		else if(EventData >0)
		{

			if((EventData  == 5 ) && (RecvCmd[0] == 0xaa && RecvCmd[1] ==0xaa && RecvCmd[2] == 0xaa &&RecvCmd[3] == 0xaa && RecvCmd[4] == 0xaa))
				{
				//	XUartPs_Send(&UartPs, SendCmd, 5); //发送应答
					XUartPs_Recv(&UartPs, UartBufferPtr, Uart0_Recive_Max);
					recv_updata_start = 1;
			     }
			else if((recv_updata_start == 1)&& (EventData >5)  )
			{
				recv_updata_start = 0;
				XUartPs_Recv(&UartPs, UartBufferPtr,Uart0_Recive_Max );//继续更新文件

					recv_updata_flag = 1;

			}
			//XUartPs_Recv(&UartPs, RecvCmd, 500);//继续监听
			//printf(" recv_uart_EventData = %d\n\r",EventData);

			else {
				XUartPs_Recv(&UartPs, RecvCmd, 5); //
				}
			recv_uart_length = EventData;
			recv_uart =1;
		}

握手信号完成后,将接收的数据写入DDR3,接收完成后,再将数据写入FLASH,

2 Flash 操作

Flash的操作,可以直接看xilinx的历程,然后改改,设置接收中段,将数据接收完之后,并把数据存入ddr3后,就可以进行Flash的擦除和写操作,具体可以看历程。这里擦除完成之后,会将写入Flash中的数据,再读出来验证。当验证完成之后,即代表更新完成,最后会向上位机发送5个 cc。

	if(recv_uart == 1){ //接收到数据,
	recv_uart = 0;
	if(recv_updata_start == 1)
	{
		XUartPs_Send(&UartPs, SendCmd, 5); //发送应答
	}
	if(recv_updata_flag == 1 ) //收到更新数据
	{
		recv_updata_flag = 0;	
		update_flash(UartBufferPtr, read_buffer, write_buffer, recv_uart_length);
		XUartPs_Send(&UartPs, SendOver, 5);

	//	recv_updata_start = 0;
	}

        最后看一个视频串口在线升级的视频,由于板卡不支持在QSPI启动模式下,使用JATG下载,所以每一次在使用JATG下载完成程序,通过串口将程序下载到Flash中后,都要手动修改启动方式。串口助手中的乱码,因为自己定义的发送接收都是16进制,但是其他打印信息使用的是ASCII,并不影响

串口在线升级 ZYNQ

3 multiboot

        UG821中,详细说了更为可靠的升级方案,即multiboot,基本原理请看UG821,由于本人能力有限,目前无法对上位机进行编写,这就导致,无法将BOOT.bin 下载到Flash中,指定的位置,但是程序实现程序程序跳转已经实现,即使用JATG工具,实现地址偏移,并让两个程序实现跳转,这与multiboot实现原理基本相同,程序可到资源中心下载。

4 后续进行纯FPGA的在线升级

ZYNQ是一种基于 FPGA 和 ARM 处理器的 SoC (System on Chip) 设计。在 ZYNQ SoC 中,UART 是其中一个重要的外设,用于实现串行通信。引用提到了关于 ZYNQ PS 端的 UART 控制器的介绍和描述。 对于开发者来说,实际的工程应用是最重要的。对于 PS 端的 UART,可以进行串口回环通信的使用。关于这方面的资料在网上可以找到很多。引用中提到,这里不进行总结和分享。 除了 UARTZYNQ SoC 的底板接口资源也非常丰富。引用列举了一些接口,包括2路 CameraLink 双向可输入输出、1路 SFP 光口、2路千兆网口、双通道 PCIe、USB、1路 4K HDMI OUT、Micro SD、LPC FMC、M.2接口、音频输入输出等。这些接口的存在方便了用户进行产品方案评估与技术预研。 另外,ZYNQ SoC 还可以通过一些通信接口将 DSP (Digital Signal Processor) 和 ZYNQ 结合在一起,形成 DSP Zynq 架构。这样的架构实现了需求独特、灵活、功能强大的高速数据采集处理系统。引用提到了一些通信接口,包括 SPI、EMIF16、uPP、SRIO。 总结来说,ZYNQ SoC 中的 UART 是实现串行通信的重要外设,而底板上还有丰富的接口资源可以进行其他功能的扩展和应用。同时,通过一些通信接口,可以将 DSP 和 ZYNQ 结合在一起,形成强大的高速数据采集处理系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Ultrascale+ ZYNQ UART(二) 接收不定长数据实例](https://blog.csdn.net/weixin_38288325/article/details/132440185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于C6657+ZYNQ7045的DSP+ARM+FPGA主控板设计方案](https://blog.csdn.net/YEYUANGEN/article/details/125670686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值