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