tom dunigan
/
k64f_wdog
k64f watchdog example
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 // k64 wdog using 1khz LPO (10% accuracy) 00002 #include "mbed.h" 00003 00004 #define PRREG(z) printf(#z" 0x%x\n",z) 00005 Timer tmr; 00006 00007 void wdog_init(uint32_t ms) { 00008 __disable_irq(); 00009 WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xC520); /* Key 1 */ 00010 WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xD928); /* Key 2 */ 00011 __NOP(); 00012 __NOP(); 00013 00014 WDOG_TOVALL = (uint16_t)(ms & 0xffff); // sets the time-out value 00015 WDOG_TOVALH = (uint16_t)((ms>>16) & 0xffff); 00016 WDOG_STCTRLH = (WDOG_STCTRLH_ALLOWUPDATE_MASK | WDOG_STCTRLH_WDOGEN_MASK | WDOG_STCTRLH_WAITEN_MASK | WDOG_STCTRLH_STOPEN_MASK); // Enable WDG 00017 WDOG_PRESC = 0; // prescaler 00018 __enable_irq(); 00019 } 00020 00021 void wdog_disable() { 00022 __disable_irq(); 00023 WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xC520); /* Key 1 */ 00024 WDOG->UNLOCK = WDOG_UNLOCK_WDOGUNLOCK(0xD928); /* Key 2 */ 00025 __NOP(); 00026 __NOP(); 00027 WDOG_STCTRLH = WDOG_STCTRLH_ALLOWUPDATE_MASK; 00028 __enable_irq(); 00029 } 00030 00031 void wdog_kick() { 00032 __disable_irq(); 00033 WDOG_REFRESH = 0xA602; 00034 WDOG_REFRESH = 0xB480; 00035 __enable_irq(); 00036 } 00037 00038 int main() { 00039 int i,fbus,flashbus; 00040 fbus = SystemCoreClock / (((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV2_MASK) >> SIM_CLKDIV1_OUTDIV2_SHIFT) + 1); 00041 flashbus = SystemCoreClock / (((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK) >> SIM_CLKDIV1_OUTDIV4_SHIFT) + 1); 00042 printf("\nSystemCoreClock %d fbus %d flash %d %s %s\n",SystemCoreClock,fbus,flashbus,__TIME__,__DATE__); 00043 PRREG(RCM_SRS0); // reset reason 00044 PRREG(RCM_SRS1); 00045 PRREG(WDOG->STCTRLH); 00046 PRREG(WDOG->PRESC); 00047 PRREG(WDOG->TOVALL); 00048 PRREG(WDOG->TOVALH); 00049 PRREG(WDOG->RSTCNT); 00050 wdog_init(4000); // 4 sec timeout 00051 PRREG(WDOG->STCTRLH); 00052 PRREG(WDOG->PRESC); 00053 PRREG(WDOG->TOVALL); 00054 PRREG(WDOG->TOVALH); 00055 00056 wait_ms(100); 00057 wdog_kick(); 00058 for (i=1;i<=5; i++) { 00059 printf("running %d\n",i); 00060 wait(1.0); 00061 wdog_kick(); 00062 } 00063 printf("long wait reset\n"); 00064 wait(5.0); 00065 printf("never happen\n"); 00066 }
Generated on Sun Jul 17 2022 09:03:41 by 1.7.2