Fix configuration compute() math
parent
0e9802c4cd
commit
89a2bdc7e4
|
|
@ -14,7 +14,7 @@ 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 = 7; //the maximum value prescalerBits can take
|
||||
constexpr uint8_t maxPrescaler = 6; //the maximum value prescalerBits can take
|
||||
constexpr uint8_t reloadBits = 12; //number of bits in the reload register
|
||||
#endif
|
||||
|
||||
|
|
@ -24,16 +24,15 @@ struct configuration {
|
|||
|
||||
public:
|
||||
static constexpr configuration compute(float timeout) {
|
||||
constexpr float tickPeriod = 1 / (float)F_WDT;
|
||||
uint8_t prescalerBits = 0;
|
||||
uint16_t reload = 0;
|
||||
while (tickPeriod * (basePrescaler << prescalerBits) < timeout) {
|
||||
uint32_t ticks = timeout * F_WDT / (basePrescaler * (1 << prescalerBits));
|
||||
while ((ticks >= (1 << reloadBits)) && (prescalerBits < maxPrescaler)) {
|
||||
prescalerBits++;
|
||||
ticks = timeout * F_WDT / (basePrescaler * (1 << prescalerBits));
|
||||
}
|
||||
if (timeout)
|
||||
reload = static_cast<uint16_t>(((timeout * (1 << reloadBits)) / (tickPeriod * (basePrescaler << prescalerBits)))) - 1;
|
||||
|
||||
configuration config = { prescalerBits, reload };
|
||||
if ((prescalerBits == 0) && (ticks == 0))
|
||||
ticks = 1; //1 tick is minimum
|
||||
configuration config = { prescalerBits, static_cast<uint16_t>(ticks - 1) };
|
||||
return config;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue