59 lines
1.2 KiB
C
Executable File
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;
|
|
}
|
|
|
|
} |