有这样一个需求,我想知道我写好的程序在S32K144中运行的情况怎么样,有没有被看门狗重启过,或者有没有被其他的方式复位,比如外部引脚复位。S32K144支持查看复位或启动的原因。
做这个事情,大概分成3个步骤:
配置电源管理模块,使得代码可以调用查看复位原因的方法。
在代码中调用查看复位原因的方法。
通过CAN或者其他通讯方式将结果输出到电脑上进行查看分析。
我是安装的S32 Design Studio for ARM Version 2.2进行S32K144开发的。
配置电源管理模块的方法,双击Components,双击power_manager。
查看复位原因的方法名是 POWER_SYS_GetResetSrcStatusCmd(),以下是测试示例代码:
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_WATCH_DOG) == true){
masterRxBuffer[0] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_EXTERNAL_PIN) == true){
masterRxBuffer[1] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_POWER_ON) == true){
masterRxBuffer[2] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_SJTAG) == true){
masterRxBuffer[3] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_CORE_LOCKUP) == true){
masterRxBuffer[4] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_SOFTWARE) == true){
masterRxBuffer[5] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_SMDM_AP) == true){
masterRxBuffer[6] = 1;
}
if(POWER_SYS_GetResetSrcStatusCmd(RCM, RCM_STOP_MODE_ACK_ERR) == true){
masterRxBuffer[7] = 1;
}
recvmsg_can0.id = 0x120;
can0_sendmsg(recvmsg_can0.id, masterRxBuffer);
POWER_SYS_GetResetSrcStatusCmd()方法的第二个参数类型是枚举类型:
typedef enum
{
RCM_LOW_VOLT_DETECT = 1U, /*!< Low voltage detect reset */
RCM_LOSS_OF_CLK = 2U, /*!< Loss of clock reset */
RCM_LOSS_OF_LOCK = 3U, /*!< Loss of lock reset */
#if FEATURE_RCM_HAS_CMU_LOSS_OF_CLOCK
RCM_CMU_LOC = 4U, /*!< CMU Loss of lock reset */
#endif
RCM_WATCH_DOG = 5U, /*!< Watch dog reset */
RCM_EXTERNAL_PIN = 6U, /*!< External pin reset */
RCM_POWER_ON = 7U, /*!< Power on reset */
RCM_SJTAG = 8U, /*!< JTAG generated reset */
RCM_CORE_LOCKUP = 9U, /*!< core lockup reset */
RCM_SOFTWARE = 10U, /*!< Software reset */
RCM_SMDM_AP = 11U, /*!< MDM-AP system reset */
RCM_STOP_MODE_ACK_ERR = 13U, /*!< Stop mode ack error reset */
RCM_SRC_NAME_MAX
} rcm_source_names_t;
具体含义参考后面的注释,我关注的是否为看门狗重启,因此RCM_WATCH_DOG是我的焦点。
启动看门狗后,且不给喂狗,测试的效果如下: