stm32_freertos_template/hw/watchdog.c

59 lines
1.2 KiB
C
Executable File

#include "stm32f10x.h"
#include "watchdog.h"
//funkcje
void Watchdog_Initialize()
{
//odblokuj rejestry konfiguracyjne watchdoga
IWDG->KR = IWDG_WriteAccess_Enable;
//ustaw preskaler i wartość auto-reload - timeout 5 sekund
IWDG->PR = 0x04;
IWDG->RLR = 0xC35;
//zablokuj rejestry konfiguracyjne watchdoga
IWDG->KR = IWDG_WriteAccess_Disable;
//włącz watchdoga
IWDG->KR = WATCHDOG_ENABLE;
}
void Watchdog_Feed()
{
IWDG->KR = WATCHDOG_RELOAD;
}
uint8_t Watchdog_ResetSource(void)
{
uint32_t keyword,cntr;
//włacz zegar rejestrów podtrzymujących
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE);
//odblokuj dostęp do rejestrów podtrzymujących
PWR->CR|=PWR_CR_DBP;
//odczytaj zawartość rejestrów
keyword=((BKP->DR1)<<16)+BKP->DR2;
cntr=((BKP->DR3)<<16)+BKP->DR4;
if(keyword==0x5A5A5A5A)
{
//soft reset
cntr++;
BKP->DR3=cntr>>16;
BKP->DR4=cntr&0xFFFF;
return RESET_SOURCE_SOFT;
}
else
{
//hard reset
keyword=0x5A5A5A5A;
cntr=0;
BKP->DR1=keyword>>16;
BKP->DR2=keyword&0xFFFF;
BKP->DR3=cntr>>16;
BKP->DR4=cntr&0xFFFF;
return RESET_SOURCE_HARD;
}
}