x

Dependents:   20180621_FT813 STM32_180SENSOR_ADC4_RS_Ver2_CommCLD

Committer:
JackB
Date:
Mon Jul 23 12:24:16 2018 +0000
Revision:
0:aae68a400cf2
WDT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:aae68a400cf2 1 #include "WDT.h"
JackB 0:aae68a400cf2 2
JackB 0:aae68a400cf2 3 // Load timeout value in watchdog timer and enable
JackB 0:aae68a400cf2 4 void WDT::Configure(float timeout) {
JackB 0:aae68a400cf2 5
JackB 0:aae68a400cf2 6 #ifdef LPC
JackB 0:aae68a400cf2 7 LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
JackB 0:aae68a400cf2 8 uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
JackB 0:aae68a400cf2 9 LPC_WDT->WDTC = (uint32_t)(timeout * (float)clk);
JackB 0:aae68a400cf2 10 LPC_WDT->WDMOD = 0x3; // Enabled and Reset
JackB 0:aae68a400cf2 11 #endif
JackB 0:aae68a400cf2 12 #ifdef ST_NUCLEO
JackB 0:aae68a400cf2 13 // see http://embedded-lab.com/blog/?p=9662
JackB 0:aae68a400cf2 14 #define LsiFreq (45000)
JackB 0:aae68a400cf2 15
JackB 0:aae68a400cf2 16 uint16_t PrescalerCode;
JackB 0:aae68a400cf2 17 uint16_t Prescaler;
JackB 0:aae68a400cf2 18 uint16_t ReloadValue;
JackB 0:aae68a400cf2 19 // float timeout = 10;
JackB 0:aae68a400cf2 20 float Calculated_timeout;
JackB 0:aae68a400cf2 21
JackB 0:aae68a400cf2 22 if ((timeout * (LsiFreq/4)) < 0x7FF) {
JackB 0:aae68a400cf2 23 PrescalerCode = IWDG_PRESCALER_4;
JackB 0:aae68a400cf2 24 Prescaler = 4;
JackB 0:aae68a400cf2 25 }
JackB 0:aae68a400cf2 26 else if ((timeout * (LsiFreq/8)) < 0xFF0) {
JackB 0:aae68a400cf2 27 PrescalerCode = IWDG_PRESCALER_8;
JackB 0:aae68a400cf2 28 Prescaler = 8;
JackB 0:aae68a400cf2 29 }
JackB 0:aae68a400cf2 30 else if ((timeout * (LsiFreq/16)) < 0xFF0) {
JackB 0:aae68a400cf2 31 PrescalerCode = IWDG_PRESCALER_16;
JackB 0:aae68a400cf2 32 Prescaler = 16;
JackB 0:aae68a400cf2 33 }
JackB 0:aae68a400cf2 34 else if ((timeout * (LsiFreq/32)) < 0xFF0) {
JackB 0:aae68a400cf2 35 PrescalerCode = IWDG_PRESCALER_32;
JackB 0:aae68a400cf2 36 Prescaler = 32;
JackB 0:aae68a400cf2 37 }
JackB 0:aae68a400cf2 38 else if ((timeout * (LsiFreq/64)) < 0xFF0) {
JackB 0:aae68a400cf2 39 PrescalerCode = IWDG_PRESCALER_64;
JackB 0:aae68a400cf2 40 Prescaler = 64;
JackB 0:aae68a400cf2 41 }
JackB 0:aae68a400cf2 42 else if ((timeout * (LsiFreq/128)) < 0xFF0) {
JackB 0:aae68a400cf2 43 PrescalerCode = IWDG_PRESCALER_128;
JackB 0:aae68a400cf2 44 Prescaler = 128;
JackB 0:aae68a400cf2 45 }
JackB 0:aae68a400cf2 46 else {
JackB 0:aae68a400cf2 47 PrescalerCode = IWDG_PRESCALER_256;
JackB 0:aae68a400cf2 48 Prescaler = 256;
JackB 0:aae68a400cf2 49 }
JackB 0:aae68a400cf2 50
JackB 0:aae68a400cf2 51 // specifies the IWDG Reload value. This parameter must be a number between 0 and 0x0FFF.
JackB 0:aae68a400cf2 52 ReloadValue = (uint32_t)(timeout * (LsiFreq/Prescaler));
JackB 0:aae68a400cf2 53
JackB 0:aae68a400cf2 54 Calculated_timeout = ((float)(Prescaler * ReloadValue)) / LsiFreq;
JackB 0:aae68a400cf2 55 // printf("WATCHDOG set with prescaler:%d reload value: 0x%X - timeout:%f\n",Prescaler, ReloadValue, Calculated_timeout);
JackB 0:aae68a400cf2 56
JackB 0:aae68a400cf2 57 IWDG->KR = KR_REG_ACCESS_VAL; //Disable write protection of IWDG registers
JackB 0:aae68a400cf2 58 IWDG->PR = PrescalerCode; //Set PR value
JackB 0:aae68a400cf2 59 IWDG->RLR = ReloadValue; //Set RLR value
JackB 0:aae68a400cf2 60 IWDG->KR = KR_KEY_RELOAD_VAL; //Reload IWDG
JackB 0:aae68a400cf2 61 IWDG->KR = KR_KEY_ENABLE_VAL; //Start IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
JackB 0:aae68a400cf2 62 #endif
JackB 0:aae68a400cf2 63
JackB 0:aae68a400cf2 64 Service();
JackB 0:aae68a400cf2 65 }
JackB 0:aae68a400cf2 66
JackB 0:aae68a400cf2 67 // "kick" or "feed" the dog - reset the watchdog timer
JackB 0:aae68a400cf2 68 // by writing this required bit pattern
JackB 0:aae68a400cf2 69 void WDT::Service() {
JackB 0:aae68a400cf2 70 #ifdef LPC
JackB 0:aae68a400cf2 71 LPC_WDT->WDFEED = 0xAA;
JackB 0:aae68a400cf2 72 LPC_WDT->WDFEED = 0x55;
JackB 0:aae68a400cf2 73 #endif
JackB 0:aae68a400cf2 74 #ifdef ST_NUCLEO
JackB 0:aae68a400cf2 75 IWDG->KR = KR_KEY_RELOAD_VAL; //Reload IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
JackB 0:aae68a400cf2 76 #endif
JackB 0:aae68a400cf2 77 }
JackB 0:aae68a400cf2 78
JackB 0:aae68a400cf2 79 // bool WDT::WatchdogCausedReset() {
JackB 0:aae68a400cf2 80 // return wdreset;
JackB 0:aae68a400cf2 81 // }
JackB 0:aae68a400cf2 82
JackB 0:aae68a400cf2 83