本文主要是介绍【Autosar】MCAL - WDG(NXP - S32K14x),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- MCAL - WDG(NXP - S32K14x)
- 1. 概述
- 1.1 看门狗工作原理
- 1.2 看门狗时钟源
- 1.3 软件超时时间介绍
- 2. API
- 3. 配置介绍
- 3.1 General
- 3.4 WdgSettingsConfig
- 3.4.1 General
- 3.4.2 WdgSetting(Fast / Slow / Off)
MCAL - WDG(NXP - S32K14x)
MCAL - 汇总
配置工具:EB Tresos Studio
芯片类型:S32K146
1. 概述
看门狗是为了程序能够按照预期执行,不会出现死循环、程序跑飞等异常情况发生。在设置的规定时间内用户需要对看门狗进行喂狗操作,否则发生看门狗复位。看门狗有三种工作模式:Fast、Slow、Off。
1.1 看门狗工作原理
- 硬件部分
如上图所示,看门狗模块中,将Counter Register
寄存器与Timeout Value Register
寄存器进行比较,当计数值>超时时间时,会控制CPU Reset。通过设置Refresh Sequence Write Control
寄存器进行喂狗,喂狗后Counter Register
会被清0。这里的喂狗操作由GPT(定时器)配合,GPT中断回调函数配置看门狗喂狗(用户无需关心),GPT的触发时间为超时时间的一半。由于设计关系,GPT的时钟频率需要与看门狗的时钟频率保持一致
。
- 软件部分
由于看门狗的寄存器为16Bit,最大值为65535,假设时钟频率为8MHz,最大超时时间 = 65535 / 8000000 ≈ 0.008s,NXP为了放大超时时间,在RAM中设置了一个超时时间变量让用户去设置,对于用户来说,这个才是看门狗。
1.2 看门狗时钟源
WDG的时钟源可选择的有:LPO_CLK
、SOSC_CLK
、SIRC_CLK
。
1.3 软件超时时间介绍
关注点:
- Gpt超时时间(硬件喂狗)
- 软件周期喂狗时间(软件喂狗)
- 软件周期设置超时时间(
这个超时时间是软件看门狗的超时时间
)
个人总结:
公式:软件超时时间 >= n * (X/2) && n * (X/2) > 周期任务)
在Wdg_ChannelTrigger
函数中可以找到如下代码,每一次Gpt定时中断触发进行喂狗的时候,都会对软件超时时间
进行操作,当剩余超时时间 < Gpt周期触发时间的时候停止定时器(停止喂狗)
,否则剩余超时间减去Gpt周期触发时间
。
if( Wdg_au32Timeout[Wdg_Instance] < Wdg_au32GptPeriod[Wdg_Instance])
{MCAL_FAULT_INJECTION_POINT(T_WDG_INJ_TG_0);SchM_Exit_Wdg_WDG_EXCLUSIVE_AREA_00();Gpt_StopTimer(Wdg_apConfigPtr[Wdg_Instance]->Wdg_TimerChannel);
}
else
{u32TempTimeout = Wdg_au32Timeout[Wdg_Instance] - Wdg_au32GptPeriod[Wdg_Instance];Wdg_au32Timeout[Wdg_Instance] = u32TempTimeout;SchM_Exit_Wdg_WDG_EXCLUSIVE_AREA_00(); Wdg_IPW_Trigger(Wdg_Instance);
}
在Wdg_ChannelSetTriggerCondition
函数中可以找到如下代码,当用户去设置超时时间的时候,系统会判断Gpt_Elapsed>剩余超时时间,则停止定时器(停止喂狗),当下一次看门狗超时了就会发生复位。
/** @violates @ref Wdg_c_REF_7 MISRA 2004 Required Rule 10.1, The value of expression of integer type shall not be implicilty */
uElapsedTime = Gpt_GetTimeElapsed(Wdg_apConfigPtr[Wdg_Instance]->Wdg_TimerChannel);
if (((uint16)(uElapsedTime) > Wdg_au32Timeout[Wdg_Instance]) || ((uint16)0 == u16Timeout))
{Wdg_au32Timeout[Wdg_Instance] = (uint32)0;SchM_Exit_Wdg_WDG_EXCLUSIVE_AREA_03();Gpt_StopTimer(Wdg_apConfigPtr[Wdg_Instance]->Wdg_TimerChannel);
}
看门狗超时后CPU发生复位,跳转至Reset_Handler:
2. API
函数 | 描述 |
---|---|
Wdg_Init | 看门狗初始化 |
Wdg_SetMode | 看门狗模式设置 |
Wdg_SetTriggerCondition | 看门狗超时时间设置(非寄存器值) |
3. 配置介绍
3.1 General
Wdg Initial Timeout:
初始超时时间
在Wdg_ChannelInit
函数中可以看到WDG_INITIAL_TIMEOUT_U16
,在Wdg初始化的时候,超时时间的初始值为该值:
/**
* @brief This variable will indicate the Wdg Initial Timeout parameter in miliseconds
*/
#define WDG_INITIAL_TIMEOUT_U16 ((uint16)1000)
Wdg_au32Timeout[Wdg_Instance] = (uint32)(WDG_INITIAL_TIMEOUT_U16 *(Wdg_apConfigPtr[Wdg_Instance]->Wdg_u32TriggerSourceClock));
Wdg Max Timeout:
最大可设置的超时时间,用于合法性检查
从下面这段代码可以看到,设置超时时间的时候,会去与该值进行比较,若超出范围则报错:
/**
* @brief This variable will indicate the Wdg Max Timeout parameter in miliseconds
*/
#define WDG_MAX_TIMEOUT_U16 ((uint16)65000)
LOCAL_INLINE FUNC(Std_ReturnType, WDG_CODE) Wdg_ValidateTimeout(VAR(uint16, AUTOMATIC)u16Timeout,CONST(Wdg_IPW_InstanceType, WDG_CONST) Wdg_Instance)
{VAR(Std_ReturnType, AUTOMATIC) valid = (Std_ReturnType)E_OK;if (u16Timeout > WDG_MAX_TIMEOUT_U16){(void)Det_ReportError((uint16)WDG_CHANNEL_MODULE_ID, (uint8)Wdg_au8Index[Wdg_Instance],(uint8)WDG_SETTRIGGERCONDITION_ID,(uint8)WDG_E_PARAM_TIMEOUT);valid = (Std_ReturnType)E_NOT_OK;}return valid;
}
Wdg Reconfiguration Success Timeout:
看门狗初始化超时时间
在Wdg_Wdog_Init
函数中可以看到WDG_RECONFIGURATION_TIMEOUT
,对WDG配置后,检查是否配置成功,若配置失败则报告错误:
/**
* @brief This is a timeout value which is used to wait till WDG_CS[RCS] is reset to show that the WDOG is reconfigured
*/
#define WDG_RECONFIGURATION_TIMEOUT (65535UL)
u32Timeout = (uint32)WDG_RECONFIGURATION_TIMEOUT;/* @violates @ref Wdg_Wdog_c_REF_4 Violates MISRA 2004 Rule 11.1, Cast from unsigned long to pointer.*/
/* @violates @ref Wdg_Wdog_c_REF_6 Violates MISRA 2004 Rule 11.3, Cast from unsigned long to pointer.*/
REG_WRITE32(WDOG_CS_ADDR32(Wdg_Instance),(Wdog_pConfigPtr->Wdog_u32Config));/* Check if reconfiguration was done in the timeout */
/* @violates @ref Wdg_Wdog_c_REF_4 Violates MISRA 2004 Rule 11.1, Cast from unsigned long to pointer.*/
/* @violates @ref Wdg_Wdog_c_REF_6 Violates MISRA 2004 Rule 11.3, Cast from unsigned long to pointer.*/
u32TempRec = REG_READ32(WDOG_CS_ADDR32(Wdg_Instance)) & WDOG_REC_SUCCESS_U32;
while ((u32Timeout > 0UL) && (u32TempRec != WDOG_REC_SUCCESS_U32))
{u32Timeout--;/* @violates @ref Wdg_Wdog_c_REF_4 Violates MISRA 2004 Rule 11.1, Cast from unsigned long to pointer.*//* @violates @ref Wdg_Wdog_c_REF_6 Violates MISRA 2004 Rule 11.3, Cast from unsigned long to pointer.*/u32TempRec = REG_READ32(WDOG_CS_ADDR32(Wdg_Instance)) & WDOG_REC_SUCCESS_U32;
}if (0UL == u32Timeout)
{#if (WDG_DISABLE_DEM_REPORT_ERROR_STATUS == STD_OFF)if((uint32)STD_ON == Wdg_E_Timeout_Expired.state){Dem_ReportErrorStatus((Dem_EventIdType)Wdg_E_Timeout_Expired.id, DEM_EVENT_STATUS_FAILED);}#endif
}
3.4 WdgSettingsConfig
3.4.1 General
配置看门狗的默认模式
Wdg Default Mode:
看门狗默认模式配置(Fast/Slow/Off)
Wdg External Trigger Counter:
配置关联的Gpt(WDG控制GPT来实现启/停喂狗)
3.4.2 WdgSetting(Fast / Slow / Off)
不同模式下的Wdg配置
Wdg Clock Value:
时钟频率值(选择完时钟参考点后,自动计算即可)
WdgClkSecRef:
Wdg时钟参考点
Wdg Operation Mode:
超时处理模式(Interrupt / ResetOnTimeOut)
Wdg Clock Selection:S
时钟源选择
Wdg Timeout Period:
定时周期(因为硬件最大计数为65536,所以0.008 * 8000000 = 64000已接近最大值)
参考资料:
S32K-RM.pdf - NXP
AUTOSAR_MCAL_WDG_UM[1].pdf - NXP
这篇关于【Autosar】MCAL - WDG(NXP - S32K14x)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!