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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 硬知識
    • 看門狗定時計數器 (WDTCNT)
    • 看門狗模式
    • 定時計數模式
    • 看門狗定時器中斷
    • 時鐘故障保護功能
    • 低功耗模式下的看門狗操作
    • 看門狗定時器控制寄存器
  • WDT_A API (機翻)
    • 參數
  • 上機實戰
    • 定時計數模式
      • 配置
      • 中斷服務函數
      • 整體代碼
      • 實驗結果
    • 看門狗模式
      • 配置
      • 整體代碼

平臺:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)


硬知識

???????在工業控制現場,往往會由于供電電源、空間電磁干擾或其他的原因引起強烈的干擾噪聲。這些干擾作用于數字器件,極易使其產生誤動作,引起單片機程序跑飛,若不進行有效的處理,程序就不能回到正常的運行狀態。為了保證系統的正常工作,一方面要盡量減少干擾源對系統的影響;另一方面,在系統受到影響之后要能盡快地恢復,看門狗就起到了這個作用。看門狗的用法:在正常工作期間,一次看門狗定時時間將產生一次系統復位。如果通過編程使看門狗定時時間稍大于程序中主循環執行一遍所用的時間,并且程序執行過程中都有對看門狗定時器清零的指令,使計數值重新計數,程序正常運行時,就會在看門狗定時時間到達之前對看門狗清零,不會產生看門狗溢出。如果由于干擾使程序跑飛,則不會在看門狗定時時間到達之前執行看門狗清零指令,看門狗就會產生溢出,從而產生系統復位,使CPU重新運行用戶程序,這樣程序就又可以恢復正常運行。
???????看門狗定時器具有如下特點:
? 軟件可編程的8種時間間隔選擇;
? 看門狗模式;
? 定時計數模式;
? 對看門狗控制寄存器更改受口令的保護,若口令輸入錯誤,則控制寄存器無法更改;
? 多種時鐘源供選擇;
? 可選擇關閉看門狗以減少功耗;
? 時鐘故障保護功能。
???????MSP430單片機的看門狗定時器邏輯結構框圖如圖所示。由該圖可知,MSP430單片機看門狗定時器由中斷產生邏輯單元、看門狗定時計數器、口令比較單元、看門狗控制寄存器、參考時鐘選擇邏輯單元等構成。

看門狗定時計數器 (WDTCNT)

???????看門狗定時計數器是一個32位增計數器,不能通過軟件程序直接訪問其計數值。軟件可通過看門狗控制寄存器(WDTCTL)控制看門狗定時計數器及配置其產生的時間間隔。看門狗定時計數器的參考時鐘源可通過WDTSSEL控制位配置為SMCLK、ACLK、VLOCLK或X_CLK,產生的時間間隔可通過WDTIS控制位選擇,具體請參考相應寄存器配置。

看門狗模式

???????在一個上電復位清除(PUC)后,看門狗定時器被默認配置為采用SMCLK作為參考時鐘源,復位時間間隔約為32ms并工作在看門狗模式。用戶必須在看門狗復位時間間隔期滿或另一個復位信號產生之前,配置、停止或清除看門狗定時器。當看門狗定時器被配置工作在看門狗模式時,利用一個錯誤的口令密碼操作看門狗控制寄存器(WDTCTL)或選擇的時間間隔期滿都將產生一個PUC復位信號,一個PUC復位信號可將看門狗定時器復位到默認狀態。

定時計數模式

???????將WDTTMSEL控制位選擇為1,看門狗定時器被配置為定時計數模式。這個模式可以被用來產生周期性中斷,在定時計數模式下,當選定的時間間隔到來時,將置位看門狗定時計數中斷標志位(WDTIFG),但并不產生PUC復位信號。當看門狗定時計數中斷允許控制位(WDTIE)和全局中斷允許控制位(GIE)置位時,CPU將響應WDTIFG中斷請求。中斷請求被響應后,單片機將自動清除看門狗定時計數中斷標志位,當然也可通過軟件手動清除看門狗定時計數中斷標志位。在定時計數模式下的中斷向量地址不同于在看門狗模式下的中斷向量地址,具體請參考MSP430單片機中斷向量表。

看門狗定時器中斷

???????看門狗定時器利用以下兩個寄存器控制看門狗定時器中斷:
? 看門狗中斷標志位WDTIFG:位于SFRIFG1.0內;
? 看門狗中斷允許控制位WDTIE:位于SFRIE1.0內。
???????當看門狗定時器工作在看門狗模式時,看門狗中斷標志位WDTIFG來源于一個復位向量中斷。復位中斷服務程序可利用看門狗中斷標志位WDTIFG來判定看門狗定時器是否產生了一個系統復位信號。若WDTIFG標志位置位,看門狗定時器產生一個復位條件,要么復位定時時間到,要么口令密碼錯誤。
當看門狗定時器工作在定時計數模式時,當定時時間到,將置位看門狗中斷標志位WDTIFG,若WTDIE和GIE都置位,則可響應看門狗定時計數中斷。

時鐘故障保護功能

???????看門狗定時器提供了一個時鐘故障保護功能,確保在看門狗模式下,參考時鐘不失效,這就意味著低功耗模式將有可能影響看門狗定時器參考時鐘的選擇。如果SMCLK或ACLK作為定時器參考時鐘源時失效,看門狗定時器將自動選擇VLOCLK作為其參考時鐘源。當看門狗定時器工作于定時計數模式時,看門狗定時器沒有時鐘故障保護功能。

低功耗模式下的看門狗操作

???????MSP430單片機具有多種低功耗模式,在不同的低功耗模式下,啟用不同的時鐘信號。應用程序的需要及所選時鐘的類型決定了看門狗定時器的配置,例如如果用戶想用低功耗模式3(LPM3),就要避免看門狗定時器的參考時鐘選擇以DCO、高頻模式下的XT1或XT2作為時鐘源的SMCLK或ACLK。當不需要看門狗定時器時,可利用WDTHOLD控制位關閉看門狗計數器(WDTCNT),以減少單片機功耗。

看門狗定時器控制寄存器

看門狗定時器控制寄存器(WDTCTL)列表如表所示。

WDT_A API (機翻)

???????看門狗定時器(WDT_A) API提供了一組使用MSP430Ware WDT_A模塊的函數。提供了初始化看門狗定時器為定時計數模式或看門狗模式的函數,具有可選擇的時鐘源和分頻器來設置定時器周期。
WDT_A模塊在定時器定時計數模式下只能產生一種中斷。在看門狗模式時,一旦定時器計數完成,WDT_A模塊將產生一次復位。

WDT_A_hold(uint16_t baseAddress) //暫停看門狗定時器 WDT_A_start(uint16_t baseAddress) //啟動看門狗定時器 WDT_A_resetTimer(uint16_t baseAddress) //重置看門狗定時器的計數值 WDT_A_initWatchdogTimer(uint16_t baseAddress, uint8_t clockSelect, uint8_t clockDivider) //以看門狗模式設置看門狗定時器的時鐘源 WDT_A_initIntervalTimer(uint16_t baseAddress, uint8_t clockSelect, uint8_t clockDivider) //以定時計數模式設置看門狗定時器的時鐘源

參數

baseAddress

WDT_A_BASE

clockSelect

/*is the clock source that the watchdog timer will use. Valid values are:*/ WDT_A_CLOCKSOURCE_SMCLK /*[Default]*/ WDT_A_CLOCKSOURCE_ACLK WDT_A_CLOCKSOURCE_VLOCLK WDT_A_CLOCKSOURCE_XCLK /*Modified bits are WDTSSEL of WDTCTL register.*/

clockDivider

/*is the divider of the clock source, in turn setting the watchdog timer interval. Valid values are:*/ WDT_A_CLOCKDIVIDER_2G WDT_A_CLOCKDIVIDER_128M WDT_A_CLOCKDIVIDER_8192K WDT_A_CLOCKDIVIDER_512K WDT_A_CLOCKDIVIDER_32K /*[Default]*/ WDT_A_CLOCKDIVIDER_8192 WDT_A_CLOCKDIVIDER_512 WDT_A_CLOCKDIVIDER_64 /*Modified bits are WDTIS and WDTHOLD of WDTCTL register.*/

上機實戰

定時計數模式

配置

配置為定時計數模式,時鐘源選為ACLK = 32768HZ ,分頻系數設為32768,得到1s的定時周期

WDT_A_hold(WDT_A_BASE); //暫停計數SystemClock_Init();WDT_A_initIntervalTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K); //初始化看門狗定時計數模式SFR_enableInterrupt(SFR_WATCHDOG_INTERVAL_TIMER_INTERRUPT); //啟用看門狗定時計數模式中斷GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);WDT_A_start(WDT_A_BASE); //開始計數__bis_SR_register(GIE);

中斷服務函數

// 看門狗中斷服務程序 #pragma vector = WDT_VECTOR __interrupt void WDT_ISR(void) {GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); // 反轉P1.0端口狀態 }

整體代碼

#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void) {PMM_setVCore(PMM_CORE_LEVEL_3); //高主頻工作需要較高的核心電壓//XT1引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作為FLL參考時鐘,先8分頻,再50倍頻 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作為ACLK時鐘源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為MCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為SMCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//設置外部時鐘源的頻率,使得在調用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK時可得到正確值UCS_setExternalClockSource(32768, 4000000); }int main(void) {WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initIntervalTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);SFR_enableInterrupt(SFR_WATCHDOG_INTERVAL_TIMER_INTERRUPT);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){} }// 看門狗中斷服務程序 #pragma vector = WDT_VECTOR __interrupt void WDT_ISR(void) {GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); // 反轉P1.0端口狀態 }

實驗結果

看門狗模式

配置

初始化P2.1為上拉輸入,P1.0為LED輸出,按下P2.1 按鈕喂狗,當得不到及時的喂狗,系統將會復位。

WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initWatchdogTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){WDT_A_resetTimer(WDT_A_BASE);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}}}

整體代碼

#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void) {PMM_setVCore(PMM_CORE_LEVEL_3); //高主頻工作需要較高的核心電壓//XT1引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作為FLL參考時鐘,先8分頻,再50倍頻 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作為ACLK時鐘源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為MCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為SMCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//設置外部時鐘源的頻率,使得在調用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK時可得到正確值UCS_setExternalClockSource(32768, 4000000); }int main(void) {WDT_A_hold(WDT_A_BASE);SystemClock_Init();WDT_A_initWatchdogTimer(WDT_A_BASE, WDT_A_CLOCKSOURCE_ACLK, WDT_A_CLOCKDIVIDER_32K);GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);WDT_A_start(WDT_A_BASE);__bis_SR_register(GIE);while(1){if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){WDT_A_resetTimer(WDT_A_BASE);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}}} }

總結

以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。