¿Î³Ì½áҵʵÑ鱨¸æ
¿Î³ÌÃû³Æ£º ǶÈëʽϵͳÉè¼Æ
±¨¸æÌâÄ¿£º רҵ°à¼¶£º
ѧÉúÐÕÃû£ºÖ¸µ¼½Ìʦ£º »ùÓÚARMµÄ¿´ÃŹ·³ÌÐòÉè¼Æ
ͨÐÅ1601°à ѧºÅ£º
2017 Äê 6 ÔÂ 20 ÈÕ
¿´ÃŹ·ÊµÑé
1 ʵÑéÄ¿µÄ
(1) Á˽âWATCHDOGµÄ×÷Óã»
(2) ÕÆÎÕWATCHDOG¶¨Ê±Æ÷µÄʹÓ÷½·¨¡£
2 ʵÑéÄÚÈÝ
(1) ±à³ÌÌí¼Ó¿´ÃŹ·¹¦ÄÜ£¬¹Û²ì¿´ÃŹ·×÷Óã» (2) ±à³ÌʵÏÖ¿´ÃŹ·Î¹¹·¡£
3 ʵÑé»ù´¡ÖªÊ¶
(1) ¿´ÃŹ·¹¦ÄÜ£ºÇ¶ÈëʽϵͳÔËÐÐʱÊÜÍⲿ¸ÉÈÅ»òϵͳ´íÎ󣬳ÌÐòÓÐʱ»á³öÏÖ¡°ÅÜ·É¡±£¬µ¼ÖÂÕû¸öϵͳ̱»¾¡£Îª·ÀÖ¹ÕâÒ»ÏÖÏóµÄ·¢Éú£¬ÔÚ¶ÔϵͳÎȶ¨ÐÔÒªÇó½Ï¸ßµÄ³¡ºÏÍùÍùÒª¼ÓÈë¿´ÃŹ·µç·£¨WATCHDOG£©¡£¿´ÃŹ·µÄ×÷ÓÃÊǵ±ÏµÍ³Åܷɶø½øÈëËÀÑ»·Ê±£¬»Ö¸´ÏµÍ³µÄÔËÐС£
(2) ¿´ÃŹ·¹¤×÷ÔÀí£ºÉ豾ϵͳ³ÌÐòÍêÕûÔËתһÖܵÄʱ¼äÊÇTp£¬¿´ÃŹ·¶¨ÊÇÖÜÆÚÊÇTi£¬Ti>Tp, ÔÚ³ÌÐòÔËÐÐÒ»Öܺó¾ÍÐ޸Ķ¨Ê±Æ÷µÄ¼ÆÊýÖµ£¬Ö»Òª³ÌÐòÕý³£ÔËÐУ¬¶¨Ê±Æ÷¾Í²»»áÒç³ö£¬ÈôÓÉÓÚ¸ÉÈŵÈÔÒòÊÇϵͳ²»ÄÜÔÚTpʱ¿ÌÐ޸Ķ¨Ê±Æ÷µÄÊýÖµ£¬¶¨Ê±Æ÷½«ÔÚTi ʱ¿ÌÒç³ö£¬Òý·¢ÏµÍ³¸´Î»£¬Ê¹ÏµÍ³µÃÒÔÖØÐÂÔËÐУ¬´Ó¶øÆðµ½¼à¿ØµÄ×÷ÓÃ
ÔÚÒ»¸öÍêÕûµÄǶÈëʽϵͳÖлòµ¥Æ¬»úСϵͳÖÐͨ³£¶¼Óп´ÃŹ·¶¨Ê±Æ÷£¬ÇÒÒ»°ã¼¯³ÉÔÚ´¦ÀíÆ÷оƬÖУ¬¿´ÃŹ·Êµ¼ÊÉϾÍÊÇÒ»¸ö¶¨Ê±Æ÷£¬ÖªÊ¶ËüÔÚÆÚÂúºó½«×Ô¶¯ÒýÆðϵͳ¸´Î»¡£ £¨3£© ¿´ÃŹ·¶¨Ê±Æ÷¼ÆÊýÖµ£º
ÊäÈëµ½¼ÆÊýÆ÷µÄʱÖÓÖÜÆÚ t_watchdog =1/(PCLK/Prescaler value + 1)/ Division_factor) ¿´ÃŹ·µÄ¶¨Ê±ÖÜÆÚ T = WTCNT * t_watchdog £¨4£©¿´ÃŹ·¶¨Ê±Æ÷¼Ä´æÆ÷ ¿ØÖƼĴæÆ÷£¨WTCON£©
Êý¾Ý¼Ä´æÆ÷£¨WTDAT£© ¼ÆÊýÆ÷¼Ä´æÆ÷£¨WTCNT£©
4 ʵÑé²½Öè
1
(1) н¨Ò»¸ö¹¤³Ìwatchdog£¬Ìí¼ÓÏàÓ¦µÄÎļþ£¬²¢ÐÞ¸ÄwatchdogµÄ¹¤³ÌÉèÖã»´´½¨watchdog.c²¢¼ÓÈëµ½¹¤³ÌwatchdogÖУ¬²¿·Ö²Î¿¼´úÂëÈçÏ£º
/* functions */
void rtc_tick_isr(void) __attribute__ ((interrupt(\void rtc_int_isr(void) __attribute__ ((interrupt(\//ÉèÖüĴæÆ÷²ÎÊý #define WDT_ENABLE
(0x01<<5)
(0x01<<2) (0x01<<0)
/* 1/128 */
/* 49
#define WDT_INT_ENABLE #define WDT_RST_ENABLE #define WDT_CLK_SEL
(0X3 <<3)
#define WDT_PRE_SCALER void watchdog_init() {
rWTCNT = 8448 * 2;
((PCLK/1000000-1) <<8)
/* ÉèÖÿ´ÃŹ·³õʼֵ */
rWTCON = WDT_ENABLE | WDT_RST_ENABLE | WDT_CLK_SEL | WDT_PRE_SCALER;
/* ´ò¿ª¿´ÃŹ· */ }
void rtc_set_date(st_date* p_date) {
rRTCCON = 0x01;
rBCDYEAR = p_date->year; rBCDMON = p_date->mon; rBCDDAY = p_date->day; rBCDDATE = p_date->week_day; rBCDHOUR = p_date->hour; rBCDMIN = p_date->min; rBCDSEC = p_date->sec; rRTCCON = 0x00; }
void rtc_get_date(st_date* p_date)
2