接上一篇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。如此循环下去。