本文以华大MCU HC32F003为例说明相应的操作。
HC32F003一共有7个复位信号来源,每个复位信号都可以让CPU重新运行,绝大多数寄存器会被复位到复位值,程序计数器 PC 会被复位指向 00000000。
复位时复位标识寄存器(Reset_flag )的复位值为 00000000_00000000_00000000_xxxxxx11b。
Ÿ POR/BOR 复位(VCC 域及 Vcore 域)
Ÿ 外部 Reset PAD 复位Ÿ WDT 复位
Ÿ PCA 复位Ÿ LVD 复位
Ÿ Cortex-M0+ SYSRESETREQ 软件复位
Ÿ Cortex-M0+ LOCKUP 硬件复位
每个复位源由相应的复位标志进行指示。复位标志均由硬件置位,需要用户软件清零。
芯片复位时,如果查询到 Reset_flag. POR15V 或 Reset_flag. POR5V 为 1 则为 上电复位。
由于仿真器的局限性,芯片复位的时候不建议用仿真器来读Reset_flag的值。建议使用UART将Reset_flag的值输出。
下面以一段WDT复位的程序显示一下,相关代码如下:
#define DEBUG #include "gpio.h"
int main(){ int8_t RstData = 0; if ( M0P_RESET->RESET_FLAG_f.POR15 || M0P_RESET->RESET_FLAG_f.POR5V ) //上电复位,清Reset_flag { M0P_RESET->RESET_FLAG = 0X00; } Clk_SetPeripheralGate(ClkPeripheralUart0, TRUE); //开UART0外设时钟 Clk_SetPeripheralGate(ClkPeripheralBt, TRUE); //开定时器外设时钟 Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //开GPIO外设时钟 RstData = (int8_t)M0P_RESET->RESET_FLAG ; #ifdef DEBUG Debug_UartInit(); //调试串口初始化#endif #ifdef DEBUG printf("The RESET_FLAG is %x \n",RstData); //输出调试内容#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溢出复位 M0P_WDT->RST = 0x1E; //启动WDT M0P_WDT->RST = 0xE1; while(1) { __enable_irq(); ; }}
|