01、Author
Hank Fu (付漢杰) Staff FAE embedded, Xilinx, Inc. hankf@xilinx.com
02、問題
有工程師反映,根據 MPSoC SWDT 在 Standalone 下的例子 xwdtps_polled_example.c,不能實現 MPSoC 的 PS 復位。SWDT 例子來自于目錄 /Xilinx/SDK/2018.3/data/embeddedsw/XilinxProcessorIPLib/drivers/wdtps_v3_1/examples/。SWDT 例子 xwdtps_polled_example.c 只檢查了超時狀態,沒有實現復位。工程師把其中的“XWdtPs_DisableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”改為“XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”,仍然不能復位。
工程師根據 FSBL 的 main.c 中的 InitWatchDog( ),添加代碼后,依然不能使 MPSoC 的 PS 復位。
03、分析
3.1. FSBL 的 main.c
main.c 是 Zynq-7000 的 FSBL 的代碼。客戶使用 SOurce Insight 分析代碼時,使用了錯誤的文件。
3.2. MPSoC 的 FSBL
MPSoC 的 FSBL 的主文件是 xfsbl_main.c,wdt 的代碼在 xfsbl_misc_drivers.c 和 xfsbl_misc_drivers.h 中,初始化 WDT 的函數是 u32 XFsbl_InitWdt(void),宏定義 XFSBL_WDT_EXPIRE_TIME 定義了 FSBL 中 wdt 的超時時間。
在 XFsbl_InitWdt(void)中,初始化并啟動 WDT(XWdtPs_RestartWdt( ))后,直接使用 sleep(20),睡眠 20 秒。睡眠過程中,因為 WDT 超時,MPSoC 的 PS 會被復位。這說明 FSBL 關于 WDT 代碼是正確的。
3.3. Standalone 下的 WDT
對比 MPSoC FSBL 初始化 WDT 的函數 XFsbl_InitWdt( ),發現它設置了 PMU 的 ERROR_SRST_EN_1 Register 和 ERROR_EN_1 Register。把相關代碼復制到 Standalone 下的代碼,在初始化 WDT 之前運行。重新編譯后,WDT 超時會復位 MPSoC 的 PS。
3.4. 再次運行時,設置 PMU 的 ERROR_SRST_EN_1 后,PS 馬上復位。
WDT 超時后,再次使用 Debugger 運行時,設置 PMU 的 ERROR_SRST_EN_1 后,WDT 還沒有被初始化時,PS 馬上被復位。檢查 PMU ERROR_STATUS_1 Register,發現 WDT 的超時狀態為 1。于是把讀取到的 ERROR_STATUS_1 的值,再寫回 ERROR_STATUS_1 Register,清除 WDT 的超時狀態。
這樣在 WDT 超時后,設置 PMU 的 ERROR_SRST_EN_1 后,PS 不會馬上被復位。
3.5. FPD_SWDT 和 LPD_SWDT
工程師發現使用 LPD_SWDT,能復位 PS;換成 FPD_SWDT,不能復位 PS。
在設置 PMU 的 ERROR_SRST_EN_1 Register 和 ERROR_EN_1 Register 時,LPD_SWDT 和 FPD_SWDT 有各自的使能位。增加設置 FPD_SWDT 的使能位后,換成 FPD_SWDT,也能復位 PS。
#define PMU_GLOBAL_ERROR_SRST_EN_1 ( ( PMU_GLOBAL_BASEADDR ) + 0X0000056CU )
#define PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK 0X00001000U
#define PMU_GLOBAL_ERROR_SRST_EN_1_FPD_SWDT_MASK 0X00002000U
04、Vivado 設置
使用 WDT,要在 Vivado 里的 PCW 里,使能對應的 WDT。
05、相關代碼
5.1. 檢查和清除 PMU 寄存器
xil_printf("/r/n" );
u32_reg = Xil_In32(0xFFD80530);
xil_printf("Old PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
Xil_Out32(0xFFD80530, u32_reg); // Clear PMU ERROR_STATUS_1 (PMU_GLOBAL) Register
u32_reg = Xil_In32(0xFFD80540);
xil_printf("Old PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
Xil_Out32(0xFFD80540, u32_reg); // Clear PMU ERROR_STATUS_2 (PMU_GLOBAL) Register
u32_reg = Xil_In32(0xFFD80530);
xil_printf("New PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
u32_reg = Xil_In32(0xFFD80540);
xil_printf("New PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
5.2. 檢查 SWDT 寄存器狀態
void CheckWDTRegisterValue( u32 EffectiveAddress )
{
u32 u32_reg;
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_ZMR_OFFSET);
xil_printf("WDT Zero Mode Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_CCR_OFFSET);
xil_printf("WDT Counter Control Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_RESTART_OFFSET);
xil_printf("WDT Restart Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_SR_OFFSET);
xil_printf("WDT Status Register: %x./r/n", u32_reg );
}
審核編輯 黃昊宇
-
PSoC
+關注
關注
12文章
172瀏覽量
92114
發布評論請先 登錄
相關推薦
英飛凌PSoC 4000T榮獲芯片技術突破獎
基于PSOC6的智能環境監控系統
![基于<b class='flag-5'>PSOC</b>6的智能環境監控系統](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
英飛凌推出PSOC? Control MCU系列,用于工業和消費應用的電機控制與功率轉換
使用PSoC5LP的過程中,遇到PSoC5LP在EFT干擾時復位的問題怎么解決?
英飛凌發布全新PSOC Edge微控制器系列
使用PSOC UART與Nextion HMI進行通信,PSOC UART發送字符串不起作用的原因?
PSOC4 CY8CKIT-044在PSOC Creator 4.4中無法識別是怎么回事?
STM32CubeF4 1.24.0的DFU_Standalone工程不能識別設備是什么原因導致的?
什么是可編程片上系統?PSOC和FPGA的區別
玩轉PSoC 6 RTT積木式開發套件,實現毫米波雷達等實用功能
![玩轉<b class='flag-5'>PSoC</b> 6 RTT積木式開發套件,實現毫米波雷達等實用功能](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
評論