Xilinx软件开发:如何通过软件复位MPSOC

mpsoc系列的复位与zynq 7000系列不太一样,7000是通过slcr寄存器来实现软件复位,MPSOC是通过CRL_APB

实际复位代码如下

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"


#define MPSOC_RESET_REASON_REG 0xFF5E0220  //16bit

#define MPSOC_RESET_CTRL_REG   0xFF5E0218 //寄存器RESET_CTRL
#define MPSOC_RESET_VALUE      0x10      //复位bit4 (Width=8)

void PsSoftwareReset(void)
{
    Xil_Out8(MPSOC_RESET_CTRL_REG, MPSOC_RESET_VALUE);  //复位
}

void getResetReason(void)
{
	int status;

	status = Xil_In16(MPSOC_RESET_REASON_REG);
	xil_printf("\n\rResetReason = 0x%.8X\n\r", status);
	if(status & 0x40)
		xil_printf("6 Software Debugger Reset\n\r");
	if(status & 0x20)
			xil_printf("5 Software System Reset\n\r");
	if(status & 0x10)
			xil_printf("4 External System Reset\n\r");
	if(status & 0x08)
			xil_printf("3 PS-only Reset\n\r");
	if(status & 0x04)
			xil_printf("2 Internal System Reset\n\r");
	if(status & 0x02)
			xil_printf("1 A system error triggered a POR reset\n\r");
	if(status & 0x01)
			xil_printf("0 the PS_POR_B reset signal pin was asserted\n\r");
	xil_printf("\n\r");
}

int main()
{
    init_platform();

    xil_printf("Hello World\n\r");

    getResetReason();

    PsSoftwareReset();

    printf("PsSoftwareReset\n\r");


    printf("Successfully ran Hello World application");
    cleanup_platform();
    return 0;
}

其中getResetReason是获取复位原因

例如,把开发板置为jtag模式,正常上电,用jtag运行上面的程序,结果如下

  ResetReason的bit0为1,代表是上电复位,bit6为1代表是仿真器复位

然后在不断电的情况下,重新运行这段程序

会看到多了bit5为1,代表cpu成功被软件复位了

具体含义参考ug1085和ug1087

复位系统框图

 

文档说明

复位原因寄存器

 

寄存器描述

参考ug1087,搜索CRL_APB


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值