ch58x/ch59x窗口/独立看门狗
一、窗口看门狗
CH58x/CH59x的看门狗计数器是8位的(计数最大255),计数周期131072/Fsys
以582/592为例,evt中主频都是60M,看门狗最大时间 (131072/60000000)*255=0.557056s
具体使用方式:
#include "CH58x_common.h"
#define IRQ 1
#define RST !IRQ
static uint16_t i = 0;
void DebugInit(void){
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
}
int main(){
SetSysClock(CLK_SOURCE_PLL_60MHz);
/* 配置串口调试 */
DebugInit();
PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
#if IRQ
WWDG_SetCounter(0);//喂狗
WWDG_ITCfg(ENABLE);
PFIC_EnableIRQ(WDOG_BAT_IRQn);
#else
WWDG_SetCounter(0);//喂狗
WWDG_ClearFlag();
WWDG_ResetCfg(ENABLE);
#endif
while(1){
i++;
if(i == 0){
PRINT("III...\n");
}
WWDG_SetCounter(0);//喂狗
}
}
__INTERRUPT//中断函数
__HIGH_CODE
void WDOG_BAT_IRQHandler(void){
PRINT("WWDG IRQ...\n");
WWDG_SetCounter(0);
//代码配置,自行选择是否复位
}
注意点:
- 看门狗结合睡眠使用,喂狗在while循环中喂狗。睡眠时主频停止,因此看门狗是不运行的。睡眠后看门狗的寄存器会清0,因此不会重新复位。
- 结合flash一起使用,看门狗在操作flash的时候寄存也是在计数的,但是由于flash操作速度比较快,所以不喂狗也可以。如果操作flash的时间比较长,则使用看门狗中断的方式,因为在flash操作时所有中断都是停止的,所以此时看门狗寄存器在计数但是计满了也不会进看门狗的中断,等到操作flash结束会立马进入中断执行中断中的对应函数,此时可以在中断中通过标志的方式进行检测。如是因为操作flash进入的中断则继续顺序执行代码;如非操作flash而进入中断,说明此时的程序运行不正常,则进行复位等处理(中断中处理)。
二、独立看门狗
独立看门狗(IWDG)由专用的内部低速时钟(LSI)驱动(584/585)

根据寄存器描述,IWDG最大时间可以是(0xFFF/(32K/512))=65.52s
代码如下:
#define FEED_IWDG() {R32_IWDG_KR=0xAAAA;} //需要定时调用喂狗
初始化及喂狗配置:
void IWDG_Enable()
{
R32_IWDG_KR=0x5555;//解除IWDG保护
R32_IWDG_CFG |= (7<<12);//32K分频512,时钟62.5Hz
R32_IWDG_CFG &=0xFFFFF000;
R32_IWDG_CFG |=0xFFF;//看门狗时间约65s(0xFFF/(32K/512))
R32_IWDG_KR=0xCCCC; //开启IWDG保护
}
void main()
{
IWDG_Enable(); //使能IWDG
PRINT("R32_IWDG_CFG = %x\r\n", R32_IWDG_CFG);
while(1){
FEED_IWDG(); //喂狗
}
}
喂狗时间具体由这个寄存器决定的R32_IWDG_CFG通过修改分频系数和重装载值。
注意点:
- 使用外部32K晶振,则需要手动将内部32K上电,因为独立看门狗是基于内部32K生效的;
浙公网安备 33010602011771号