華大單片機(jī)復(fù)位原因的確定
本文以華大MCU HC32F003為例說明相應(yīng)的操作。
HC32F003一共有7個復(fù)位信號來源,每個復(fù)位信號都可以讓CPU重新運(yùn)行,絕大多數(shù)寄存器會被復(fù)位到復(fù)位值,程序計數(shù)器 PC 會被復(fù)位指向 00000000。
復(fù)位時復(fù)位標(biāo)識寄存器(Reset_flag )的復(fù)位值為 00000000_00000000_00000000_xxxxxx11b。
POR/BOR 復(fù)位(VCC 域及 Vcore 域)
外部 Reset PAD 復(fù)位 WDT 復(fù)位
PCA 復(fù)位 LVD 復(fù)位
Cortex-M0+ SYSRESETREQ 軟件復(fù)位
Cortex-M0+ LOCKUP 硬件復(fù)位
每個復(fù)位源由相應(yīng)的復(fù)位標(biāo)志進(jìn)行指示。復(fù)位標(biāo)志均由硬件置位,需要用戶軟件清零。
芯片復(fù)位時,如果查詢到 Reset_flag. POR15V 或 Reset_flag. POR5V 為 1 則為 上電復(fù)位。
由于仿真器的局限性,芯片復(fù)位的時候不建議用仿真器來讀Reset_flag的值。建議使用UART將Reset_flag的值輸出。
下面以一段WDT復(fù)位的程序顯示一下,相關(guān)代碼如下:
#define DEBUG #include "gpio.h"
int main(){ int8_t RstData = 0; if ( M0P_RESET->RESET_FLAG_f.POR15 || M0P_RESET->RESET_FLAG_f.POR5V ) //上電復(fù)位,清Reset_flag { M0P_RESET->RESET_FLAG = 0X00; } Clk_SetPeripheralGate(ClkPeripheralUart0, TRUE); //開UART0外設(shè)時鐘 Clk_SetPeripheralGate(ClkPeripheralBt, TRUE); //開定時器外設(shè)時鐘 Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //開GPIO外設(shè)時鐘 RstData = (int8_t)M0P_RESET->RESET_FLAG ; #ifdef DEBUG Debug_UartInit(); //調(diào)試串口初始化#endif #ifdef DEBUG printf("The RESET_FLAG is %x \n",RstData); //輸出調(diào)試內(nèi)容#endif M0P_RESET->RESET_FLAG = 0X00; //清Reset_flag M0P_CLOCK->PERI_CLKEN_f.WDT = 0X01; //打開WDT時鐘 M0P_WDT->CON_f.WOV = 0X0A; //定時1.64s M0P_WDT->CON_f.WINT_EN = 0X00; //WDT溢出復(fù)位 M0P_WDT->RST = 0x1E; //啟動WDT M0P_WDT->RST = 0xE1; while(1) { __enable_irq(); ; }}
程序測試結(jié)果如下:
相關(guān)的測試代碼附件可以到論壇下載(閱讀原文)。
華大單片機(jī)-中國芯,中國夢中國人用自己的“芯”
• 如有技術(shù)與價格疑問,可以隨時撥打電話或QQ咨詢
• 我司有強(qiáng)大的技術(shù)團(tuán)隊,可根據(jù)您的要求進(jìn)行研發(fā)設(shè)計,量身定做,客戶滿意是我們的最高宗旨~!
• 電話:18124577713 QQ:783592501 • 華大MCU交流QQ群: 164973950
|