x
Dependents: 20180621_FT813 STM32_180SENSOR_ADC4_RS_Ver2_CommCLD
WDT.cpp
- Committer:
- JackB
- Date:
- 2018-07-23
- Revision:
- 0:aae68a400cf2
File content as of revision 0:aae68a400cf2:
#include "WDT.h" // Load timeout value in watchdog timer and enable void WDT::Configure(float timeout) { #ifdef LPC LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 LPC_WDT->WDTC = (uint32_t)(timeout * (float)clk); LPC_WDT->WDMOD = 0x3; // Enabled and Reset #endif #ifdef ST_NUCLEO // see http://embedded-lab.com/blog/?p=9662 #define LsiFreq (45000) uint16_t PrescalerCode; uint16_t Prescaler; uint16_t ReloadValue; // float timeout = 10; float Calculated_timeout; if ((timeout * (LsiFreq/4)) < 0x7FF) { PrescalerCode = IWDG_PRESCALER_4; Prescaler = 4; } else if ((timeout * (LsiFreq/8)) < 0xFF0) { PrescalerCode = IWDG_PRESCALER_8; Prescaler = 8; } else if ((timeout * (LsiFreq/16)) < 0xFF0) { PrescalerCode = IWDG_PRESCALER_16; Prescaler = 16; } else if ((timeout * (LsiFreq/32)) < 0xFF0) { PrescalerCode = IWDG_PRESCALER_32; Prescaler = 32; } else if ((timeout * (LsiFreq/64)) < 0xFF0) { PrescalerCode = IWDG_PRESCALER_64; Prescaler = 64; } else if ((timeout * (LsiFreq/128)) < 0xFF0) { PrescalerCode = IWDG_PRESCALER_128; Prescaler = 128; } else { PrescalerCode = IWDG_PRESCALER_256; Prescaler = 256; } // specifies the IWDG Reload value. This parameter must be a number between 0 and 0x0FFF. ReloadValue = (uint32_t)(timeout * (LsiFreq/Prescaler)); Calculated_timeout = ((float)(Prescaler * ReloadValue)) / LsiFreq; // printf("WATCHDOG set with prescaler:%d reload value: 0x%X - timeout:%f\n",Prescaler, ReloadValue, Calculated_timeout); IWDG->KR = KR_REG_ACCESS_VAL; //Disable write protection of IWDG registers IWDG->PR = PrescalerCode; //Set PR value IWDG->RLR = ReloadValue; //Set RLR value IWDG->KR = KR_KEY_RELOAD_VAL; //Reload IWDG IWDG->KR = KR_KEY_ENABLE_VAL; //Start IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf #endif Service(); } // "kick" or "feed" the dog - reset the watchdog timer // by writing this required bit pattern void WDT::Service() { #ifdef LPC LPC_WDT->WDFEED = 0xAA; LPC_WDT->WDFEED = 0x55; #endif #ifdef ST_NUCLEO IWDG->KR = KR_KEY_RELOAD_VAL; //Reload IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf #endif } // bool WDT::WatchdogCausedReset() { // return wdreset; // }