S32K144测试看门狗模块
看门狗的测试采用初始化看门狗定时器及超时计数器后,在一个较长时间不喂狗,看芯片是否复位。测试的难度在于时钟的选择以及复位效果的观察。
S32K144看门狗计数器是16位的,也就是最大计数可以到65532。如果选择一个较高的时钟会导致芯片很快复位,无法观察实际效果。所以建议选择低速LPO时钟,将LPO时钟配置成1K,最大喂狗时间可以设置到63s左右。
LPO时钟配置成1K
看门狗选择LPO时钟
生成的看门狗通用代码如下:
wdog_user_config_t watchdog1_Config0 = {
.clkSource = WDOG_LPO_CLOCK,
.opMode = {
false, /* Wait Mode*/
false, /* Stop Mode*/
false /* Debug Mode*/
},
.updateEnable = true,
.intEnable = false,
.winEnable = false,
.windowValue = 0,
.timeoutValue = 64000,
.prescalerEnable = false
};
提供初始化及测试接口
/***********************************************************************************
Function: void watchdog_init(uint16_t timems)
Description: 初始化看门狗
Input: time 配置看门狗超时计数值,最大为65532
Output: NONE
Return: NONE
Others: NONE
************************************************************************************/
void watchdog_init(uint16_t timems)
{
//配置看门狗超时计数值,最大为65532
uint16_t timeval = timems*WDG_MS_PERIOD;
if(timeval》65532)
timeval=65532;
watchdog1_Config0.timeoutValue = timeval;
//初始化看门狗
WDOG_DRV_Init(INST_WATCHDOG1, &watchdog1_Config0);
//启动看门狗
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
//喂狗接口
void feed_dog_hal(void)
{
//重置看门狗定时器
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
测试过程,由于看门狗生效后芯片会重启,所以无法仿真,设计了一段代码,通过打印来观察实际的芯片重启效果。连续打印10次后,进入while等待,直到喂狗计数器溢出,芯片重启,再次进行打印…
int main()
{
//。..。..
//看门狗测试 1s后超时
watchdog_init(1000);
while(1)
{
//测试看门狗
count++;
my_printf(“The current testvalue is %dn”, count);
if(count%10==0){
//让程序超时不喂狗
my_printf(“I will make a default to stop this process!! rn”);
while(1)
{
//尝试喂狗
//feed_dog_hal();
}
}
}
}
如果在while等待中加入喂狗程序,可以发现打印10次之后,程序一直在while中等待,没有再次打印,如果在线仿真,可以发现仿真没有断开。完成测试。
S32K144测试看门狗模块
看门狗的测试采用初始化看门狗定时器及超时计数器后,在一个较长时间不喂狗,看芯片是否复位。测试的难度在于时钟的选择以及复位效果的观察。
S32K144看门狗计数器是16位的,也就是最大计数可以到65532。如果选择一个较高的时钟会导致芯片很快复位,无法观察实际效果。所以建议选择低速LPO时钟,将LPO时钟配置成1K,最大喂狗时间可以设置到63s左右。
LPO时钟配置成1K
看门狗选择LPO时钟
生成的看门狗通用代码如下:
wdog_user_config_t watchdog1_Config0 = {
.clkSource = WDOG_LPO_CLOCK,
.opMode = {
false, /* Wait Mode*/
false, /* Stop Mode*/
false /* Debug Mode*/
},
.updateEnable = true,
.intEnable = false,
.winEnable = false,
.windowValue = 0,
.timeoutValue = 64000,
.prescalerEnable = false
};
提供初始化及测试接口
/***********************************************************************************
Function: void watchdog_init(uint16_t timems)
Description: 初始化看门狗
Input: time 配置看门狗超时计数值,最大为65532
Output: NONE
Return: NONE
Others: NONE
************************************************************************************/
void watchdog_init(uint16_t timems)
{
//配置看门狗超时计数值,最大为65532
uint16_t timeval = timems*WDG_MS_PERIOD;
if(timeval》65532)
timeval=65532;
watchdog1_Config0.timeoutValue = timeval;
//初始化看门狗
WDOG_DRV_Init(INST_WATCHDOG1, &watchdog1_Config0);
//启动看门狗
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
//喂狗接口
void feed_dog_hal(void)
{
//重置看门狗定时器
WDOG_DRV_Trigger(INST_WATCHDOG1);
}
测试过程,由于看门狗生效后芯片会重启,所以无法仿真,设计了一段代码,通过打印来观察实际的芯片重启效果。连续打印10次后,进入while等待,直到喂狗计数器溢出,芯片重启,再次进行打印…
int main()
{
//。..。..
//看门狗测试 1s后超时
watchdog_init(1000);
while(1)
{
//测试看门狗
count++;
my_printf(“The current testvalue is %dn”, count);
if(count%10==0){
//让程序超时不喂狗
my_printf(“I will make a default to stop this process!! rn”);
while(1)
{
//尝试喂狗
//feed_dog_hal();
}
}
}
}
如果在while等待中加入喂狗程序,可以发现打印10次之后,程序一直在while中等待,没有再次打印,如果在线仿真,可以发现仿真没有断开。完成测试。
举报