ZYNQ multiBoot

编程入门 行业动态 更新时间:2024-10-21 09:14:48

<a href=https://www.elefans.com/category/jswz/34/1764298.html style=ZYNQ multiBoot"/>

ZYNQ multiBoot

接上一篇FLASH烧写总结,将FLASH分为2个区,A和B区,A区地址小,B区地址大,B区存放最原始能正确运行的程序。
每次更新的程序存放到A区域。

也可以存储多个功能的程序,指令形式让程序运行不同的应用层程序。如下:

/* A 程序 下载FLASH地址0的地方开始*/

#include <stdio.h>
#include “platform.h”
#include “xil_printf.h”
#include “xil_io.h”
#include “sleep.h”

#define PSS_RST_CTRL_REG 0xF8000200 //PSS_RST_CTRL寄存器,绝对地址,
#define SLCR_UNLOCK_ADDR 0xF8000008 //SLCR_UNLOCK寄存器,绝对地址,
#define UNLOCK_KEY 0xDF0D //使能码
#define PSS_RST_MASK 0x01 //复位码

#define XDCFG_MULTIBOOT_ADDR_OFFSET_REG 0xF800702C //MULTIBOOT寄存器,绝对地址,
#define XDCFG_UNLOCK_OFFSET_ADDR 0xF8007034 //XDCFG_UNLOCK_寄存器,绝对地址,
#define UNLOCK_XDCFG_KEY 0x757BDF0D //使能码

#define APP1_LOCATION 0x00 //Hello_World_1位置
#define APP2_LOCATION 0x08 //Hello_World_2位置 以32KB为单位,8*0x8000=0x40000

void psSoftwareReset(void)
{
Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY); //写使能
Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK); //复位
}

void modifyMultiBoot(void)
{
Xil_Out32(XDCFG_UNLOCK_OFFSET_ADDR , UNLOCK_XDCFG_KEY ); //写使能
Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , APP2_LOCATION ); //更改MULTIBOOT
}

int main()
{
init_platform();

print("Hello World from at address 0x0000_0000\r\n");modifyMultiBoot();
psSoftwareReset();cleanup_platform();
return 0;

}

/* B 程序 FLASH地址256K(0x40000)的地方开始*/

#include <stdio.h>
#include “platform.h”
#include “xil_printf.h”
#include “xil_io.h”
#include “sleep.h”

#define PSS_RST_CTRL_REG 0xF8000200 //PSS_RST_CTRL寄存器,绝对地址,
#define SLCR_UNLOCK_ADDR 0xF8000008 //SLCR_UNLOCK寄存器,绝对地址,
#define UNLOCK_KEY 0xDF0D //使能码
#define PSS_RST_MASK 0x01 //复位码

#define XDCFG_MULTIBOOT_ADDR_OFFSET_REG 0xF800702C //MULTIBOOT寄存器,绝对地址,
#define XDCFG_UNLOCK_OFFSET_ADDR 0xF8007034 //XDCFG_UNLOCK_寄存器,绝对地址,
#define UNLOCK_XDCFG_KEY 0x757BDF0D //使能码

#define APP1_LOCATION 0x00 //Hello_World_1位置
#define APP2_LOCATION 0x08 //Hello_World_2位置 以32KB为单位,8*0x8000=0x40000

void psSoftwareReset(void)
{
Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY); //写使能
Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK); //复位
}

void modifyMultiBoot(void)
{
Xil_Out32(XDCFG_UNLOCK_OFFSET_ADDR , UNLOCK_XDCFG_KEY ); //写使能
Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , APP1_LOCATION ); //更改MULTIBOOT
}

int main()
{
init_platform();

print("Hello World from at address 0x0000_0000\r\n");modifyMultiBoot();
psSoftwareReset();cleanup_platform();
return 0;

}

上面分别存储在A和B区的两个程序,从0地址启动app1,然后运行地址0x40000开始的app2, 运行程序2,又从地址0开始运行app1。如此循环下去。

更多推荐

ZYNQ multiBoot

本文发布于:2024-03-08 19:11:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1721979.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ZYNQ   multiBoot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!