Prusa-Firmware-MMU/src/hal/watchdog.h

63 lines
2.0 KiB
C++

/// @file watchdog.h
#pragma once
#include <stdint.h>
namespace hal {
/// Hardware Abstraction Layer for the CPU's internal watchdog
namespace watchdog {
#if defined(__AVR__)
constexpr uint32_t F_WDT = 128000; //frequency of the watchdog unit in Hz
constexpr uint32_t basePrescaler = 2048; //what prescalerBits==0 actually does.
constexpr uint8_t maxPrescaler = 9; //the maximum value prescalerBits can take
constexpr uint8_t reloadBits = 0; //number of bits in the reload register
#elif defined(__STM32__) //@todo to be changed to the final form
constexpr uint32_t F_WDT = 32000; //frequency of the watchdog unit in Hz
constexpr uint32_t basePrescaler = 4; //what prescalerBits==0 actually does.
constexpr uint8_t maxPrescaler = 6; //the maximum value prescalerBits can take
constexpr uint8_t reloadBits = 12; //number of bits in the reload register
#endif
struct configuration {
uint8_t prescalerBits;
uint16_t reload;
public:
static constexpr configuration compute(uint16_t timeout) {
// uint8_t prescalerBits = 0;
// uint32_t ticks = timeout * F_WDT / (basePrescaler * (1 << prescalerBits));
// while ((ticks >= (1 << reloadBits)) && (prescalerBits < maxPrescaler)) {
// prescalerBits++;
// ticks >>= 1;
// }
// if ((prescalerBits == 0) && (ticks == 0))
// ticks = 1; //1 tick is minimum
// configuration config = { prescalerBits, static_cast<uint16_t>(ticks - 1) };
// return config;
uint8_t prescalerBits = 0;
uint32_t ticks = 1;
switch (timeout) {
case 250:
prescalerBits = 4;
break;
case 8000:
prescalerBits = 9;
break;
}
configuration config = { prescalerBits, static_cast<uint16_t>(ticks - 1) };
return config;
}
};
/// watchdog interface
void Enable(const configuration &config);
void Disable();
void Reset();
} // namespace watchdog
} // namespace hal
namespace hwd = hal::watchdog;