x
Dependents: 20180621_FT813 STM32_180SENSOR_ADC4_RS_Ver2_CommCLD
WDT.cpp@0:aae68a400cf2, 2018-07-23 (annotated)
- Committer:
- JackB
- Date:
- Mon Jul 23 12:24:16 2018 +0000
- Revision:
- 0:aae68a400cf2
WDT
Who changed what in which revision?
User | Revision | Line number | New 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 |