《智能產品設計與應用》課件-項目三 定時與中斷_第1頁
《智能產品設計與應用》課件-項目三 定時與中斷_第2頁
《智能產品設計與應用》課件-項目三 定時與中斷_第3頁
《智能產品設計與應用》課件-項目三 定時與中斷_第4頁
《智能產品設計與應用》課件-項目三 定時與中斷_第5頁
已閱讀5頁,還剩94頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

智能產品設計與應用1.定時器/計數器案例導入01/PART

ONE定時器/計數器1.定時/技術器的基本原理定時/計數器,是一種能夠對內部時鐘信號或外部輸入信號進行計數,當計數值達到設定要求時,向CPU提出中斷處理請求,從而實現定時或者計數功能的外設。定時/計數器的最基本工作原理是進行計數。不管是定時器還是計數器,本質上都是計數器,可以進行加1(減1)計數,每出現一個計數信號,計數器就會自動加1(自動減1),當計數值從0變成最大值(或從最大值變成0)溢出時,定時/計數器就會向CPU提出中斷請求。定時器/計數器2.CC2530的定時/計數器CC2530共有4個定時/計數器定時器1:16位的定時器,功能最全。定時器2:為系統定時,用戶不用此定時器。定時器3:4:

8位定時器定時器/計數器2.CC2530的定時/計數器CC2530T1定時/計數器定時器1:16位的定時器自由運行模式:0x0000-0xFFFF,CHXIF和OVFIF被置1模模式:0x0000-T1CC0,CHXIF和OVFIF被置1正計數/倒計數模式:0x0000-T1CC0-0x0000,CHXIF和OVFIF被置1定時器/計數器2.CC2530的定時/計數器T1定時/計數器通過兩個8位的SFR讀取16位的計數器值:T1CNTH和T1CNTL,分別包含在高位字節和低位字節中。當讀取T1CNTL時,計數器的高位字節在那時被緩沖到T1CNTH,以便高位字節可以從T1CNTH中讀出。T1CNTL必須總是在讀取T1CNTH之前首先讀取。定時器/計數器2.CC2530的定時/計數器T1定時/計數器工作模式定時器1:16位的定時器自由運行模式:0x0000-0xFFFF,CHXIF和OVFIF被置1模模式:0x0000-T1CC0,CHXIF和OVFIF被置1正計數/倒計數模式:0x0000-T1CC0-0x0000,CHXIF和OVFIF被置1定時器1的三種工作模式自由運行模式:計數器從0x0000開始,在每個活動時鐘邊沿增加1,當計數器達到0xFFFF時溢出,計數器重新載入0x0000并開始新一輪的遞增計數。該模式的計數周期是固定值0xFFFF,當達到最終計數值0xFFFF時,標志位T1IF和OVFIF被設置。定時器/計數器2.CC2530的定時/計數器定時器1的三種工作模式模模式:計數器從0x0000開始,在每個活動時鐘邊沿增加1,當計數器達到T1CC0寄存器保存的值時溢出,計數器又將從0x0000開始新一輪的遞增計數,模模式的計數周期可由用戶自行設定。定時器/計數器2.CC2530的定時/計數器定時器1的三種工作模式正計數/倒計數模式:計數器反復從0x0000開始,正計數到TICC0保存的最終計數值,然后再倒計數回0x0000,當達到最終計數值時,標志位T1IF和OVFIF被設置。定時器/計數器2.CC2530的定時/計數器定時器有3種情況能產生中斷請求:計數器達到最終計數值(溢出或回到零)。輸入捕獲事件。輸出比較事件(模模式時使用)。使用模模式要特別注意,需要開啟通道0的輸出比較模式,否則計數器的值達到T1CC0后,是不會產生溢出中斷的。定時器/計數器3.CC2530的定時/計數器中斷系統定時器/計數器3.CC2530的定時/計數器中斷系統T智能產品設計與應用2.定時器/計數器寄存器詳解案例導入01/PART

ONE定時器/計數器寄存器詳解任務:用定時器1的模模式實現1秒定時將內部系統時鐘16MHz的RC振蕩器128分頻作為定時器1的計數信號,在模模式中實現0.1秒定時。在定時中斷服務函數中對全局變量count進行累加,實現1秒定時,并將LED1每1秒切換亮滅,LED2每4秒切換亮滅。設計思路

CC2530模塊P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2計算最大計數值,并填入T1CC0H和T1CCOL。使用模模式,記得開啟通道0的輸出比較模式。使能定時器1相關的中斷控制位。在T1CTL寄存器設置分頻系數,啟動定時器。定時器初始化編寫定時器1中斷服務處理函數,在這里記得手工清除T1STAT寄存器中的中斷標志位。定義一個全局變量count,進行1秒定時。定時器中斷定時器/計數器寄存器詳解周期的概念TT1CNTH–定時器1計數高位T1CNTL–定時器1計數低位T1CTL–定時器1控制T1STAT–定時器1狀態T1CCTLn–定時器1通道n捕獲/比較控制T1CCnH–定時器1通道n捕獲/比較高位值T1CCnL–定時器1通道n捕獲/比較低位定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器定時器/計數器寄存器詳解與定時器T1相關的寄存器智能產品設計與應用3.定時器/計數器配置案例導入01/PART

ONE定時器/計數器配置任務:用定時器1的模模式實現1秒定時將內部系統時鐘16MHz的RC振蕩器128分頻作為定時器1的計數信號,在模模式中實現0.1秒定時。在定時中斷服務函數中對全局變量count進行累加,實現1秒定時,并將LED1每1秒切換亮滅,LED2每4秒切換亮滅。

CC2530模塊P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2定時器/計數器配置設計思路計算最大計數值,并填入T1CC0H和T1CCOL。使用模模式,記得開啟通道0的輸出比較模式。使能定時器1相關的中斷控制位。在T1CTL寄存器設置分頻系數,啟動定時器。定時器初始化編寫定時器1中斷服務處理函數,在這里記得手工清除T1STAT寄存器中的中斷標志位。定義一個全局變量count,進行1秒定時。定時器中斷定時器/計數器配置1.定時器初始化函數設計765432100:捕獲模式1:比較模式T1IE=1;7:43:2分頻系數1:0工作模式00:1分頻01:8分頻

10:32分頻11:128分頻00:暫停01:自由運行

10:模模式11:正/倒計數一旦設置了定時器1的工作模式,就馬上開始計數工作了,故該語句要寫在初始化最后一行。①T1CC0計數最大值②T1CCTL0開啟通道0比較模式T1CC0L=0XD4;先寫低位T1CC0H=0X30;后寫高位5個通道:0-4。③T1IE=1;定時器1中斷允許④EA=1;開啟總中斷EA=1;⑤T1CTL定時器1工作模式T1CTL=0X0E;T1CCTL0|=0X04;定時器/計數器配置2.設置定時器1的最大計數值定時器1共有5對T1CCxH和T1CCxL寄存器,分別對應通道0到通道4。在使用定時器1的定時功能時,使用T1CC0H和T1CC0L兩個寄存器存放最大計數值的高8位和低8位。最大計數值=定時時長/定時器計數周期。定時器/計數器配置3.計算定時器1的最大計數值在本實訓中,系統時鐘為16MHz,分頻系數為128,要定時0.1秒,最大計數值為:T1CC0L=0XD4;先寫低位T1CC0H=0X30;后寫高位定時器/計數器配置4.定時器初始化函數設計初始化定時器1的最大計數值。開啟定時器1比較模式。開啟定時器1中斷和總中斷。設置分頻系數(128)和工作模式(模模式)啟動定時器。T1CCTL0|=0X04;T1IE=1;開啟定時器1中斷EA=1;開啟總中斷T1CTL=0X0E;T1CC0L=0XD4;先寫低位T1CC0H=0X30;后寫高位定時器/計數器配置5.定時器中斷服務函數設計清除T1STAT的中斷標志位。OVFIF:定時器1計數器溢出中斷標志位CHXIF:定時器1通道X中斷標志位T1STAT&=~0x21;

//清除定時器1中斷標志,通道0中斷標志累加全局變量count。count被10整除即1秒的定時到了。4秒定時到將count清零。7-6543210保留OVFIFCH4IFCH3IFCH2IFCH1IFCH0IF定時器/計數器配置定時器1通道0,自由模式,128分頻,0.1s,初始化T1CC0L=0XD4;//先寫低位T1CC0H=0X30;//后寫高位T1CCTL0|=0X04;//T1CCTL0,開啟比較模式。T1IE=1;//開啟定時器1中斷EA=1;//開啟總中斷T1CTL=0X0E;//設置分頻系數(128)和工作模式(模模式)并啟動定時器定時中斷響應后,清除中斷標志位:

T1STAT&=~0x21;//清除定時器1中斷標志,通道0中斷標志

智能產品設計與應用4.定時器/計數器應用編程案例導入01/PART

ONE任務選擇內部16MHz時鐘的128分頻作為計數器1的計數信號。以模模式啟動定時器1,進行0.1秒的間隔定時。當k1按鍵長按松開后,切換D1燈的開關狀態當k1按鍵短按松開后,切換D2燈的開關狀態。注:按鍵按下時間大于0.5秒,定義為長按,反之為短按。基于定時器1,用按鍵長按和短按切換D1,D2燈的狀態

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊前后臺的基本概念前臺系統:一般指中斷級程序,即中斷服務函數。后臺系統:一般指任務級程序,即死循環中的主函數。基本的思維模式:中斷服務函數中的邏輯處理受到主函數運行的制約,主函數中的某些功能又取決于中斷服務函數中的變量,兩者相互關聯,相互制約,協同運行。以本節課任務:“按鍵長按與短按的實現”為例。后臺工作:掃描按鍵狀態,在按鍵按下和松開時分別標志不同的變量值,并且對按鍵的按下時間T進行判斷,決定按鍵是長按還是短按。前臺工作:定時器循環進行0.1秒間隔定時。按鍵按下,開始計算時間,按鍵松開,結束計算時間。程序講解程序講解Count=0;//計時次數F_key=0;//確定是否按下F_key=1?Count++;有按鍵按下,才計時定時器中斷服務程序Scan_key()確定按鍵按下Count=0;F_key=1;開始計時等待松開;F_key=0;//停止計時Count>5?長按;短按;程序講解#include"iocc2530.h"#defineLED1P1_0#defineLED2P1_1#defineLED3P0_4#definek1P0_1unsignedintcount=0;//定時累加unsignedcharF_time=0;unsignedcharF_key=0;/1.端口初始化voidInit_Port(){//led設置//1.功能0:io,1:外設P1SEL&=~0x03;//0000,0011P0SEL&=~0X10;//0001,0000//2.方向0:輸入,1:輸出P1DIR|=0X03;P0DIR|=0X10;

//k1設置P0_1//1.功能P0SEL&=~0X02;//0000,0010//2.方向P0DIR|=0X02;//3.輸入模式P0INP&=~0X02;P2INP&=~0X20;//0010,0000

LED1=1;//熄滅LED2=1;//熄滅LED3=1;//熄滅}頭文件&宏定義初始化子程序程序講解voidInit_Time()//定時器中斷初始化{//1.計數最大值T1CC0L=0XD4;T1CC0H=0X30;//2.開啟通道0比較模式T1CCTL0|=0X04;//3.定時器1中斷允許T1IE=1;//4.開啟總中斷EA=1;//5.定時器1工作模式設置,開啟定時T1CTL=0X0E;}//3.定時器中斷服務函數#pragmavector=T1_VECTOR_interruptvoidTime1_Sevicr(){T1STAT&=~0X21;//清除定時中斷標志if(F_key==1)count++;}程序講解voidscan_key(){if(k1==0){delay(200);if(k1==0){count=0;//確定按下,計時初始值清0F_key=1;//定時器開始計時while(k1==0);F_key=0;//定時器停止計時if(count>5){LED1=~LED1;//切換1狀態}elseLED2=~LED2;//切換2狀態}}}voidmain(){Init_Port();//1.端口初始化Init_Time();//2.定時器中斷初始化while(1){scan_key();}}拓展任務單擊按鍵k1,切換LED1燈的開關狀態;雙擊按鍵K1,切換LED2燈的開關狀態;三連擊按鍵K1,切換LED3燈的開關狀態;四連擊按鍵K1,切換LED1-3的開關狀態。定時器,定時0.1s,實現單擊、雙擊、三擊、四擊控制

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊編程思路每個按鍵按下都定義一個生命周期,假如是0.5秒,生命周期結束的時候才確定按鍵的最終狀態。如果在按鍵的生命周期內有新的按鍵按下,將會重新計算生命周期,這時候就是雙擊。在雙擊的生命周期中,又有新的按鍵按下,則生命周期會重新計算,這時候就是三連擊。在整個生命周期中如果沒有新的按鍵按下,那么最終的按鍵狀態就是三連擊。如此類推。編程思路編程思路#include"iocc2530.h"#defineLED1P1_0#defineLED2P1_1#defineLED3P0_4#definek1P0_1unsignedcharcount=0;unsignedchark_Num=0;voidInitIO(void)//端口初始化{//功能:0:IO,1:外設P1SEL&=~0X03;P0SEL&=~0X12;//0001,0010

//方向:0:輸入,1:輸出P1DIR|=0X03;P0DIR|=0X10;//0001,0000,P0_4輸出P0DIR&=~0X02;//0000,0010,P0_1輸入//輸入模式:0:上拉/下拉,1:三態P0INP&=~0X02;//0:上拉/下拉,0000,0010,P2INP&=~0X20;//0:上拉LED1=1;LED2=1;LED3=1;//開始燈熄滅}編程思路voidInit_Timer1(void){T1CC0L=0XD4;//先寫低位T1CC0H=0X30;//后寫高位T1CCTL0|=0X04;//T1CCTL0,開啟比較模式。T1IE=1;//開啟定時器1中斷EA=1;//開啟總中斷T1CTL=0X0E;//設置分頻系數(128)和工作模式(模模式)并啟動定時器}定時器中斷初始化#pragmavector=T1_VECTOR__interruptvoidTimer1_Sevice(void){T1STAT&=~0x21;//清除定時器1中斷標志,通道0中斷標志if(k_Num!=0&&k1!=0)//進入開始按鍵,中途按鍵要松開才計時間count++;}中斷函數編程思路voidkey_scan(void){if(k1==0){delay(100);if(k1==0)while(k1==0);//等待松手k_Num++;//按下1次,按鍵次數加1if(k_Num>4)k_Num=4;}//按鍵識別if(count>5)//時間超過0.5s{switch(k_Num){case1:LED1=~LED1;break;//單擊case2:LED2=~LED2;break;//雙擊case3:LED3=~LED3;break;//三擊case4:LED1=~LED1;LED2=~LED2;LED3=~LED3;break;//四擊}k_Num=0;//按鍵次數清0count=0;//計數清0}}按鍵掃描函數編程思路voidmain(void){InitIO();Init_Timer1();while(1){key_scan();}}主函數智能產品設計與應用5.看門狗定時器和系統時鐘案例導入01/PART

ONE看門狗定時器在CPU可能受到軟件顛覆的情況下,看門狗定時器(WDT)可用于恢復。當軟件在選定時間間隔內不能清除WDT時,WDT必須就復位系統。看門狗可用于受到電氣噪音、電源故障、靜電放電等影響,或需要高可靠性的環境。如果一個應用不需要看門狗功能,可以配置看門狗定時器為一個間隔定時器,這樣可以用于在選定的時間間隔產生中斷。什么是看門狗定時器看門狗定時器四個可選的定時器間隔看門狗模式定時器模式在定時器模式下產生中斷請求WDT可以配置為一個看門狗定時器或一個通用的定時器。WDT模塊的運行由WDCTL寄存器控制。看門狗定時器包括一個15位計數器,它的頻率由32kHz時鐘源規定。注意用戶不能獲得15位計數器的內容。在所有供電模式下,15位計數器的內容保留,且當重新進入主動模式,看門狗定時器繼續計數。看門狗定時器的特性如下看門狗定時器WDT:WatchDogTimer,本質上是一個計數器,可以監測系統的運行情況,在程序“跑飛”的情況下,實現自動復位。程序正常運行過程中,每隔一段時間內核發出指令讓看門狗重新開始計數,也稱為喂狗。只要在設定的最大間隔時間內,通過喂狗復位計數器,系統就不會復位。1.看門狗原理當系統受到干擾導致程序跑飛,或者軟件存在漏洞沒有按預定設計執行,在設定的最大喂狗時間內沒有進行定時器復位,看門狗則溢出,系統自動復位。看門狗定時器15位計數器,工作在32KHz的時鐘頻率,系統復位時禁用。4個定時間隔:1s、0.25s、15.625ms、1.9ms。2種工作模式:看門狗模式、定時器模式。喂狗序列:在一個看門狗時鐘周期內,寫入0xA到WDCTL.CLR[3:0],然后寫入0x5到同一個寄存器中。1.看門狗原理看門狗定時器2.看門狗控制寄存器WDCTL位名稱復位R/W描述7:4CLR[3:0]0000R0/W清除定時器。當0xA跟隨0x5寫到這些位,定時器被清除(即加載0)。3:2MODE[1:0]00R/W模式選擇。00:IDLE(idle空閑的意思)

01:IDLE(未使用,等于00設置)10:看門狗模式

11:定時器模式1:0INT[1:0]00R/W定時器間隔選擇。注意時間間隔智能在WDT處于IDLE時改變,這樣間隔必須在定時器啟動同時設置。00:1s01:

0.25s10:15.625ms

11:1.9ms設計參考:將看門狗定時器設為看門狗模式,喂狗時間為0.25秒。WDCTL=0x09;00001001將看門狗定時器設為定時器模式,定時間隔為1秒。WDCTL=0x0C;//00001100看門狗定時器將看門狗定時器設置成定時器模式。定時周期選擇1秒。在看門狗中斷服務函數中,切換LED1燈的開關狀態。注:看門狗中斷標志位--WDTIF,需要軟件手動清除。任務5.1:看門狗定時器實現1秒定時

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊端口初始化函數看門狗初始化函數看門狗中斷服務函數定時器模式

看門狗定時器中斷允許總中斷看門狗定時器看門狗初始化函數WDCTLIEN2.WDTIE(第5位)EA=1;voidInit_WDI(){WDCTL=0x0C;//00001100,定時器模式,1s,修改最后2位,即修改定時長度IEN2|=0x20;//00100000//

IEN2.WDTIE(第5位),看門狗定時中斷允許位EA=1;//總中斷允許位}看門狗定時器看門狗中斷函數看門狗中斷標志位WDTIF#pragmavector=WDT_VECTOR__interruptvoidSevice_WDT(){

WDTIF=0;//清除看門狗中斷標志位,在IRCON2.4LED1=~LED1;}看門狗定時器主函數main看門狗中斷函數LED引腳初始化函數看門狗初始化函數死循環while(1)②看門狗定時器中斷允許①定時器模式③總中斷②切換LED1狀態①清除看門狗標志位配置LED1(P1_0)作為IO輸出引腳①定時器模式看門狗定時器拓展任務5.2使看門狗定時器WDT工作在定時器模式,控制LED1、LED2、LED3的亮/滅。LED1亮滅時間間隔1s,LED2亮滅時間間隔2s、LED3亮滅時間間隔3s。采用中斷方式,在中斷服務函數中切換次LED的亮滅狀態。智能產品設計與應用6.看門狗定時器和系統時鐘運用案例導入01/PART

ONE看門狗定時器初始化看門狗定時器為看門狗模式,喂狗時間為1秒。設計LED燈檢測函數,3個燈同時點亮,延時,再同時熄滅。設計帶喂狗功能的閃燈函數,LED1亮,延時,LED1滅,延時,喂狗。設計不帶喂狗功能的閃燈函數,LED2亮,延時,LED2滅,延時。在主函數中,進入死循環,先執行8次帶喂狗功能的閃燈函數,再執行8次不帶喂狗功能的閃燈函數。效果:帶喂狗,閃爍完成,不帶喂狗,超過時間,會復位。任務5.3設計看門狗監測程序看門狗定時器

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊任務5.3設計看門狗監測程序端口初始化函數看門狗初始化函數喂狗函數LED1閃爍函數LED2閃爍函數看門狗定時器主函數mainLED1閃爍喂狗函數LED引腳初始化函數看門狗初始化函數死循環while(1)①看門狗模式1s8次LED1閃爍函數(帶喂狗)8次LED2閃爍函數(不帶喂狗)WDCTL=0x08;LED2閃爍Feed_Dog()WDCTL|=0xA0;WDCTL|=0x50;看門狗定時器voidInit_WDI(){WDCTL=0x08;//00001000,看門狗模式,1s}看門狗初始化函數voidFeed_Dog(){WDCIL|=0xA0;WDCTL|=0x50;}喂狗函數系統時鐘系統時鐘是從所選的主時鐘源獲得的。CC2530的主時鐘源:(1)16MHz的內部RC振蕩器

(2)32MHz的外部晶振32MHz的外部晶振,其啟動時間對一些應用程序來說可能比較長,所以設備可以先運行在16MHz的內部RC振蕩器,直到外部晶振穩定。RC振蕩器的功耗低于外部晶振,但是精度不如外部晶振高,因此,要使用RF收發器,必須使用32MHz晶體振蕩器。串口通信是也建議使用32MHz晶體振蕩器。系統時鐘CLKCONCMD時鐘控制命令寄存器位名稱復位R/W描述7OSC32K1R/W當前選擇的32kHz時鐘源。0:32kHzXOSC

1:32kHzRCOSC6OSC1R/W當前選擇的系統時鐘。0:32MHzXOSC

1:16MHzRCOSC5:3TICKSPD[2:0]001R/W當前設置的定時器標記輸出,不能高于通過OSC位設置的時鐘。000:32MHz

001:16MHz2:0CLKSPD001R/W當前時鐘速度,表示當前系統時鐘頻率。000:32MHz

001:16MHzCLKCONCMD.OSC位選擇主系統的時鐘源。改變CLKCONCMD.OSC位不會立即改變系統的時鐘。時鐘源的改變首先在CLKCONSTA.OSC位與CLKCONCMD.OSC位相等的時候生效。因為在實際改變時鐘源之前需要有穩定的時鐘。上電默認選擇系統時鐘CLKCONSTA時鐘控制狀態寄存器(只讀)位名稱復位R/W描述7OSC32K1R當前選擇的32kHz時鐘源。0:32kHzXOSC

1:32kHzRCOSC6OSC1R當前選擇的系統時鐘。0:32MHzXOSC

1:16MHzRCOSC5:3TICKSPD[2:0]001R當前設置的定時器標記輸出,不能高于通過OSC位設置的時鐘。000:32MHz

001:16MHz2:0CLKSPD001R當前時鐘速度,表示當前系統時鐘頻率。000:32MHz

001:16MHz將CC2530的系統時鐘源從16MHz的內部RC振蕩器切換成32MHz的外部晶振。CLKCONCMD&=~0x40;//0SC位清0,選擇系統時鐘源為32MHz晶振。while(CLKCONSTA&0x40);//等待外部晶振穩定,第6位OSC由1變為0,就穩定了。CLKCONCMD&=~

0x07;//設置當前系統時鐘的速度為32MHz,最低3位變為0。系統時鐘位名稱復位R/W描述7OSC32K1R/W當前選擇的32kHz時鐘源。0:

32kHzXOSC

1:32kHzRCOSC6OSC1R/W當前選擇的系統時鐘。0:32MHzXOSC

1:16MHzRCOSC5:3TICKSPD[2:0]001R/W當前設置的定時器標記輸出,不能高于通過OSC位設置的時鐘。000:32MHz

001:16MHz2:0CLKSPD001R/W當前時鐘速度,表示當前系統時鐘頻率。000:32MHz

001:16MHz系統時鐘CLKCONCMD&=~0x40;//0SC位清0,選擇系統時鐘源為32MHz晶振while(CLKCONSTA&0x40);//等待外部晶振穩定,第6位OSC由1變為0,就穩定了CLKCONCMD&=~

0x07;//設置當前系統時鐘的速度為32MHz,最低3位變為0CLKCONCMD|=0x40;//0SC位清1,選擇系統時鐘源為16MHz晶振While(!(CLKCONSTA&0x40));//第6位OSC由0變為1CLKCONCMD|=0x01;//設置當前系統時鐘的速度為16MHz,最低3位000->001設置為32MHz設置為16MHz系統時鐘設計端口初始化函數,配置1個LED燈和k1,關閉1個LED燈。設計系統時鐘切換函數,根據參數進行16MHz和32MHz時鐘源切換。設計按鍵掃描處理函數,當k1按下松開后,切換系統的時鐘源,當前為16MHz的切換成32MHz,當前是32MHz的則切換為16MHz。在主函數,D1燈循環閃爍,并對按鍵k1進行掃描處理。任務5.6按鍵控制系統時鐘切換

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊系統時鐘IO配置Whle(1)LED1亮延時鍵盤掃描LED1滅延時鍵盤掃描F_clk=16;鍵盤掃描函數確定按鍵按下Main主程序F_clk=16?F_clk=32;設置時鐘為32MHzset_clock(32);F_clk=32?F_clk=16;設置時鐘為16MHzset_clock(16);YNYN設置時鐘函數set_clock(?);CLKCONCMD|=0X40;//OSC=1;while(!(CLKCONSTA&0X40));//等待OSC變為1CLKCONCMD|=0X01;//000->001,低三位置001,16MHz1632CLKCONCMD&=~0X40;//OSC=0;while(CLKCONSTA&0X40);//等待OSC變為0CLKCONCMD&=~0X07;//低三位置001->000,32MHz系統時鐘voidset_clock(unsignedcharclk_set){switch(clk_set){case16:CLKCONCMD|=0X40;//OSC=1;while(!(CLKCONSTA&0X40));//等待OSC變為1CLKCONCMD|=0X01;//000->001,低三位置001,32MHzbreak;case32:CLKCONCMD&=~0X40;//OSC=0;while(CLKCONSTA&0X40);//等待OSC變為0CLKCONCMD&=~0X07;//低三位置0,32MHzbreak;}}系統時鐘voidkey_scan(){if(k1==0){delay(100);if(k1==0){while(k1==0);if(F_clk==16){F_clk=32;set_clock(32);}elseif(F_clk==32){F_clk=16;set_clock(16);}}}}按鍵掃描切換系統時鐘智能產品設計與應用7.外部中斷基本概念案例導入01/PART

ONE外部中斷基本概念內核與外設之間的主要交互方式有兩種:輪詢和中斷。輪詢的方式貌似公平,但實際工作效率很低,且不能及時響應緊急事件;中斷系統使得內核具備了應對突發事件的能力。在執行CPU當前程序時,由于系統中出現了某種急需處理的情況,CPU暫停正在執行的程序,轉而去執行另外一段特殊程序來處理出現的緊急事務,處理結束后,CPU自動返回到原來暫停的程序中去繼續執行。這種程序在執行過程中由于外界的原因而被中間打斷的情況,稱為中斷。兩個重要的概念中斷服務函數:內核響應中斷后執行的相應處理程序。中斷向量:中斷服務程序的入口地址。每個中斷源都對應一個固定的入口地址。當內核響應中斷請求時,就會暫停當前的程序執行,然后跳轉到該入口地址執行代碼。1.中斷相關的基礎概念外部中斷基本概念2.CC2530的中斷系統CC2530具有18個中斷源,每個中斷源都由各自的一系列特殊功能寄存器來進行控制。外部中斷基本概念中斷發生時,CPU就指向上表所描述的中斷向量地址。一旦中斷服務開始,就只能夠被更高優先級的中斷打斷。中斷服務程序由中斷指令RETI(從中斷指令返回)終止,RETI執行時,CPU將返回到中斷發生時的下一條指令。當中斷發生時,不管該中斷使能或禁止,CPU都會在中斷標志寄存器中設置中斷標志位。如果當設置中斷標志時中斷使能,那么在下一個指令周期,由硬件強行產生一個LCALL到對應的向量地址,運行中斷服務程序。中斷的響應需要不同的時間,取決于該中斷發生時CPU的狀態。當CPU正在運行的中斷服務程序,其優先級大于或等于新的中斷時,新的中斷暫不運行,直至新的中斷的優先級高于正在運行的中斷服務程序。在其他情況下,中斷響應的時間取決于當前的指令,最快響應一個中斷的時間是7個機器指令周期,其中1個機器指令周期用于探測中斷,其余6個用來執行LCALL。3.中斷處理外部中斷基本概念中斷服務函數與一般自定義函數不同,有特定的書寫格式:(1)在每一個中斷服務函數之前,都要加上一句起始語句:

#pragmavector

=<中斷向量>

<中斷向量>表示接下來要寫的中斷服務函數是為那個中斷源服務的,有兩種寫法:

#pragma

vector=

0x6B

或者

#pragma

vector=

P0INT_VECTOR

前者是中斷向量的入口地址,后者是頭文件“ioCC2530.h”中的宏定義。(2)__interrupt關鍵字表示該函數是一個中斷服務函數,<函數名稱>可以自定義,函數體不能帶有參數,也不能有返回值。4.CC2530的中斷處理函數編寫方法

#pragma

vector=

P0INT_VECTOR__interrupt

voidInt0_Sevice(void)外部中斷基本概念CC2530的P0、P1和P2端口中的每個引腳都具有外部中斷輸入功能。設置IEN0~2:中斷使能寄存器:中斷類型使能(大)0:禁止,1:使能PxIEN:P0~2端口中斷使能寄存器:具體引腳使能(小):0:禁止,1:使能PICTL寄存器:端口輸入信號控制寄存器,0:上升沿,1:下降沿“EA=1;”打開總中斷。中斷標志端口中斷標志位:P0IF、P1IF和P2IF,引腳產生外部中斷時,對應端口組的中斷標志自動置位。(端口中斷標志必須在中斷服務函數中手工清除,否則CPU會反復進入中斷。)引腳狀態標志位:P0IFG、P1IGF和P2IFG,當某引腳發生外部中斷觸發時,對應引腳標志位會自動置位,需要手工清除。5.CC2530的外部中斷外部中斷基本概念中斷觸發示意圖外部中斷基本概念邏輯順序外部中斷基本概念設置方法②P0端口中斷允許位位名稱:P0IE寄存器:IEN1.5①EA總中斷允許位位名稱:EA寄存器:IEN0.7③引腳中斷允許寄存器:P0IEN8只引腳中斷允許④中斷觸發方式位位名稱:P0ICON寄存器:PICTL.0P0ICON:0:上升沿觸發中斷1:下降沿觸發中斷⑤P0口中斷標志位位名稱:P0IF寄存器:IRCON.5⑥P0口8位引腳中斷標志寄存器:P0IFG中斷向量名稱外部中斷基本概念寄存器詳情外部中斷基本概念具體配置②P0端口中斷允許位位名稱:P0IE寄存器:IEN1.5①EA總中斷允許位位名稱:EA寄存器:IEN0.7③引腳中斷允許寄存器:P0IEN8只引腳中斷允許④中斷觸發方式位位名稱:P0ICON寄存器:PICTL.0P0ICON:0:上升沿觸發中斷1:下降沿觸發中斷⑥P0口中斷標志位位名稱:P0IF寄存器:IRCON.5⑤P0口8位引腳中斷標志寄存器:P0IFGP0_1K1中斷服務程序中,先清除位標志,再清除端口標志EA=1;//打開總中斷IEN1|=0X20;//P0端口中斷允許P0IE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論