new

Dependencies:   mbed CANMsg

Committer:
nerit
Date:
Wed Jun 27 15:33:42 2018 +0000
Revision:
4:d32258ec411f
Parent:
0:1e09cd7d66b4
Modifiche parametri dopo prova in campo del quinconce

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nerit 0:1e09cd7d66b4 1 /// @file Watchdog.cpp provides the interface to the Watchdog module
nerit 0:1e09cd7d66b4 2 ///
nerit 0:1e09cd7d66b4 3 /// This provides basic Watchdog service for the mbed. You can configure
nerit 0:1e09cd7d66b4 4 /// various timeout intervals that meet your system needs. Additionally,
nerit 0:1e09cd7d66b4 5 /// it is possible to identify if the Watchdog was the cause of any
nerit 0:1e09cd7d66b4 6 /// system restart.
nerit 0:1e09cd7d66b4 7 ///
nerit 0:1e09cd7d66b4 8 /// Adapted from Simon's Watchdog code from http://mbed.org/forum/mbed/topic/508/
nerit 0:1e09cd7d66b4 9 ///
nerit 0:1e09cd7d66b4 10 /// @note Copyright © 2011 by Smartware Computing, all rights reserved.
nerit 0:1e09cd7d66b4 11 /// This software may be used to derive new software, as long as
nerit 0:1e09cd7d66b4 12 /// this copyright statement remains in the source file.
nerit 0:1e09cd7d66b4 13 /// @author David Smart
nerit 0:1e09cd7d66b4 14 ///
nerit 0:1e09cd7d66b4 15 /// @note Copyright © 2015 by NBRemond, all rights reserved.
nerit 0:1e09cd7d66b4 16 /// This software may be used to derive new software, as long as
nerit 0:1e09cd7d66b4 17 /// this copyright statement remains in the source file.
nerit 0:1e09cd7d66b4 18 ///
nerit 0:1e09cd7d66b4 19 /// Added support for STM32 Nucleo platforms
nerit 0:1e09cd7d66b4 20 ///
nerit 0:1e09cd7d66b4 21 /// @author Bernaérd Remond
nerit 0:1e09cd7d66b4 22 ///
nerit 0:1e09cd7d66b4 23
nerit 0:1e09cd7d66b4 24 //#define LPC
nerit 0:1e09cd7d66b4 25 #define ST_NUCLEO
nerit 0:1e09cd7d66b4 26
nerit 0:1e09cd7d66b4 27
nerit 0:1e09cd7d66b4 28 #include "mbed.h"
nerit 0:1e09cd7d66b4 29 #include "watchdog.h"
nerit 0:1e09cd7d66b4 30
nerit 0:1e09cd7d66b4 31
nerit 0:1e09cd7d66b4 32 /// Watchdog gets instantiated at the module level
nerit 0:1e09cd7d66b4 33 Watchdog::Watchdog() {
nerit 0:1e09cd7d66b4 34 #ifdef LPC
nerit 0:1e09cd7d66b4 35 wdreset = (LPC_WDT->WDMOD >> 2) & 1; // capture the cause of the previous reset
nerit 0:1e09cd7d66b4 36 #endif
nerit 0:1e09cd7d66b4 37 #ifdef ST_NUCLEO
nerit 0:1e09cd7d66b4 38 // capture the cause of the previous reset
nerit 0:1e09cd7d66b4 39 /* Check if the system has resumed from IWDG reset */
nerit 0:1e09cd7d66b4 40 /*
nerit 0:1e09cd7d66b4 41 if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) {
nerit 0:1e09cd7d66b4 42 wdreset = true;
nerit 0:1e09cd7d66b4 43 }
nerit 0:1e09cd7d66b4 44 else {
nerit 0:1e09cd7d66b4 45 wdreset = false;
nerit 0:1e09cd7d66b4 46 }
nerit 0:1e09cd7d66b4 47 */
nerit 0:1e09cd7d66b4 48 wdreset = false;
nerit 0:1e09cd7d66b4 49 #endif
nerit 0:1e09cd7d66b4 50
nerit 0:1e09cd7d66b4 51 }
nerit 0:1e09cd7d66b4 52
nerit 0:1e09cd7d66b4 53 /// Load timeout value in watchdog timer and enable
nerit 0:1e09cd7d66b4 54 void Watchdog::Configure(float timeout) {
nerit 0:1e09cd7d66b4 55 #ifdef LPC
nerit 0:1e09cd7d66b4 56 LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
nerit 0:1e09cd7d66b4 57 uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
nerit 0:1e09cd7d66b4 58 LPC_WDT->WDTC = (uint32_t)(timeout * (float)clk);
nerit 0:1e09cd7d66b4 59 LPC_WDT->WDMOD = 0x3; // Enabled and Reset
nerit 0:1e09cd7d66b4 60 #endif
nerit 0:1e09cd7d66b4 61 #ifdef ST_NUCLEO
nerit 0:1e09cd7d66b4 62 // see http://embedded-lab.com/blog/?p=9662
nerit 0:1e09cd7d66b4 63 #define LsiFreq (45000)
nerit 0:1e09cd7d66b4 64
nerit 0:1e09cd7d66b4 65 uint16_t PrescalerCode;
nerit 0:1e09cd7d66b4 66 uint16_t Prescaler;
nerit 0:1e09cd7d66b4 67 uint16_t ReloadValue;
nerit 0:1e09cd7d66b4 68 float Calculated_timeout;
nerit 0:1e09cd7d66b4 69
nerit 0:1e09cd7d66b4 70 if ((timeout * (LsiFreq/4)) < 0x7FF) {
nerit 0:1e09cd7d66b4 71 PrescalerCode = IWDG_PRESCALER_4;
nerit 0:1e09cd7d66b4 72 Prescaler = 4;
nerit 0:1e09cd7d66b4 73 }
nerit 0:1e09cd7d66b4 74 else if ((timeout * (LsiFreq/8)) < 0xFF0) {
nerit 0:1e09cd7d66b4 75 PrescalerCode = IWDG_PRESCALER_8;
nerit 0:1e09cd7d66b4 76 Prescaler = 8;
nerit 0:1e09cd7d66b4 77 }
nerit 0:1e09cd7d66b4 78 else if ((timeout * (LsiFreq/16)) < 0xFF0) {
nerit 0:1e09cd7d66b4 79 PrescalerCode = IWDG_PRESCALER_16;
nerit 0:1e09cd7d66b4 80 Prescaler = 16;
nerit 0:1e09cd7d66b4 81 }
nerit 0:1e09cd7d66b4 82 else if ((timeout * (LsiFreq/32)) < 0xFF0) {
nerit 0:1e09cd7d66b4 83 PrescalerCode = IWDG_PRESCALER_32;
nerit 0:1e09cd7d66b4 84 Prescaler = 32;
nerit 0:1e09cd7d66b4 85 }
nerit 0:1e09cd7d66b4 86 else if ((timeout * (LsiFreq/64)) < 0xFF0) {
nerit 0:1e09cd7d66b4 87 PrescalerCode = IWDG_PRESCALER_64;
nerit 0:1e09cd7d66b4 88 Prescaler = 64;
nerit 0:1e09cd7d66b4 89 }
nerit 0:1e09cd7d66b4 90 else if ((timeout * (LsiFreq/128)) < 0xFF0) {
nerit 0:1e09cd7d66b4 91 PrescalerCode = IWDG_PRESCALER_128;
nerit 0:1e09cd7d66b4 92 Prescaler = 128;
nerit 0:1e09cd7d66b4 93 }
nerit 0:1e09cd7d66b4 94 else {
nerit 0:1e09cd7d66b4 95 PrescalerCode = IWDG_PRESCALER_256;
nerit 0:1e09cd7d66b4 96 Prescaler = 256;
nerit 0:1e09cd7d66b4 97 }
nerit 0:1e09cd7d66b4 98
nerit 0:1e09cd7d66b4 99 // specifies the IWDG Reload value. This parameter must be a number between 0 and 0x0FFF.
nerit 0:1e09cd7d66b4 100 ReloadValue = (uint32_t)(timeout * (LsiFreq/Prescaler));
nerit 0:1e09cd7d66b4 101
nerit 0:1e09cd7d66b4 102 Calculated_timeout = ((float)(Prescaler * ReloadValue)) / LsiFreq;
nerit 4:d32258ec411f 103 //printf("WATCHDOG set with prescaler:%d reload value: 0x%X - timeout:%f\n",Prescaler, ReloadValue, Calculated_timeout);
nerit 0:1e09cd7d66b4 104
nerit 0:1e09cd7d66b4 105 IWDG->KR = 0x5555; //Disable write protection of IWDG registers
nerit 0:1e09cd7d66b4 106 IWDG->PR = PrescalerCode; //Set PR value
nerit 0:1e09cd7d66b4 107 IWDG->RLR = ReloadValue; //Set RLR value
nerit 0:1e09cd7d66b4 108 IWDG->KR = 0xAAAA; //Reload IWDG
nerit 0:1e09cd7d66b4 109 IWDG->KR = 0xCCCC; //Start IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
nerit 0:1e09cd7d66b4 110 #endif
nerit 0:1e09cd7d66b4 111
nerit 0:1e09cd7d66b4 112 Service();
nerit 0:1e09cd7d66b4 113 }
nerit 0:1e09cd7d66b4 114
nerit 0:1e09cd7d66b4 115 /// "Service", "kick" or "feed" the dog - reset the watchdog timer
nerit 0:1e09cd7d66b4 116 /// by writing this required bit pattern
nerit 0:1e09cd7d66b4 117 void Watchdog::Service() {
nerit 0:1e09cd7d66b4 118 #ifdef LPC
nerit 0:1e09cd7d66b4 119 LPC_WDT->WDFEED = 0xAA;
nerit 0:1e09cd7d66b4 120 LPC_WDT->WDFEED = 0x55;
nerit 0:1e09cd7d66b4 121 #endif
nerit 0:1e09cd7d66b4 122 #ifdef ST_NUCLEO
nerit 0:1e09cd7d66b4 123 IWDG->KR = 0xAAAA; //Reload IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
nerit 0:1e09cd7d66b4 124 #endif
nerit 0:1e09cd7d66b4 125 }
nerit 0:1e09cd7d66b4 126
nerit 0:1e09cd7d66b4 127 /// get the flag to indicate if the watchdog causes the reset
nerit 0:1e09cd7d66b4 128 bool Watchdog::WatchdogCausedReset() {
nerit 0:1e09cd7d66b4 129 return wdreset;
nerit 0:1e09cd7d66b4 130 }
nerit 0:1e09cd7d66b4 131