File indexing completed on 2025-05-11 08:23:02
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "fsl_wdog.h"
0010
0011
0012 #ifndef FSL_COMPONENT_ID
0013 #define FSL_COMPONENT_ID "platform.drivers.wdog01"
0014 #endif
0015
0016
0017
0018
0019 static WDOG_Type *const s_wdogBases[] = WDOG_BASE_PTRS;
0020 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0021
0022 static const clock_ip_name_t s_wdogClock[] = WDOG_CLOCKS;
0023 #endif
0024
0025 static const IRQn_Type s_wdogIRQ[] = WDOG_IRQS;
0026
0027
0028
0029
0030 static uint32_t WDOG_GetInstance(WDOG_Type *base)
0031 {
0032 uint32_t instance;
0033
0034
0035 for (instance = 0; instance < ARRAY_SIZE(s_wdogBases); instance++)
0036 {
0037 if (s_wdogBases[instance] == base)
0038 {
0039 break;
0040 }
0041 }
0042
0043 assert(instance < ARRAY_SIZE(s_wdogBases));
0044
0045 return instance;
0046 }
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 void WDOG_GetDefaultConfig(wdog_config_t *config)
0069 {
0070 assert(NULL != config);
0071
0072
0073 (void)memset(config, 0, sizeof(*config));
0074
0075 config->enableWdog = true;
0076 config->workMode.enableWait = false;
0077 config->workMode.enableStop = false;
0078 config->workMode.enableDebug = false;
0079 config->enableInterrupt = false;
0080 config->softwareResetExtension = false;
0081 config->enablePowerDown = false;
0082 config->timeoutValue = 0xffu;
0083 config->interruptTimeValue = 0x04u;
0084 config->enableTimeOutAssert = false;
0085 }
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104 void WDOG_Init(WDOG_Type *base, const wdog_config_t *config)
0105 {
0106 assert(NULL != config);
0107
0108 uint16_t value = 0u;
0109 uint32_t primaskValue = 0U;
0110
0111 value = WDOG_WCR_WDE(config->enableWdog) | WDOG_WCR_WDW(config->workMode.enableWait) |
0112 WDOG_WCR_WDZST(config->workMode.enableStop) | WDOG_WCR_WDBG(config->workMode.enableDebug) |
0113 WDOG_WCR_SRE(config->softwareResetExtension) | WDOG_WCR_WT(config->timeoutValue) |
0114 WDOG_WCR_WDT(config->enableTimeOutAssert) | WDOG_WCR_SRS_MASK | WDOG_WCR_WDA_MASK;
0115
0116 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0117
0118 CLOCK_EnableClock(s_wdogClock[WDOG_GetInstance(base)]);
0119 #endif
0120
0121 primaskValue = DisableGlobalIRQ();
0122 base->WICR = WDOG_WICR_WICT(config->interruptTimeValue) | WDOG_WICR_WIE(config->enableInterrupt);
0123 base->WMCR = WDOG_WMCR_PDE(config->enablePowerDown);
0124 base->WCR = value;
0125 EnableGlobalIRQ(primaskValue);
0126 if (config->enableInterrupt)
0127 {
0128 (void)EnableIRQ(s_wdogIRQ[WDOG_GetInstance(base)]);
0129 }
0130 }
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140 void WDOG_Deinit(WDOG_Type *base)
0141 {
0142 if (0U != (base->WCR & WDOG_WCR_WDBG_MASK))
0143 {
0144 WDOG_Disable(base);
0145 }
0146 }
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 uint16_t WDOG_GetStatusFlags(WDOG_Type *base)
0163 {
0164 uint16_t status_flag = 0U;
0165
0166 status_flag |= (base->WCR & WDOG_WCR_WDE_MASK);
0167 status_flag |= (base->WRSR & WDOG_WRSR_POR_MASK);
0168 status_flag |= (base->WRSR & WDOG_WRSR_TOUT_MASK);
0169 status_flag |= (base->WRSR & WDOG_WRSR_SFTW_MASK);
0170 status_flag |= (base->WICR & WDOG_WICR_WTIS_MASK);
0171
0172 return status_flag;
0173 }
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189 void WDOG_ClearInterruptStatus(WDOG_Type *base, uint16_t mask)
0190 {
0191 if (0U != (mask & (uint16_t)kWDOG_InterruptFlag))
0192 {
0193 base->WICR |= WDOG_WICR_WTIS_MASK;
0194 }
0195 }
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205 void WDOG_Refresh(WDOG_Type *base)
0206 {
0207 uint32_t primaskValue = 0U;
0208
0209
0210 primaskValue = DisableGlobalIRQ();
0211 base->WSR = WDOG_REFRESH_KEY & 0xFFFFU;
0212 base->WSR = (WDOG_REFRESH_KEY >> 16U) & 0xFFFFU;
0213 EnableGlobalIRQ(primaskValue);
0214 }