日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM 看门狗定时器

發(fā)布時間:2024/1/1 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM 看门狗定时器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是看門狗、有什么用

(1) 看門狗定時器和普通的定時器并無本質(zhì)區(qū)別。定時器可以設(shè)定一個時間,在這個時間完成之前定時器不斷計(jì)時,時間到的時候,定時器會復(fù)位 CPU(重啟系統(tǒng))。
(2 )系統(tǒng)正常工作的時候當(dāng)然不希望被重啟,但是系統(tǒng)受到干擾、極端環(huán)境等可能會產(chǎn)生異常工作或者不工作,這種狀態(tài)可能會造成不良影響(至少是不工作),此時解決方案就是重啟系統(tǒng)。
(3) 普通設(shè)備重啟不是問題,但是有些設(shè)備人工重啟存在困難。這時候我們希望系統(tǒng)能夠自己檢驗(yàn)自己是否已經(jīng)跑飛,并且在意識到自己跑飛的時候,可以很快的(幾個ms或者更短)自我重啟。這個功能就要靠看門狗定時器來實(shí)現(xiàn)。
(4) 典型應(yīng)用的情景是:我們在應(yīng)用程序中打開看門狗設(shè)備,初始化好給它一個時間,然后應(yīng)用程序使用一個線程來喂狗,這個線程的執(zhí)行時間安全短于看門狗的復(fù)位時間。當(dāng)系統(tǒng)(或者應(yīng)用程序)異常后,喂狗線程自然就不工作了,然后到時候看門狗就會復(fù)位。
(5) 補(bǔ)充:實(shí)戰(zhàn)中有時候?yàn)榱私^對的可靠,我們并不會用 SoC 中自帶的看門狗,而是使用專門的外置的看門狗芯片來實(shí)現(xiàn)看門狗。


二、S5PV210 看門狗定時器的結(jié)構(gòu)框圖

看門狗定時器使用的時鐘域及其頻率。


(1) PCLK_PSYS 經(jīng)過兩級分頻后生成 WDT(watchdog timer)的時鐘周期,然后把要定的時間寫到 WTDAT 寄存器中,刷到 WTCNT 寄存器中去減 1,減到 0 時(定時時間到)產(chǎn)生復(fù)位信號或中斷信號。


(2) 典型應(yīng)用中是配置為產(chǎn)生復(fù)位信號,我們應(yīng)該在 WTCNT 寄存器減到 0 之前給 WTDAT 寄存器中重新寫值以喂狗。
(3) 注意,看門狗定時器的計(jì)數(shù)值無法自動裝載。在第一次使能看門狗之前,需要手動裝載看門狗定時器的計(jì)數(shù)值。


三、看門狗定時器的主要寄存器

1、WTCON


2、WTDAT


3、WTCNT


4、WTCLRINT


四、看門狗定時器的編程實(shí)踐

1、產(chǎn)生中斷信號

文件名:wdt.c

#include "stdio.h" #include "init.h"#define WTCON (0xE2700000) #define WTDAT (0xE2700004) #define WTCNT (0xE2700008) #define WTCLRINT (0xE270000C)#define rWTCON (*(volatile unsigned int *)WTCON) #define rWTDAT (*(volatile unsigned int *)WTDAT) #define rWTCNT (*(volatile unsigned int *)WTCNT) #define rWTCLRINT (*(volatile unsigned int *)WTCLRINT)unsigned int pow(unsigned int base, unsigned int exponent) {if (base == 2){return (0x1 << exponent);}else{unsigned int sum = 1, temp = 0;for (temp = 0; temp < exponent; temp++){sum *= base;}return sum;} }/*************************************************************************/#define BIT_LOCATION_WTCON_PRESCALER_VALUE (0xff << 8) #define BIT_WTCON_PRESCALER (pow(2,8))#define WTCON_FUNC_WDT_TIMER_ENABLE (0x1 << 5) #define WTCON_FUNC_WDT_TIMER_DISABLE (0x0 << 5)#define BIT_LOCATION_WTCON_CLOCK_SELECT (0b11 << 3) #define WTCON_FUNC_CLOCK_SELECT_16 (0b00 << 3) #define WTCON_FUNC_CLOCK_SELECT_32 (0b01 << 3) #define WTCON_FUNC_CLOCK_SELECT_64 (0b10 << 3) #define WTCON_FUNC_CLOCK_SELECT_128 (0b11 << 3)#define WTCON_FUNC_INTERRUPT_GENERATION_ENABLE (0x1 << 2) #define WTCON_FUNC_INTERRUPT_GENERATION_DISABLE (0x0 << 2)#define BIT_LOCATION_WTCON_RESET (0b1 << 0) #define WTCON_FUNC_RESET_ENABLE (0x1 << 0) #define WTCON_FUNC_RESET_DISABLE (0x0 << 0)//初始化 WDT 使之可以產(chǎn)生中斷 void wdt_init_interrupt(void) {//第一步,設(shè)置好預(yù)分頻器和分頻器,得到時鐘周期是 128 usrWTCON &= ~(BIT_LOCATION_WTCON_PRESCALER_VALUE);//t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )rWTCON |= (65 * BIT_WTCON_PRESCALER); // 1MHZrWTCON &= ~(BIT_LOCATION_WTCON_CLOCK_SELECT);rWTCON |= (WTCON_FUNC_CLOCK_SELECT_128); // 1/128 MHZ, T = 128us//第二步,設(shè)置中斷和復(fù)位信號的使能或禁止rWTCON |= (WTCON_FUNC_INTERRUPT_GENERATION_ENABLE); // enable wdt interruptrWTCON &= ~(BIT_LOCATION_WTCON_RESET); rWTCON |= (WTCON_FUNC_RESET_DISABLE); //disable wdt reset//第三步,設(shè)置定時時間//WDT 定時計(jì)數(shù)個數(shù),最終定時時間為這里的值 x 時鐘周期rWTDAT = 10000; //定時 1.28srWTCNT = 10000; //定時 1.28s//第四步,先把所有寄存器都設(shè)置好之后,再去打開看門狗rWTCON |= (WTCON_FUNC_WDT_TIMER_ENABLE); //enable wdt }//wdt 的中斷處理程序 void isr_wdt(void) {static int i = 0;//看門狗定時器時間到了,應(yīng)該做的有意義的事情printf("wdt interrupt, i = %d...\r\n", i++);//清除中斷intc_clearVectaddr();rWTCLRINT = 1; }

現(xiàn)象截圖:可以看到,wdt 中斷的時間確實(shí)是 1.28s左右發(fā)生一次。


2、產(chǎn)生復(fù)位信號

#include "stdio.h" #include "init.h"#define WTCON (0xE2700000) #define WTDAT (0xE2700004) #define WTCNT (0xE2700008) #define WTCLRINT (0xE270000C)#define rWTCON (*(volatile unsigned int *)WTCON) #define rWTDAT (*(volatile unsigned int *)WTDAT) #define rWTCNT (*(volatile unsigned int *)WTCNT) #define rWTCLRINT (*(volatile unsigned int *)WTCLRINT)unsigned int pow(unsigned int base, unsigned int exponent) {if (base == 2){return (0x1 << exponent);}else{unsigned int sum = 1, temp = 0;for (temp = 0; temp < exponent; temp++){sum *= base;}return sum;} }/*************************************************************************/#define BIT_LOCATION_WTCON_PRESCALER_VALUE (0xff << 8) #define BIT_WTCON_PRESCALER (pow(2,8))#define WTCON_FUNC_WDT_TIMER_ENABLE (0x1 << 5) #define WTCON_FUNC_WDT_TIMER_DISABLE (0x0 << 5)#define BIT_LOCATION_WTCON_CLOCK_SELECT (0b11 << 3) #define WTCON_FUNC_CLOCK_SELECT_16 (0b00 << 3) #define WTCON_FUNC_CLOCK_SELECT_32 (0b01 << 3) #define WTCON_FUNC_CLOCK_SELECT_64 (0b10 << 3) #define WTCON_FUNC_CLOCK_SELECT_128 (0b11 << 3)#define BIT_LOCATION_WTCON_INTERRUPT (0b1 << 2) #define WTCON_FUNC_INTERRUPT_GENERATION_ENABLE (0x1 << 2) #define WTCON_FUNC_INTERRUPT_GENERATION_DISABLE (0x0 << 2)#define BIT_LOCATION_WTCON_RESET (0b1 << 0) #define WTCON_FUNC_RESET_ENABLE (0x1 << 0) #define WTCON_FUNC_RESET_DISABLE (0x0 << 0)//初始化 WDT 使之可以產(chǎn)生中斷 void wdt_init_interrupt(void) {//第一步,設(shè)置好預(yù)分頻器和分頻器,得到時鐘周期是 128 usrWTCON &= ~(BIT_LOCATION_WTCON_PRESCALER_VALUE);//t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )rWTCON |= (65 * BIT_WTCON_PRESCALER); // 1MHZrWTCON &= ~(BIT_LOCATION_WTCON_CLOCK_SELECT);rWTCON |= (WTCON_FUNC_CLOCK_SELECT_128); // 1/128 MHZ, T = 128us//第二步,設(shè)置中斷和復(fù)位信號的使能或禁止rWTCON &= ~(BIT_LOCATION_WTCON_INTERRUPT); rWTCON |= (WTCON_FUNC_INTERRUPT_GENERATION_DISABLE); // disable wdt interruptrWTCON &= ~(BIT_LOCATION_WTCON_RESET); rWTCON |= (WTCON_FUNC_RESET_ENABLE); //enable wdt reset//第三步,設(shè)置定時時間//WDT 定時計(jì)數(shù)個數(shù),最終定時時間為這里的值 x 時鐘周期rWTDAT = 10000; //定時 1.28srWTCNT = 10000; //定時 1.28s//第四步,先把所有寄存器都設(shè)置好之后,再去打開看門狗rWTCON |= (WTCON_FUNC_WDT_TIMER_ENABLE); //enable wdt }//wdt 的中斷處理程序 void isr_wdt(void) {static int i = 0;//看門狗定時器時間到了,應(yīng)該做的有意義的事情printf("wdt interrupt, i = %d...\r\n", i++);//清除中斷intc_clearVectaddr();rWTCLRINT = 1; }

現(xiàn)象截圖:可以看到,定時1s之后,芯片就復(fù)位了,不會再打印信息。


源自朱友鵬老師.

總結(jié)

以上是生活随笔為你收集整理的ARM 看门狗定时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。