added watchdog
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "debug_uart.h"
|
||||
#include "irq_dispatcher.h"
|
||||
#include "timebase.h"
|
||||
#include "watchdog.h"
|
||||
|
||||
void plat_init(void)
|
||||
{
|
||||
@@ -39,4 +40,6 @@ void plat_init(void)
|
||||
settings_load(); // XXX maybe this should be moved to the main task
|
||||
|
||||
comm_init();
|
||||
|
||||
wd_init();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// 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();
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
//
|
||||
// Created by MightyPork on 2018/02/27.
|
||||
//
|
||||
|
||||
#ifndef GEX_F072_WATCHDOG_H
|
||||
#define GEX_F072_WATCHDOG_H
|
||||
|
||||
/**
|
||||
* Initialize the application watchdog
|
||||
*/
|
||||
void wd_init(void);
|
||||
|
||||
/**
|
||||
* Suspend watchdog restarts until resumed
|
||||
* (used in other tasks to prevent the main task clearing the wd if the other task is locked up)
|
||||
*
|
||||
* The suspend/resume calls can be stacked.
|
||||
*/
|
||||
void wd_suspend(void);
|
||||
|
||||
/**
|
||||
* Resume restarts
|
||||
*/
|
||||
void wd_resume(void);
|
||||
|
||||
/**
|
||||
* Restart the wd. If restarts are suspended, postpone the restart until resumed
|
||||
* and then restart immediately.
|
||||
*/
|
||||
void wd_restart(void);
|
||||
|
||||
#endif //GEX_F072_WATCHDOG_H
|
||||
Reference in New Issue
Block a user