You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
57 lines
1.1 KiB
//
|
|
// Created by MightyPork on 2018/02/27.
|
|
//
|
|
|
|
#include "platform.h"
|
|
#include "watchdog.h"
|
|
|
|
static volatile uint16_t suspend_depth = 0;
|
|
static volatile bool restart_pending = false;
|
|
|
|
void wd_init(void)
|
|
{
|
|
dbg("IWDG init, time 2s");
|
|
|
|
LL_IWDG_Enable(IWDG);
|
|
LL_IWDG_EnableWriteAccess(IWDG);
|
|
LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_32); // 0.8 ms
|
|
LL_IWDG_SetReloadCounter(IWDG, 2500); // 2s. max 4095
|
|
while (!LL_IWDG_IsReady(IWDG));
|
|
|
|
// reload
|
|
LL_IWDG_ReloadCounter(IWDG);
|
|
}
|
|
|
|
void wd_suspend(void)
|
|
{
|
|
vPortEnterCritical();
|
|
if (suspend_depth < 0xFFFF) {
|
|
suspend_depth++;
|
|
}
|
|
vPortExitCritical();
|
|
}
|
|
|
|
void wd_resume(void)
|
|
{
|
|
vPortEnterCritical();
|
|
if (suspend_depth > 0) {
|
|
suspend_depth--;
|
|
|
|
if (suspend_depth == 0 && restart_pending) {
|
|
restart_pending = false;
|
|
LL_IWDG_ReloadCounter(IWDG);
|
|
}
|
|
}
|
|
vPortExitCritical();
|
|
}
|
|
|
|
void wd_restart(void)
|
|
{
|
|
vPortEnterCritical();
|
|
if (suspend_depth == 0) {
|
|
LL_IWDG_ReloadCounter(IWDG);
|
|
} else {
|
|
restart_pending = true;
|
|
}
|
|
vPortExitCritical();
|
|
}
|
|
|