k64f watchdog example

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }