單片機(jī)與程序設(shè)計(jì)(上)
在單片機(jī)中,不僅頻繁地使用“○月○日○點(diǎn)○分”這種時(shí)刻顯示,顯示過(guò)去的時(shí)間和一定的周期這種形式也被頻繁地使用。例如,“該程序從運(yùn)行開始過(guò)去了多少時(shí)間?”、“每秒輸送128次信號(hào)”等等。另外,還經(jīng)常被用于“等待指定的時(shí)間”、“經(jīng)過(guò)指定的時(shí)間后將轉(zhuǎn)移到下一個(gè)處理”這樣的情況。對(duì)這些與時(shí)間和時(shí)刻有關(guān)進(jìn)行處理的外設(shè)功能就是定時(shí)器(圖1)。
我們也可以不使用外設(shè)功能(硬件)的定時(shí)器,而是通過(guò)軟件來(lái)計(jì)算時(shí)間。下面通過(guò)圖2來(lái)說(shuō)明使用軟件來(lái)定時(shí)的示例,圖中假設(shè)循環(huán)(重復(fù))部分的處理需要費(fèi)時(shí)1μs(微秒:100萬(wàn)分之1秒)。由此可以計(jì)算出該循環(huán)部分重復(fù)1000次需要花費(fèi)1ms(毫秒:千分之1秒),重復(fù)100萬(wàn)次則需費(fèi)時(shí)1秒。即:通過(guò)“等待經(jīng)過(guò)循環(huán)處理所指定的時(shí)間”來(lái)計(jì)算時(shí)間。但是,CPU將會(huì)集中進(jìn)行時(shí)間計(jì)算的處理而無(wú)法進(jìn)行其他處理。而且,只能計(jì)算一個(gè)周期的時(shí)間。而現(xiàn)實(shí)當(dāng)中,單片機(jī)需要對(duì)應(yīng)0.1秒和1/1024秒等各種周期的時(shí)間。
另外,CPU的計(jì)時(shí)器頻率(驅(qū)動(dòng)速度)也將對(duì)軟件產(chǎn)生影響。如果將100MHz驅(qū)動(dòng)的CPU改為50MHz,那么循環(huán)1次所需的時(shí)間將變?yōu)樵瓉?lái)的兩倍。因此,需要對(duì)計(jì)算時(shí)間的軟件進(jìn)行修正。如上所述,由于在管理上既花時(shí)間又容易出錯(cuò),所以要極力避免通過(guò)軟件來(lái)計(jì)算時(shí)間。
稍微介紹一下中斷的內(nèi)容……
下面,我們簡(jiǎn)單介紹一下和定時(shí)器不可分割的技術(shù)——“中斷功能”。單片機(jī)中的“中斷功能”是指某個(gè)程序在執(zhí)行過(guò)程中,因某種原因而發(fā)出“開始進(jìn)行其他處理”的請(qǐng)求。由于可以使用中斷功能,所以可使CPU不集中進(jìn)行一個(gè)處理。
讓我們想象一下日常生活中用到“中斷功能”的情景,當(dāng)我們把熱水倒入方便面盒中后,如果我們?cè)?分鐘內(nèi)一直盯著時(shí)鐘看,那么這段時(shí)間內(nèi)我們就不能做其它事情。但如果用廚房定時(shí)器設(shè)定3分鐘的時(shí)間,在廚房定時(shí)器的警報(bào)響起之前我們便可以去做其它事情。在這個(gè)例子中,“一直盯著時(shí)鐘看”就相當(dāng)于前一節(jié)中所介紹的“等待經(jīng)過(guò)循環(huán)處理所指定的時(shí)間”,所以在處理結(jié)束之前不能去做其它事情。同時(shí),廚房定時(shí)器的警報(bào)就相當(dāng)于中斷功能。在中斷發(fā)生前還可以去做其它事情。
單片機(jī)的外設(shè)功能中有各種各樣的定時(shí)器,這些定時(shí)器在經(jīng)過(guò)指定的時(shí)間或處理結(jié)束時(shí)向CPU發(fā)送中斷信號(hào)。不僅是定時(shí)器,很多外設(shè)功能都會(huì)在“產(chǎn)生變化”、“處理開始/結(jié)束”時(shí)將中斷信息傳送給CPU。所以,CPU在中斷功能發(fā)生前還可以繼續(xù)做其它工作,因此可提高作業(yè)效率。關(guān)于中斷功能的詳細(xì)內(nèi)容,將在本系列第4期的《外部中斷功能IRQ》中做詳細(xì)介紹。本期中,我們先事先了解一下“從外設(shè)功能以中斷的形式向CPU傳送信息”的內(nèi)容。
各式各樣的定時(shí)器中,還有“看門狗定時(shí)器”!
在單片機(jī)的外設(shè)功能中,最貼心的定時(shí)器是計(jì)算到指定時(shí)間的定時(shí)器和每隔一段時(shí)間便發(fā)生中斷的定時(shí)器。另外,在瑞薩電子的RX63N單片機(jī)中,搭載了為控制伺服電動(dòng)機(jī)而產(chǎn)生脈寬調(diào)制解調(diào)(PWM)信號(hào)的定時(shí)器、計(jì)算輸入信號(hào)間隔的定時(shí)器、顯示現(xiàn)在時(shí)刻的RTC(實(shí)時(shí)時(shí)鐘)等各種各樣的定時(shí)器。
在定時(shí)器中,最具特色的是WDT(看門狗定時(shí)器)。其名字Watch Dog Time中的Watch dog意思為“看門狗”,它的工作就是監(jiān)視程序是否出現(xiàn)失控。由WDT監(jiān)視的程序通過(guò)事先將設(shè)定的值寫入WDT后啟動(dòng)。WDT每隔一定時(shí)間便減掉寫入的值,當(dāng)程序正常運(yùn)行時(shí),處理結(jié)束前會(huì)對(duì)WDT清零再結(jié)束。但是,如果程序失控(進(jìn)入意料之外的重復(fù)狀態(tài)且無(wú)法停止)時(shí),寫入WDT的值將小于0(稱為下溢),因此向CPU通知程序出現(xiàn)了失控。在不允許睡眠的重要系統(tǒng)中,單片機(jī)中搭載的“看門狗定時(shí)器”DWDT發(fā)揮了極其重要的作用。
輕松嘗試使用定時(shí)器
雖然說(shuō):“我們就通過(guò)程序來(lái)實(shí)際使用定時(shí)器……”,但是實(shí)際上,要想熟練運(yùn)用定時(shí)器,必須先理解單片機(jī)的操作步驟。而且,不僅需要了解通過(guò)軟件進(jìn)行操作的步驟,還需理解單片機(jī)的硬件(結(jié)構(gòu))以及所使用的零部件的規(guī)格等。
因此,需要幫助時(shí)請(qǐng)使用“數(shù)據(jù)庫(kù)”。對(duì)于搭載了RX63N單片機(jī)的GR-SAKURA電路板,我們準(zhǔn)備了幾個(gè)與時(shí)間和時(shí)刻有關(guān)的數(shù)據(jù)庫(kù)。
SAKURA 的sketch參數(shù):櫻花程序庫(kù)時(shí)間(僅英文版)
在這個(gè)程序中,要讓GR-SAKURA上的LED在一定周期內(nèi)發(fā)光。雖然僅是很簡(jiǎn)單的操作,但是要想讓LED在正確的周期內(nèi)發(fā)光就需要使用定時(shí)器。在上述櫻花程序庫(kù)的“時(shí)間”選項(xiàng)內(nèi),有計(jì)算經(jīng)過(guò)時(shí)間的數(shù)據(jù)庫(kù),所以我們就使用它。
程序如圖3所示。第14行的millis函數(shù)以從程序開始時(shí)經(jīng)過(guò)的時(shí)間ms(毫秒:千分之一秒)為單位送回,沒(méi)有參數(shù)。使用該函數(shù),通過(guò)獲取和最初的測(cè)定(第14行)之間的差距來(lái)取得1秒后、2秒后的結(jié)果。用while語(yǔ)言生成循環(huán),從a的值等待1秒或2秒(第15行、第19行)。于是,1秒后LED0(GR-Sakura電路板的D1)亮燈,2秒后滅燈。滅燈后結(jié)束loop函數(shù),但是該操作會(huì)再次反復(fù)繼續(xù)執(zhí)行。另外,millis函數(shù)沒(méi)有符號(hào),將返回long型的整數(shù)。
圖3:使用定時(shí)器功能使LED亮燈的程序。此例中,以1秒鐘為周期閃爍。
※//~是用于進(jìn)行評(píng)價(jià),對(duì)程序的執(zhí)行不產(chǎn)生影響
將程序輸入Web編譯器,再將編譯完成后的二進(jìn)制文件傳送給GR-SAKURA。傳送結(jié)束后,4個(gè)LED燈將暫時(shí)熄滅后再開始執(zhí)行,LED0(GR-Sakura電路板的D1)開始閃爍。
接我們講解了必要的外設(shè)功能之一“定時(shí)器”。有關(guān)時(shí)間和時(shí)刻的處理,在各種場(chǎng)合都需要。請(qǐng)大家借此機(jī)會(huì)實(shí)際操作各種數(shù)據(jù)庫(kù)。
但是,文中的“懊128次”和“1/1024秒”這些數(shù)字突然冒出來(lái),是否讓你吃了一驚呢?128是2的7次方,1024是2的10次方。RTC中具有每1/128秒產(chǎn)生一次中斷的功能……這是在單片機(jī)的世界中經(jīng)??吹降臄?shù)字。
接下來(lái)講中斷功能
提高作業(yè)效率的“中斷功能”指的是什么?
我們回顧一下“定時(shí)器”中簡(jiǎn)單介紹過(guò)的“中斷功能”概念。任何人都有過(guò)這樣的經(jīng)驗(yàn),就是“將雞蛋放進(jìn)沸騰的熱水中,直到雞蛋煮熟的10分鐘內(nèi)要確認(rèn)好幾次時(shí)鐘”的經(jīng)歷。在單片機(jī)的世界中也同樣,在等待某種狀態(tài)達(dá)成時(shí),具有對(duì)對(duì)象進(jìn)行定期檢查的方法。例如,在等待向GPIO(通用I/O端口)的輸入從0變?yōu)?時(shí),程序可以一定的間隔來(lái)檢查GPIO的狀態(tài)。這種處理被稱為“輪詢”。
輪詢雖然是一種了解狀態(tài)變化的簡(jiǎn)單方法,但是如果檢查的頻度低(間隔長(zhǎng))就會(huì)錯(cuò)過(guò)變化,如果頻度過(guò)高(間隔短),即使查也查不到變化“空耗”。由于輪詢通過(guò)簡(jiǎn)單的程序便能完成處理,所以在掌握對(duì)象的變化頻度時(shí)是有效的。但是,進(jìn)行多次檢查也會(huì)給單片機(jī)帶來(lái)負(fù)荷,對(duì)功耗不利。
因此就要用到本期介紹的“中斷功能”。產(chǎn)生中斷時(shí),CPU會(huì)暫時(shí)停止正在執(zhí)行的任務(wù),轉(zhuǎn)而進(jìn)行別的任務(wù)。也就是有別的任務(wù)“穿插”進(jìn)來(lái)的意思(圖1)。當(dāng)中途穿插進(jìn)來(lái)的任務(wù)結(jié)束后,CPU再返回處理原來(lái)的任務(wù)。
設(shè)想一下你在工作的同時(shí)煮雞蛋的情況。由于你不想停下手中的工作,所以把雞蛋放入熱水中后就設(shè)置定時(shí)器并繼續(xù)工作,10分鐘后定時(shí)器一響就把雞蛋從熱水中撈起。這時(shí),定時(shí)器的鳴叫就是中斷,而“把雞蛋從熱水中撈起”就是穿插進(jìn)來(lái)的工作。大家可以通過(guò)這種方式來(lái)了解中斷功能。
單片機(jī)中的中斷處理
中斷產(chǎn)生于單片機(jī)內(nèi)部和外部的各種設(shè)備。于開關(guān)和感應(yīng)器等單片機(jī)外部的中斷稱為外部引腳中斷,來(lái)自這些機(jī)器的中斷信號(hào)由名為“IRQ”的引腳接收,再向中斷控制器(在RX63N中稱被稱為“ICUb”)發(fā)出通知。IRQ為“Interrupt ReQuest”的略稱,意思為“中斷請(qǐng)求”。另外,來(lái)自單片機(jī)內(nèi)部的定時(shí)器和GPIO、串行通信設(shè)備UART等外設(shè)機(jī)器的中斷被稱為外部設(shè)備中斷,中斷信號(hào)直接從各外部設(shè)備通知中斷控制器。
在中斷控制器中,各種設(shè)備的中斷信號(hào)按照先來(lái)后到的順序,以適當(dāng)?shù)捻樞虮粋魉偷紺PU。而且,中斷被設(shè)為無(wú)效的設(shè)備的中斷信號(hào)將不會(huì)被傳送到CPU,也就意味著可以忽視(屏蔽)這些信號(hào)。CPU按照從中斷控制器接收到的指示來(lái)執(zhí)行對(duì)應(yīng)的程序(中斷處理)。
CPU一旦接收到中斷控制器的中斷信號(hào),首先將終止執(zhí)行中的程序。然而,會(huì)自動(dòng)保存“從何處重啟”的出棧(POP)信息,這被稱為“進(jìn)棧(PUSH)”。進(jìn)棧結(jié)束后,將開始由中斷執(zhí)行的程序。該程序結(jié)束時(shí),進(jìn)棧信息將回送到CPU,這種現(xiàn)象被稱為“出棧”(圖2)。由于進(jìn)棧和出棧都由CPU自動(dòng)執(zhí)行,因此程序設(shè)計(jì)者不必因順序問(wèn)題而費(fèi)心。
例如,通過(guò)UART執(zhí)行串行通信時(shí),經(jīng)常監(jiān)視字節(jié)是否被接收了而導(dǎo)致效率不佳。所以,多數(shù)情況下都對(duì)程序進(jìn)行如下編程,即在信息送達(dá)時(shí)就會(huì)產(chǎn)生中斷并進(jìn)行適當(dāng)?shù)奶幚?,另外,使定時(shí)器產(chǎn)生中斷的情況也不在少數(shù)。進(jìn)行“經(jīng)過(guò)了一定時(shí)間后該做什么”這類處理時(shí),應(yīng)進(jìn)行如下編程,即通過(guò)來(lái)自定時(shí)器的信號(hào)開始進(jìn)行處理。如上所述,在有效利用單片機(jī)方面,中斷功能發(fā)揮了很大的作用。
還可使用數(shù)據(jù)庫(kù)嘗試編寫復(fù)雜的中斷程序!
為了編寫與中斷相關(guān)的程序,就需要了解單片機(jī)的運(yùn)行。由于需要深入了解,所以不能僅是進(jìn)行簡(jiǎn)單的嘗試。幸好還有本系列中介紹過(guò)的GR-SAKURA數(shù)據(jù)庫(kù),可在GR-SAKURA數(shù)據(jù)庫(kù)中進(jìn)行與外部引腳中斷相關(guān)的處理,所以請(qǐng)嘗試使用GR-SAKURA數(shù)據(jù)庫(kù)來(lái)進(jìn)行編程。
SAKURA sketch參數(shù):櫻花程序庫(kù)--中斷(僅限英文版)
為了向GR-SAKURA提供外部引腳中斷,還需要做些工作。在GR-SAKURA中,從IO30引腳到IO35引腳接收來(lái)自外部的中斷信號(hào)。這次是將定時(shí)器輸出引導(dǎo)到IO0引腳,再將它傳送到IO31引腳作為中斷信號(hào)。因此,要從IO30引腳到GND的部分設(shè)置引腳接口,由底板用的電線將IO0和IO31連接起來(lái)(圖3)。
在示例程序(圖4)中預(yù)先準(zhǔn)備了如下功能,即當(dāng)GR-SAKURA的外部中斷信號(hào)引腳(從IO30到IO35中的一個(gè))的輸入從L電平變?yōu)镠電平時(shí),LED燈將啟動(dòng)。而且是在檢測(cè)到相當(dāng)于上述所說(shuō)明的“外部引腳中斷”的中斷信號(hào)后才會(huì)變化。從IO0引腳進(jìn)行定時(shí)器輸出,并將之與中斷輸入引腳即IO31引腳連接,通過(guò)這樣的方式便可以與一定的時(shí)間間隔發(fā)生中斷。
※即使已對(duì)該程序進(jìn)行了匯編,在沒(méi)有將上述的IO0和IO31引腳進(jìn)行連接的GR-SAKURA中也無(wú)法運(yùn)行。
以下為圖4的程序
※圖4程序結(jié)束
※圖4:用于外部引腳中斷的示例程序
在此數(shù)據(jù)庫(kù)中,可對(duì)分別與前述中斷信號(hào)輸入引腳對(duì)應(yīng)的處理。本次所示的是根據(jù)向IO31引腳輸入的變化(從L電平變?yōu)镠電平)來(lái)產(chǎn)生中斷的情況。第48行的attachInterrupt()定義了在某個(gè)輸入引腳出現(xiàn)某種變化時(shí)該調(diào)用什么函數(shù)。因此,設(shè)定為根據(jù)輸入IO31引腳的中斷信號(hào)來(lái)啟動(dòng)irq3()。這樣的設(shè)定只需在setup()中定義一次便能在整個(gè)程序中有效。除此以外,在setup()中還記述了定時(shí)器的定義、定時(shí)器輸出引腳的設(shè)定、LED輸出的設(shè)定等初始條件。
沒(méi)有通過(guò)loop()函數(shù)進(jìn)行的處理。取而代之的是由irq3()這個(gè)函數(shù)進(jìn)行處理。從這個(gè)函數(shù)來(lái)看是看不出它是從程序中調(diào)用的。但是,正是由于這個(gè)函數(shù),才能使中斷信號(hào)進(jìn)入IO31引腳時(shí)使LED的光發(fā)生變化。在函數(shù)irq3()中,四盞LED中只有一盞亮燈,這個(gè)函數(shù)一旦被調(diào)用,亮燈的LED就發(fā)生一次變化。為了讓人看得到這個(gè)“變化”,在case標(biāo)簽的部分,通過(guò)來(lái)自GPIO的輸出來(lái)滅燈且使旁邊的LED亮燈(邊緣的LED燈亮燈時(shí),相反側(cè)的邊緣的LED亮燈或滅燈)。
為了應(yīng)對(duì)不知何時(shí)會(huì)發(fā)生的意外,中斷就是非常有效的應(yīng)對(duì)方法。而且,中斷還可以減少程序的不必要運(yùn)行,從而可降低功耗。也可以說(shuō),為了真正有效地利用單片機(jī),這是一項(xiàng)不可缺少的技術(shù)。
關(guān)鍵詞: 單片機(jī)
您可能也感興趣:
今日熱點(diǎn)
為您推薦
保險(xiǎn)業(yè)去年原保費(fèi)收入微降0.79% 健康險(xiǎn)業(yè)務(wù)增長(zhǎng)3.36%
銀保監(jiān)會(huì):嚴(yán)防銀行保險(xiǎn)資金被用于盲目“加杠桿”,強(qiáng)化金融反壟斷
保險(xiǎn)打工人年終獎(jiǎng)多數(shù)和上年持平或下降,怎樣發(fā)才合理?
更多
- 長(zhǎng)三角區(qū)域協(xié)同創(chuàng)新指數(shù)年均增速達(dá)9.54% 成果共用指標(biāo)增幅最大
- 大興機(jī)場(chǎng)臨空區(qū)設(shè)立國(guó)際創(chuàng)新中心 助力外資企業(yè)順利“走進(jìn)來(lái)”
- 湖南發(fā)布“創(chuàng)新十條” 幫助企業(yè)紓困增效、激發(fā)創(chuàng)新活力
- 科技部和浙江發(fā)布《創(chuàng)新行動(dòng)方案》 構(gòu)建高標(biāo)準(zhǔn)技術(shù)要素市場(chǎng)...
- 蕪湖釋放創(chuàng)新“N次方”效應(yīng) 數(shù)字賦能驅(qū)動(dòng)產(chǎn)業(yè)升級(jí)
- 重慶:激發(fā)人才創(chuàng)新活力,到2025年創(chuàng)新要素活躍度顯著增強(qiáng)
- 西寧加快知識(shí)產(chǎn)權(quán)強(qiáng)市建設(shè)步伐 去年兌現(xiàn)資助資金200萬(wàn)元
- 無(wú)錫錫山區(qū)全面啟動(dòng)實(shí)施“雙招雙引” 引進(jìn)高端創(chuàng)新資源
更多
- 盤錦市實(shí)際利用外資取得重大進(jìn)展 加強(qiáng)對(duì)外資項(xiàng)目的跟蹤服務(wù)
- 重慶去年非金融類對(duì)外投資增長(zhǎng)43% 優(yōu)勢(shì)產(chǎn)業(yè)增資近億美元
- 廣西將實(shí)施制造業(yè)招商行動(dòng) 扎實(shí)推進(jìn)招才引智
- 廣西扎實(shí)推進(jìn)招商引資工作 去年新簽約項(xiàng)目投資額1.1萬(wàn)億元
- 四川省抓項(xiàng)目促投資 從7方面提出具體措施
- 春節(jié)臨近短期投資需求下滑 房地產(chǎn)銷售回落
- 去年交通固定資產(chǎn)投資規(guī)模高位運(yùn)行 港口貨物吞吐量平穩(wěn)增長(zhǎng)
- 廣州醫(yī)藥呈“供銷兩旺”態(tài)勢(shì) 醫(yī)藥制造業(yè)投資持續(xù)擴(kuò)大
排行
- 西藏發(fā)布“十四五”科技創(chuàng)新規(guī)劃 強(qiáng)化重點(diǎn)領(lǐng)域科技攻關(guān)
- 全球5G發(fā)展步伐都在加速
- 全球首次發(fā)現(xiàn)三維翼龍胚胎
- 空間站菌株對(duì)宇航員健康存在影響
- 我國(guó)氣象現(xiàn)代化整體水平邁入世界先進(jìn)行列
- 這一年,科技待解的謎題一籮筐
- 北斗系統(tǒng)正式邁入全球時(shí)代
- 國(guó)產(chǎn)C919大飛機(jī)突破100余項(xiàng)關(guān)鍵技術(shù)
- 北京軌道交通推出電子定期票
- 仿真機(jī)器人現(xiàn)已“進(jìn)軍”考古界
最近更新
- 單片機(jī)與程序設(shè)計(jì)(上)
- 到底值不值?索泰至尊版GTX560顯卡拆解
- 鉀肥概念上市公司有那些?鉀肥龍頭股一覽
- 汽車配件板塊龍頭股票有哪些?汽車配件股票一覽
- 運(yùn)輸行業(yè)概念股有哪些,運(yùn)輸股票一覽
- 智能電網(wǎng)概念龍頭上市公司全名單揭曉!智能電網(wǎng)概念股有哪些...
- 華為——5G之路上的實(shí)干家
- 機(jī)頂盒加解擾技術(shù)
- 數(shù)字電視技術(shù)及其應(yīng)用
- D觸發(fā)器原理之低調(diào)的真相
- 中國(guó)聯(lián)通和中國(guó)電信正在探索合并?
- 碳基概念股是哪些?碳基股票龍頭一覽,看看有哪些?
- 草甘膦上市公司有哪些,2021年草甘膦龍頭上市公司名單
- 寧波富邦股票分析:寧波富邦所屬概念板塊查詢
- 與碳基半導(dǎo)體相關(guān)的股票有哪些?2021碳基半導(dǎo)體板塊龍頭股一覽表
- 土壤修復(fù)概念股名單一覽,哪些是土壤修復(fù)概念股?
- 世紀(jì)瑞爾(300150)發(fā)行價(jià)多少?世紀(jì)瑞爾發(fā)行價(jià)多少錢?
- 高頻信號(hào)發(fā)生器的使用方法
- 光耦原理
- 電壓表的工作原理
- 太陽(yáng)能電池的工作原理
- 幾種微波信號(hào)發(fā)生器選擇比較
- LabVIEW視頻教程
- LM4890功放電路的分析
- 央行:2021年全年人民幣貸款增加19.95萬(wàn)億元 同比多增3150億元
- 綜合銷售毛利低 金種子酒預(yù)計(jì)2021年虧損超1.5億元
- 央行等:3月1日起個(gè)人存取現(xiàn)金單筆5萬(wàn)元以上需登記資金來(lái)源或用途
- 五糧液擬投27.5億擴(kuò)建制曲車間
- 因收入規(guī)模增長(zhǎng)不足 金楓酒業(yè)2021年凈利預(yù)虧損約1000萬(wàn)
- 因推廣費(fèi)大市場(chǎng)效益滯后,海南椰島預(yù)計(jì)2021年凈利潤(rùn)虧損