當前位置:首頁 > 定時器
  • 單片機定時/計數器實驗

    前面我們做了定時器的實驗,現在來看一看計數實驗,在工作中計數常常會有兩種要求:第一、將計數的值顯示出來,第二、計數值到一定程度即中斷報警。第一種如各種計數器、里程表,第二種如前面例中講到的生產線上的計數。先看第一種吧。我們的硬件中是這樣連線的:324組成的振蕩器連到定時/計數器1的外部管腳T1上面,我們就利用這個來做一個計數實驗,要將計數的值顯示出來,當然最好用數碼管了,可我們還沒講到這一部份,為了避免把問題復雜化,我們用P1口的8個LED來顯示計到的數據。 程序如下: ORG 0000H , AJMP START ORG 30H START: MOV SP,#5FH MOV TMOD,#01000000B ;定時/計數器1作計數用,0不用全置0 SETB TR1 ;啟動計數器1開始運行. LOOP: MOV A,TL0 MOV P1,A AJMP LOOP END 在硬件上用線將324的輸出與T1連通(印板上有焊盤)運行這種程序,注意將板按正確的位置放置(LM324放在左手邊,LED排列是按從高位到低們排列)看到什么?隨著324后接的LED的閃爍,單片機的8只LED也在持續變化,注意觀察,是不是按二進制: 00000000 00000001 00000010 00000011 這樣的次序在變呢?這就對了,這就是TL0中的數據。 程序二: ORG 0000H AJMP START ORG 001BH AJMP TIMER1 ;定時器1的中斷處理 ORG 30H START: MOV SP,#5FH MOV TMOD,#01010000B ;定時/計數器1作計數用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;預置值,要求每計到6個脈沖即為一個事件 SETB EA SETB ET1 ;開總中斷和定時器1中斷允許 SETB TR1 ;啟動計數器1開始運行. AJMP $ TIMER1: PUSH ACC PUSH PSW CPL P1.0 ;計數值到,即取反P1.0 MOV TH1,#0FFH MOV TL1,#0FAH ;重置計數初值 POP PSW POP ACC RETI END 上面這個單片機程序完成的工作很簡單,就是在每6個脈沖到來后取反一次P1。0,因此實驗的結果應當是:LM324后接的LED亮、滅6次,則P1。0口所接LED亮或滅一次。這實際就是我們上面講的計數器的第二種應用。 程序三:外部中斷實驗 ORG 0000H AJMP START ORG 0003H ;外部中斷地直入口 AJMP INT0 ORG 30H START: MOV SP,#5FH MOV P1,#0FFH ;燈全滅 MOV P3,#0FFH ;P3口置高電平 SETB EA SETB EX0 AJMP $ INT0: PUSH ACC PUSH PSW CPL P1.0 POP PSW POP ACC RETI END 本程序的功能很簡單,按一次按鈕1(接在12管腳上的)就引發一次中斷0,取反一次P1。0,因此理論上按一下燈亮,按一下燈滅,但在實際做實驗時,可能會發覺有時不“靈”,按了它沒反應,但在大部份時候是對的,這是怎么回事呢?我們在講解鍵盤時再作解釋,這個程序本身是沒有問題的。

    時間:2019-06-03 關鍵詞: 定時器 單片機 計數器

  • ARM筆記:定時器中斷的應用

    s3c2440芯片中一共有5個16位的定時器,其中有4個定時器(定時器0~定時器3)具有脈寬調制功能,即他們都有個輸出引腳,可以通過定時器來控制引腳周期性的高低電平變化,定時器4沒有輸出引腳。上次脫機運行PWM測試程序實驗的時候就用到了這塊,所以這次將PWM和定時器放在一起來學習。 定時器部件的時鐘源為PCLK,首先通過兩個8位預分頻器降低頻率,定時器0和1共用第一個預分頻器,2,3,4共用第二個預分頻器。 預分頻器輸出接入第二級分頻器,可以生成5種分頻信號(1/2,1/4,1/8,1/16,TCLK),其中8位預分頻器是可編程,根據裝載值來分頻PCLK,值儲存在TCFG0和TCFG1中。 定時器內部控制邏輯工作流程如下: 1.程序初始,先設置TCMPBn、TCNTBn這兩個寄存器,分別表示定時器n的比較值和初始計數值。 2.然后設置TCON寄存器啟動定時器n,這時TCMPBn、TCNTBn值將被裝入內部寄存器TCMPn、TCNTn。在定時器n的工作頻率下,TCNTn開始減1計數,其值可以通過讀取TCNTOn得知。 3.當TCNTn值等于TCMPn值的時候,定時器n的輸出管腳TOUTn反轉;TCNTn繼續減1計數。 4.當TCNTn值為0,輸出管腳TOUTn再次反轉,并觸發定時器n中斷(中斷使能)。 5.當TCNTn值為0,如果在TCON寄存器中將定時器n設為自動加載,則TCMPBn、TCNTBn值將被自動裝入內部寄存器TCMPn、TCNTn中,進入下一個計數流程。 定時器n的輸出管腳TOUTn初始狀態為高電平,然后會兩次反轉, 也可以通過TCON寄存器設定其初始電平,這樣輸出就完全反相了。 通過設置TCMPBn、TCNTBn可以設置TOUTn輸出信號的占空比,這樣就是所謂的PWM。這里PWM的原理就不做介紹了。 下面介紹定時器的幾種重要寄存器,每一種我們都以定時器0為例。 TCFG0寄存器 [7:0],[15:8]各8位分別被用于控制預分頻器0,1,值為0~255。經過預分頻器出來的時鐘頻率為:PCLK/(prescaler+1)。 TCFG1寄存器 經過預分頻器得到的時鐘將進入2次分頻,這個寄存器就是設置2次分頻系數的。這樣定時器的工作頻率為:PCLK/(prescaler+1)/(divider value),其中prescaler=0~255,divider value=2,4,6,8。 TCFG0和TCFG1這兩個寄存器來配置定時器的頻率,即要確定TCNTOn每遞減一個數所需要的時間,它們之間是倒數的關系。具體的計算公式為: 定時器輸出時鐘頻率=PCLK ÷ (prescaler+1) ÷ divider 其中prescaler值由TCFG0決定,divider值由TCFG1決定,而prescaler只能取0~255之間的整數,divider只能取2、4、8和16。比如已知PCLK為50MHz,而我們想得到某一定時器的輸出時鐘頻率為25kHz,則依據公式可以使prescaler等于249,divider等于8。有了這個輸出時鐘頻率,理論上我們通過設置寄存器TCNTBn就可以得到任意與0.04毫秒(1÷25000×1000)成整數倍關系的時間間隔了。例如我們想要得到1秒鐘的延時,則使TCNTBn為25000(1000÷0.04)即可。 TCON寄存器 TCON寄存器位[3:0]、[11:8]、[15:12]、[19:16]、[22:20]分別用于定時器0~4,位[4]為死區使能位,[7:5]為保留位。除了定時器4沒有輸出反轉位外,其他位功能相似,這里以定時器0為例加以說明。位[0]開啟停止位:0停止定時器,1開始定時器。[1]手動更新位:0無用,1將TCNTBn/TCMPBn寄存器的值裝入內部寄存器TCNTn\TCMPn中。[2]輸出反轉:0不反轉,1反轉。[3]自動加載:0不自動加載,1自動加載。 TCNTBn/TCMPBn寄存器 TCNTOn寄存器 下面就具體介紹如何實現PWM功能。 1、PWM是通過引腳TOUT0~TOUT3輸出的,而這4個引腳是與GPB0~GPB3復用的,因此要實現PWM功能首先要把相應的引腳配置成TOUT輸出。 2、再設置定時器的輸出時鐘頻率,它是以PCLK為基準,再除以用寄存器TCFG0配置的prescaler參數,和用寄存器TCFG1配置的divider參數。 3、然后設置脈沖的具體寬度,它的基本原理是通過寄存器TCNTBn來對寄存器TCNTn(內部寄存器)進行配置計數,TCNTn是遞減的,如果減到零,則它又會重新裝載TCNTBn里的數,重新開始計數,而寄存器TCMPBn作為比較寄存器與計數值進行比較,當TCNTn等于TCMPBn時,TOUTn輸出的電平會翻轉,而當TCNTn減為零時,電平會又翻轉過來,就這樣周而復始。因此這一步的關鍵是設置寄存器TCNTBn和TCMPBn,前者可以確定一個計數周期的時間長度,而后者可以確定方波的占空比。由于s3c2440的定時器具有雙緩存,因此可以在定時器運行的狀態下,改變這兩個寄存器的值,它會在下個周期開始有效。 4、最后就是對PWM的控制,它是通過寄存器TCON來實現的,當不想計數了,可以使自動重載無效,這樣在TCNTn減為零后,不會有新的數加載給它,那么TOUTn輸出會始終保持一個電平(輸出反轉位為0時,是高電平輸出;輸出反轉位為1時,是低電平輸出),這樣就沒有PWM功能了,因此這一位可以用于停止PWM。 S3C2440 定時器總結: 定時器0配置步驟:(其他的也類似) 1.配置TCFG0,第一級分頻系數 2.配置TCFG1,第二級分頻系數 3.配置TCNTB0,定時器計數初始值 4.配置TCON0,啟動定時器和更新定時器計數值 如果有中斷: 5.向中斷向量表timer0安裝中斷服務函數 6.使能定時器中斷,INTMSK

    時間:2017-12-19 關鍵詞: 定時器 中斷 嵌入式處理器 arm筆記

  • 駱駝精講單片機系列:單片機學習,單片機案例分析集錦

    駱駝精講單片機系列:單片機學習,單片機案例分析集錦

    與非網資深博主駱駝,有著多年的單片機開發經驗。結合他本人的從業經驗,駱駝為廣大網友奉獻了很多單片機學習的案例分享博文。相信對于有志于學好單片機的網友來說,這篇集錦肯定會受益匪淺!為什么學習單片機做一個程序員特別是一個單片機程序員需要的知識并不是單片機知識,而是行業知識。只有將行業知識與單片機知識結合起來才能發揮更大的價值...單片機之基礎結構計劃以STC89系列產品作為參考,結構與標準的c51結構非常相似。我們以STC89C51RC-RD+產品手冊作為參考來了解一個c51單片機的基本結構。我們一起來瀏覽一下這個手冊。如果你在這款單片機上學習。那么應該經常查閱這個手冊...單片機之內存結構現在的8位單片機發展已經非常成熟。現在有一個概念是“片上系統(SOPC)”,除了電源,將所有的功能集成在一塊芯片中實現。使系統設計變得非常簡單,大大縮小硬件的體積、降低成本和功耗。如果您見過使用很早的老型號C51單片機就直達區別了...單片機之I/O管腳IO就輸入/輸出的意思。單片機通過IO管腳與外界其他電路通訊。AT89S52應該是標準單片機,具有P0-P4合計4組IO,每組IO有8個管腳。以后一些其他廠家基本按照這個規范生產產品。我們隨便找一個C51的單片機看看...小試牛刀:流水燈設計這是單片機入門的課程,在任何一本C51的入門的書本中都在介紹。也就是您非常容易找到各種流水燈的代碼來研究。但是既然是寫一個系列的入門資料。不妨我們也來寫一段,非常簡單...單片機之定時器(一)在很早以前,我開始學習C51時使用的是周立功的“dp51+pro”學習板。在流水燈實驗中采用了定時器。周立功的書價值還是很高的。當時告訴了很多人C51是怎么一回事。其價值應該與譚浩強可以相提并論...定時器如何實現流水燈設計使用定時器來實現流水燈的好處是定時非常準確。因為定時器依據時鐘。而且我們看到主程序是空的。也就是說在主程序可以完成其他事情...單片機之定時器(二)如果單片機定時器精度和最長時間都是由晶振、指令周期、定時器的長度決定的。指令周期在某種角度上來說與晶振是同一個意義...單片機之串口只要是C51的MCU都有標準的串口---UART.什么是串口,這是針對并口來說的。如果大家需要了解可以查看一下74L164等串轉并芯片了解一下。或者同時了解一下I2C、SPI等接口。凡事大概了解一下,有一個感性的認識即可...單片機之串口全雙工MCU接收數據是隨機的。發送數據是預知的。這個是什么意思?通俗的說其他設備向單片機什么時候發送數據,它當然是不知道的。但是單片機什么時候向其他設備發送數據的,這個單片機是知道的...單片機之串口雙機通訊(一)單片機的串口作用非常重要,如果您設計需要也上位機(PC)通訊,最放方便的還是串口。因為PC本身就有串口,不需要寫任何驅動...單片機之串口雙機通訊(二)我們來討論一個單片機雙機通訊程序,例子很簡單就是兩個單片機之間簡單的通訊。在去年工作期間一位做硬件的同事問我什么通訊協議,我竟然不知道該怎么回答他。簡單就是說應該兩個單片機之間通訊報文的編碼和解碼的方式...單片機之串口通訊變長協議編寫上一節我們簡單的介紹了一種定長通訊協議編寫,這種協議有其優點,就是實現方法簡單。因為只要接收到一個包頭,只需節后到n個字節即可判斷一幀數據接收完成。但是這種協議的缺點很明顯,就是不能容納太多的數據。所以這一節我來討論一個變長協議的編寫...單片機之AD轉換在很早以前,也就是2006年的時候,我見過一個電子稱點設計電路板。最核心就是一個AD轉換的電路。AD芯片是獨立的,就是將壓力傳感器的輸出的電壓信號轉換10bit數字信號,單片機讀取該10bit的數字信號。換算出重量...單片機之AD的應用上一節我們介紹一個角度傳感器信號數據讀取,這一節我們來介紹程序的代碼。雖然已經形成產品,但是因為非常簡單。所以我把代碼上傳了上來。如果您從業不到一年,也許有借鑒作用。如果您從業已經一年以上,可能也沒啥用處了...單片機之外部中斷外部中斷在單片機中占有很重要的作用。而且外部中斷的優先級默認是最高的。平臺單片機一般有兩個外部中斷---INT0、INT1。中斷的使用方法和前面 討論的定時器的方法相似,不一樣的是觸發的條件不同,定時器中斷是計數器從0XFFFF增加0x0000時 TF置1,外部中斷觸發條件是INT管腳電平變化。有電平下跳沿和低電平觸發兩種配置方式...階段性總結:一個簡單頻率測量單位由一個信號源的項目,其中由一個功能,即實現一個方波信號頻率的測量。實際情況中,信號的頻率一般在15-25Hz。占空比在10%-90%之間。可 以說頻率非常低。因為單位使用STC89C54的時間比較長,所以單位要求使用該單片機。這個項目非常簡單。因為時間很久了,所以我稍微回憶一下...駱駝的更多專業分享,您可以關注:http://www.eefocus.com/luo_xinli/blog/ 。希望能有更多博友在與非博客分享您的專業知識和觀點,小編qq 406039590,愿與您共同成長。更多關于單片機的技術資訊,歡迎訪問 與非網單片機技術專區

    時間:2018-06-20 關鍵詞: C51 ad 定時器 單片機學習 嵌入式處理器 串口 與非博客

  • 學習單片機不可欠缺的八大步驟

    學習單片機不可欠缺的八大步驟

    學習使用單片機就是理解單片機硬件結構,以及內部資源的應用,在匯編或C語言中學會各種功能的初始化設置,以及實現各種功能的程序編制。第一步:數字I/O的使用使用按鈕輸入信號,發光二極管顯示輸出電平,就可以學習引腳的數字I/O功能,在按下某個按鈕后,某發光二極管發亮,這就是數字電路中組合邏輯的功能,雖然很簡單,但是可以學習一般的單片機編程思想,例如,必須設置很多寄存器對引腳進行初始化處理,才能使引腳具備有數字輸入和輸出輸出功能。每使用單片機的一個功能,就要對控制該功能的寄存器進行設置,這就是單片機編程的特點,千萬不要怕麻煩,所有的單片機都是這樣。第二步:定時器的使用學會定時器的使用,就可以用單片機實現時序電路,時序電路的功能是強大的,在工業、家用電氣設備的控制中有很多應用,例如,可以用單片機實現一個具有一個按鈕的樓道燈開關,該開關在按鈕按下一次后,燈亮3分鐘后自動滅,當按鈕連續按下兩次后,燈常亮不滅,當按鈕按下時間超過2s,則燈滅。數字集成電路可以實現時序電路,可編程邏輯器件(PLD)可以實現時序電路,可編程控制器(PLC)也可以實現時序電路,但是只有單片機實現起來最簡單,成本最低。定時器的使用是非常重要的,邏輯加時間控制是單片機使用的基礎。第三步:中斷單片機的特點是一段程序反復執行,程序中的每個指令的執行都需要一定的執行時間,如果程序沒有執行到某指令,則該指令的動作就不會發生,這樣就會耽誤很多快速發生的事情,例如,按鈕按下時的下降沿。要使單片機在程序正常運行過程中,對快速動作做出反應,就必須使用單片機的中斷功能,該功能就是在快速動作發生后,單片機中斷正常運行的程序,處理快速發生的動作,處理完成后,在返回執行正常的程序。中斷功能使用中的困難是需要精確地知道什么時候不允許中斷發生(屏蔽中斷)、什么時候允許中斷發生(開中斷),需要設置哪些寄存器才能使某種中斷起作用,中斷開始時,程序應該干什么,中斷完成后,程序應該干什么等等。中斷學會后,就可以編制更復雜結構的程序,這樣的程序可以干著一件事,監視著一件事,一旦監視的事情發生,就中斷正在干的事情,處理監視的事情,當然也可以監視多個事情,形象的比喻,中斷功能使單片機具有吃著碗里的,看著鍋里的功能。以上三步學會,就相當于降龍十八掌武功,會了三掌了,可以勉強護身。第四步:與PC機進行RS232通信單片機都有USART接口,特別是MSP430系列中很多型號,都具有兩個USART接口。USART接口不能直接與PC機的RS232接口連接,它們之間的邏輯電平不同,需要使用一個MAX3232芯片進行電平轉換。USART接口的使用是非常重要的,通過該接口,可以使單片機與PC機之間交換信息,雖然RS232通信并不先進,但是對于接口的學習是非常重要的。正確使用USART接口,需要學習通信協議,PC機的RS232接口編程等等知識。試想,單片機實驗板上的數據顯示在PC機監視器上,而PC機的鍵盤信號可以在單片機實驗板上得到顯示,將是多么有意思的事情啊!第五步:學會A/D轉換MAP430單片機帶有多通道12位A/D轉換器,通過這些A/D轉換器可以使單片機操作模擬量,顯示和檢測電壓、電流等信號。學習時注意模擬地與數字地、參考電壓、采樣時間,轉換速率,轉換誤差等概念。使用A/D轉換功能的簡單的例子是設計一個電壓表。第六步:學會PCI、I2C接口和液晶顯示器接口這些接口的使用可以使單片機更容易連接外部設備,在擴展單片機功能方面非常重要。第七步:學會比較、捕捉、PWM功能這些功能可以使單片機能夠控制電機,檢測轉速信號,實現電機調速器等控制起功能。如果以上七步都學會,就可以設計一般的應用系統,相當于學會十招降龍十八掌,可以出手攻擊了。第八步:學習USB接口、TCP/IP接口、各種工業總線的硬件與軟件設計學習USB接口、TCP/IP接口、各種工業總線的硬件與軟件設計是非常重要的,因為這是當前產品開發的發展方向。到此為止,相當于學會15招降龍十八掌,但還不到打遍天下無敵手的境界。即使如此,也算是單片機大蝦了。

    時間:2018-06-20 關鍵詞: 定時器 單片機 中斷 嵌入式處理器 usart 數字i/o

  • AVR單片機定時器的要點

    分5種工作類型  一 普通模式 wgm1=0跟51的普通模式差不多,有tov1溢出中斷標志,發生于max(0xffff)時  1采用內部計數時鐘用于 icp捕捉輸入場合——-測量脈寬/紅外解碼(捕捉輸入功能可以工作在多種模式下,而不單單只是普通模式)  2 采用外部計數脈沖輸入 用于 計數,測頻其他的應用,采用其他模式更為方便,不需要像51般費神  二 ctc模式 [比較匹配時清零定時器模式] wgm1=4,12跟51的自動重載模式差不多  1 用于輸出50%占空比的方波信號  2 用于產生準確的連續定時信號wgm1=4時, 最大值由ocr1a設定,top時產生ocf1a比較匹配中斷標志wgm1=12時,最大值由icf1設定, top時產生icf1輸入捕捉中斷標志  如果top=max,top時也會產生tov1溢出中斷標志  注:wgm=15時,也能實現從oc1a輸出方波,而且具備雙緩沖功能  計算公式: focn=fclk_io/(2*n*(1+top))變量n 代表預分頻因子(1、8、64、256、1024),t2多了(32、128)兩級。  3 快速pwm模式 wgm1=5,6,7,14,15單斜波計數,用于輸出高頻率的pwm信號(比雙斜波的高一倍頻率)都有tov1溢出中斷,發生于top時[不是max,跟普通模式,ctc模式不一樣]比較匹配后可以產生ocf1x比較匹配中斷.  wgm1=5時, 最大值為0x00ff, 8位分辨率  wgm1=6時, 最大值為0x01ff, 9位分辨率  wgm1=7時, 最大值為0x03ff,10位分辨率  wgm1=14時,最大值由icf1設定, top時產生icf1輸入捕捉中斷 (單緩沖)  wgm1=15時,最大值由ocr1a設定,top時產生ocf1a比較匹配中斷(雙緩沖,但oc1a將沒有pwm能力,最多只能輸出方波)改變top值時必須保證新的top值不小于所有比較寄存器的數值  注意,即使ocr1a/b設為0x0000,也會輸出一個定時器時鐘周期的窄脈沖,而不是一直為低電平  計算公式:fpwm=fclk_io/(n*(1+top))  4 相位修正pwm模式 wgm1=1,2,3,10,11雙斜波計數,用于輸出高精度的,相位準確的,對稱的pwm信號都有tov1溢出中斷,但發生在bootom時比較匹配后可以產生ocf1x比較匹配中斷.  wgm1=1時, 最大值為0x00ff, 8位分辨率  wgm1=2時, 最大值為0x01ff, 9位分辨率  wgm1=3時, 最大值為0x03ff,10位分辨率  wgm1=10時,最大值由icf1設定, top時產生icf1輸入捕捉中斷 (單緩沖)  wgm1=11時,最大值由ocr1a設定,top時產生ocf1a比較匹配中斷(雙緩沖,但oc1a將沒有pwm能力,最多只能輸出方波)改變top值時必須保證新的top值不小于所有比較寄存器的數值可以輸出0% ̄100%占空比的pwm信號若要在t/c 運行時改變top 值,最好用相位與頻率修正模式代替相位修正模式。若top保持不變,那么這兩種工作模式實際沒有區別  計算公式:fpwm=fclk_io/(2*n*top)  5 相位與頻率修正pwm模式 wgm1=8,9雙斜波計數,用于輸出高精度的、相位與頻率都準確的pwm波形都有tov1溢出中斷,但發生在bootom時比較匹配后可以產生ocf1x比較匹配中斷.  wgm1=8時,最大值由icf1設定, top時產生icf1輸入捕捉中斷 (單緩沖)  wgm1=9時,最大值由ocr1a設定,top時產生ocf1a比較匹配中斷(雙緩沖,但oc1a將沒有pwm能力,最多只能輸出方波)相頻修正修正pwm 模式與相位修正pwm 模式的主要區別在于ocr1x 寄存器的更新時間改變top值時必須保證新的top值不小于所有比較寄存器的數值可以輸出0% ̄100%占空比的pwm信號使用固定top 值時最好使用icr1 寄存器定義top。這樣ocr1a 就可以用于在oc1a輸出pwm 波。但是,如果pwm 基頻不斷變化(通過改變top值), ocr1a的雙緩沖特性使其更適合于這個應用。  計算公式:fpwm=fclk_io/(2*n*top)  

    時間:2019-03-18 關鍵詞: 定時器 單片機 AVR 嵌入式處理器 要點

  • SUNPLUS為變頻馬達控制市場引入定時器增強型單片機

    SUNPLUS 新近推出的SPMC75芯片是凌陽unSP系列的中一款器增強型。最大的特點是其集成了功能強大的器(PDC、MCP、TPM),在這幾種器的支持下,SPMC75在變頻電機驅動、、電源逆變等領域有廣闊的應用前景。 對于國內變頻工控的生產企業來講,傳統的變頻馬達控制芯片很難做到在芯片性能和芯片價格上達到一個最佳的平衡點,此次臺灣凌陽科技推出的16位工業控制MCU —SPMC75芯片,應該說給整個變頻工控領域帶來一種全新的選擇。相對于國外廠家同型號的16位微控制芯片,SPMC75芯片擁有極強的抗干擾能力和處理能力、豐富的定時器和強大的捕獲比較功能,32 KW 內嵌,2 kW RAM為二次設計開發留有充足內部空間,而且SPMC75芯片開發方便,支持程序的在線仿真和在線下載功能,僅僅配合凌陽提供的功能強大且方便易用的在線調試器(USB ),就能夠進行方便地在線編輯、調試和下載。而對于SPMC75芯片的銷售價格據了解相對于同型號廠家的芯片價格將更具競爭力。 目前SPMC75系列芯片已可供貨,可提供多種封裝形式 、、LQFP44、42等等,同時免費提供編輯環境(unSP IDE)及電機調試工具(DMC )方便客戶進行高效的產品設計。

    時間:2019-03-27 關鍵詞: 定時器 單片機 馬達 增強型 嵌入式處理器

  • 基于定時器/計數器的實時時鐘的設計

    基于定時器/計數器的實時時鐘的設計

    1.實現實時時鐘的基本思想 時鐘的最小計時單位是秒,如何獲得1s的定時時間呢?使用定時器方式1,最大的定時時間也只能達到131 ms。可將定時器的定時時間定為100 ms,采用中斷方式進行溢出次數的累計,計滿10次,即得到秒計時。而計數10次可用循環程序的方法實現。 時鐘運行時,在片內RAM中規定3個單元作為秒、分、時單元,具體安排如下; 42H:“秒”單元;41H“分”單元;40H:“時”單元 從秒到分,從分到時是通過軟件累加并進行比較來實現的。要求每滿1秒,則“秒”單元42H中的內容加1;“秒”單元滿60,則“分”單元41H中的內容加1;“分”單元滿60,則“時”單元40H中的內容加1;“時”單元滿24,則將42H、41H、40H的內容全部清0。 2.程序設計 (1)主程序的設計。主程序的主要功能是進行定時器T0的初始化,并啟動T0,然后通過反復調用顯示子程序,等待100 ms定時中斷的到來。主程序的流程如右圖所示。 (2)中斷服務程序的設計。中斷服務程序(IT0P)的主要功能是實現秒、分、時的計時處理。 中斷服務程序的流程如左圖所示。   參考程序如下:  

    時間:2018-03-12 關鍵詞: 嵌入式開發 定時器 計數器 實時時鐘

  • 高壓看門狗定時器提高車載系統安全性

    高壓看門狗定時器提高車載系統安全性

    汽車設計中,越來越多的電子系統正在逐步替代機械功能——從引擎定時控制到剎車、方向盤控制,而電子系統相對容易發生故障,這就需要謹慎考慮系統的安全性,確保系統具備較高的故障容限。不應該在發生單點故障時將司機或乘客至于危險處境,至少能夠使汽車“跛行”到大路以外或最近的維修站。當電子設備發生故障時,為確保汽車的安全行駛需要利用監控電路開啟備份電路,安全地接管系統操作。  在純機械系統的汽車時代,引擎依照機械方式產生的信號點燃空氣燃料混合器。機械分配器則選擇適當的火花塞,沿線傳遞信號。剎車系統則將作用在踏板上的壓力通過剎車軸、剎車總泵、液壓管傳送到制動鉗。離合器和油門只是簡單地受控于連接在踏板上的一條鋼纜。方向盤通過一個金屬舵輪、轉向軸、轉向齒輪箱以及轉向傳動裝置,控制車輪的轉角。引擎控制也不同于我們如今使用的高度可靠的電子控制單元(ECU),它沒有計算機輔助剎車系統、離合器、油門或操縱系統。當然,也不需要考慮?C失效、控制單元短路等狀況,出現故障失效的因素主要是機械裝置。但是,由于人們非常信任機械設備的可靠性,也很少考慮系統備份或故障容限問題。當然,一旦系統的某個裝置出現故障,則很容易發生危險,即便沒有發生危險,汽車也只能被拋錨在出事地點,不得不求助拖車將汽車拖至維修中心。  為了提高汽車駕駛的舒適度和便利性,汽車制造商需要為汽車提供電子裝備,已獲得更高效率、更清潔的環境以及更高的汽車行駛安全性。早期的ECU只能在發生故障時停止運行,特別是電子裝置的工作取決于?C。如果?C失效時沒有備用方案來避免發生危及生命的事故,對于用戶和制造商都是無法接受的;設計中至少需要采用備用系統,將汽車就近行駛到維修站,由此,人們對故障容限的關注程度也迅速提高。根據實際需求,許多MCU開始配備“跛行回家”管理模式。  跛行回家管理模式  “跛行回家”模式指的是ECU內部的一種冗余功能,在物理架構上這是完全獨立的一部分電路,可以從待機模式下開啟進入失效保護狀態。這一模式允許汽車在發生電子系統失效時駛出道路,雖然不能保持原有的行駛性能,但可以確保安全。  新一代引擎ECU都帶有.件,例如:看門狗定時器,用于測試ECU運轉是否正常。一旦檢測到工作異常,發現電子裝置或?C失效(軟件運行故障),.件將開啟“跛行回家”控制模式。例如,當汽車引擎故障燈點亮,汽缸只注入一半的燃料給發動機,此時引擎產生非常低的熱量,但能夠以適中的速度開動汽車,借助剛好支持汽車行駛的能量將汽車開回家或開到汽車維修中心。  另外一個好的案例是新型汽車中的“車身控制計算機”,能夠控制車窗升降、前車燈/尾燈、轉向燈以及擋風玻璃的雨刷、汽車的自動換檔控制。監控電路對ECU的工作狀況進行監測,發生電路單元或?C工作故障時,將激活待機電路,降級行駛,例如:降低遠光燈、尾燈/剎車燈的亮度,或者只保持第二檔行駛。當然,這種狀況下限制了汽車的最高速度,但汽車仍然保持工作,能夠以“跛行回家”模式安全行駛,把車開到維修廠。  冗余  計算機控制應用稱為“電控操作”,動力系統內部和外部絕大多數機械控制系統已經由機電控制所替代。例如,相互連接的ECU電控裝置已經替代了方向盤到車輪之間的所有機械單元。司機移動的方向盤位置將被檢測并轉換成數字電子信號,傳送給智能化機電傳動裝置,最終控制車輪動作。  電控剎車裝置也采用汽車計算機、伺服電機或機電制動鉗替代了早期的剎車軸、剎車總泵等單元。一般意義上講,這些系統對安全性的要求更高,因而對故障容限的要求也更高。  工程師在這些應用中設計了備份電路,構建完整的冗余電子控制和監控單元,冗余系統在物理結構上應該完全獨立于主控單元,始終確保系統提供有效、安全的電控單元。ECU監控電路保持主系統的連續監測,必要時可靠地切換到備份系統。  高壓看門狗的優勢  考慮到安全性問題,汽車電子系統需要監控電路監測故障容限或安全性。MAX16997/MAX16998看門狗定時器可理想滿足這類需求,通過對微控制器(?C)正常工作條件下產生的周期脈沖進行檢測,偵測電路或?C的失效狀態,一旦發生故障可立即切換到備份/冗余系統。  MAX16997/MAX16998具有超時和窗式看門狗監測功能,器件帶有看門狗觸發器輸入(WDI),提供漏極開路?C 復位輸出(RESET)和漏極開路冗余系統使能輸出(ENABLE)。  對于MAX16998,復位門限可以由介于低壓電源(例如:?C電源)、外部電壓監測輸入(RESETIN)和GND之間的外部電阻分壓器(圖1所示)設置。MAX16997可以在使能輸入端(EN)讀取KL15 (點火開關)的狀態,在汽車啟動后使能內部的監控定時器(圖2)。這時,看門狗的超時周期延長到標稱周期的8倍,為?C留出足夠的開啟時間。圖1:MAX16998高壓看門狗定時器采用獨立的下游低壓電源(LDO)供電,為電池短路保護提供安全保護屏障,從而使器件能夠在故障條件下可靠地切換到冗余電路。圖2:類似于MAX16998,MAX16997能夠在故障狀態下安全地切換到冗余電路。它還具有高電平有效使能輸入(EN),用于開啟或關閉看門狗定時器。  可以利用外部電容(分別置于SRT和SWT輸入)獨立設置復位延時(MAX16998)和看門狗超時,看門狗窗口監測可以由工廠預置在可調節看門狗定周期的50%或75%。  18?A (典型值)超低工作電流使得MAX16997/MAX16998在汽車ECU應用中非常重要,因為這些電路始終處于開啟狀態。另外,這些器件提供3mm x 3mm、8引腳?MAX?封裝,確保工作在-40°C至+125°C汽車級溫度范圍。  這些IC直接采用12V汽車電池供電,可以承受高達45V的電壓瞬變(IN和ENABLE引腳),而典型的看門狗定時器則是采用下游的低壓電源(例如,5V)供電。因此,即使在下游電路斷電或發生與地短路時,MAX16997/MAX16998也能保持工作并且安全地切換到冗余電路(通過觸發ENABLE引腳)。為了使這些器件能夠支持更高的故障容限,器件在RESET、WDI、EN和RESETIN引腳提供故障保護,能夠承受20V的電壓(圖1和圖2)。由此可以看出,這些電路也提供了一個可靠的保護屏障,避免受下游電路故障失效的影響,備份電路應該從物理層面獨立于“常規”控制電路,發生故障時能夠安全地切換到備份模式。  MAX16997/MAX16998時序  上電后,當RESETIN引腳電壓(VRESETIN)高于上電復位門限(VPON)時,RESET將在復位時間(tRESET)內持續保持低電平,隨后便為高電平。同時,看門狗定時器開始計時(tWP)。如果在規定的開放時間窗口(tOW)內沒有產生WDI觸發信號,RESET將被再次置為低電平,復位?C。如果在連續的三次觸發中,觸發信號均處于關閉窗口(tCW)或在看門狗周期(tWP)結束之后,ENABLE信號將被置低。如果在連續的三次看門狗觸發信號中,WDI觸發信號又重新回到開放的看門狗周期窗口內(tWDI),ENABLE將重新回到高電平,系統切換到正常工作模式(圖3)。圖3:MAX16998時序圖(窗式看門狗)。  看門狗超時與窗式看門狗  MAX16997/MAX16998A提供標準的看門狗超時周期,而MAX16998B/D則提供窗式看門狗功能(圖4)。根據實際應用對安全等級的要求選擇不同類型的器件,調整看門狗超時確保在看門狗定時周期內將定時器清零,否則器件將產生復位信號。由此,可以利用這些看門狗檢測程序運行的失效狀態,例如,程序運行過緩或者是數字時鐘(例如,晶振產生的時鐘)速率降低;而窗式看門狗則需確保定時器在規定的時間窗口內將定時器清零,由此,它們可以檢測到一些額外的故障,例如,程序運行過快或時鐘過快,可以支持更高的安全等級。圖4:MAX16998看門狗定時周期(窗式看門狗)。  圖4中的第三種情況說明了在規定的時間窗口內觸發WDI的情況;第1種情況則是錯誤地觸發了WDI,信號過早地觸發WDI從而產生故障指示,導致故障發生的原因是程序運行過快或振蕩器時鐘頻率加快;第2種情況也是錯處觸發WDI的一種表現——看門狗觸發信號輸出延時過大,表明程序運行過緩或振蕩器時鐘頻率變慢。  本文小結  故障容限和汽車安全性成為汽車電子設計的關鍵因素,為了提高汽車工作效率,改善舒適度并降低風險,需要高效管理系統的各個單元:硬件、軟件、傳感器、受動裝置和操作單元。高壓看門狗定時器(如:MAX16997/MAX16998)為達到這一目標起到了關鍵作用。

    時間:2018-10-11 關鍵詞: 安全性 嵌入式開發 定時器 看門狗 高壓

  • MSP430單片機中的看門狗定時器研究

    MSP430單片機中的看門狗定時器研究

      引 言  軟件的可靠性一直是一個關鍵問題。任何使用軟件的人都可能會經歷計算機死機或程序跑飛的問題,這種情況在嵌入式系統中也同樣存在。由于單片機的抗干擾能力有限,在工業現場的儀器儀表中,常會由于電壓不穩、電弧干擾等造成死機。在水表、電表等無人看守的情況下,也會因系統遭受干擾而無法重啟。為了保證系統在干擾后能自動恢復正常,看門狗定時器(Watchdog Timer)的利用是很有價值的。  1 看門狗的作用  看門狗定時器是一個計數器,基本功能是在發生軟件問題和程序跑飛后使系統重新啟動。看門狗計數器正常工作時自動計數,程序流程定期將其復位清零,如果系統在某處卡死或跑飛,該定時器將溢出,并將進入中斷。在定時器中斷中執行一些復位操作,使系統恢復正常的工作狀態,即在程序沒有正常運行期間,如期復位看門狗以保證所選擇的定時溢出歸零,使處理器重新啟動。  2 看門狗問題及相關實驗  現今市面上流行的一些單片機,多嵌有內部WDT,如TI的MSP430系列,Philips的P87XXX和P89XXX系列,Microchip的PIC列,Atmel的AT89SXX系列和Holtek公司的Htxxx系列。但是這些內部看門狗在工作時,多存在一定的誤差。一些工程師在設計的過程中,由于忽略了這一點,導致系統出現異常。MSP430系列單片機是美國德州儀器公司(TI)近幾年開發的新一代單片機,該系列是一款16位、具有精簡指令集、超低功耗的全新概念混合型單片機。在眾多單片機系列中,由于它具有極低的功耗、豐富的片內外設和方便靈活的開發手段,已成為一顆耀眼的新星。其內部自帶看門狗及復位電路,理論上如果程序跑飛,可用看門狗將其復位。但在實際使用過程中,發現看門狗的作用并非萬無一失,以下實驗證明了這一點。  實驗電路如圖1所示。    實驗程序清單:  #include   void main(void){  P1DIR l=0x0f; //設置P1.2~P1.0為輸出  for(;;){  volatile unsigned int i;  WDTCTL=WDTPW+ WDTCNTCL;  //復位WDT計數器  PIOUT==0x0t; //P1.0~P1.2相互異或  i=5000; //延時  d0(i--);  while(i!=0);  }  }  上述實驗啟動后,如果程序正常運行,LED會閃爍。缺省時,MSP430的看門狗是允許狀態,所運行的程序會不斷地訪問看門狗。理論上,這個系統是不會發生啟動失敗的,因為即使啟動失敗,看門狗也應該在數百毫秒內啟動,復位整個系統。基于這種思想,對單片機的復位進行測試。K2斷開,用K1連續產生。Reset信號,測試看門狗使系統重啟的成功率。K2閉合,則reset端高電平,理論上K1不能有效產生復位脈沖,觀察看門狗是否起作用。  3 實驗結果與分析  實驗結果如下:K2斷開,連續開關K1,上電重啟系統,平均155次失敗1次(LED不閃),即看門狗失效概率0.6%;K2閉合,連續開關K1,平均18次失敗1次(LED不閃),且一旦失敗,將連續失敗下去,看門狗無效率占到了約5.5%。  另外,當采用同樣具有內置看門狗的其他系列單片機替代實驗中的MSP430,啟動程序段作相應修改時,實驗結果仍大致相同,這說明具有內置看門狗的單片機面臨的問題是相同的。經分析可能有如下原因:  ①由于看門狗的時鐘不獨立,計數時鐘與系統為同一分頻鏈路,因此看門狗不能在系統出現問題時有效運作。  ②由于時鐘可用軟件設置,啟動失敗時,開機時鐘可能處于空檔,沒有時鐘看門狗不能生效。  ③有些看門狗需要用軟件設置或啟動,因此啟動失敗后,初始化程序沒有激活,CPU可能跳轉到隨機代碼,使看門狗被禁止。這樣的看門狗是需要有可靠的上電復位作保證的,因此,從理論上講,原設計存在著不合理性。基于上述分析,采用片外看門狗專用芯片TPS3823由獨立的分頻振蕩電路提供計數脈沖。實驗電路如圖2所示。    上述電路中,TPS3823輸出定時溢出信號給Reset端。程序段中,CPU要不斷地通過I/O口輸出喂狗信號,使看門狗計數器清零。在此電路中重復上述試驗中K1、K2的相同動作,系統重啟成功率達到100%。  結 語  未來的內置看門狗必須有獨立可靠的時鐘。系統上電后,看門狗即為允許狀態,無需軟件設置,它只能被外部硬件跳線或內部熔絲(fuse)所禁止。目前,如果要求設計可靠性較高的嵌入式系統,外置看門狗是必須考慮的。內置看門狗的另一問題是系統復位后,程序應判斷是由Reset端正常上電復位,還是程序跑飛看門狗所致,由此確定現場數據是否應該保留。這也是在看門狗應用中所應考慮的。  作者:上海電機學院 章銳

    時間:2019-03-12 關鍵詞: 嵌入式開發 定時器 看門狗 機中

  • 單片機產生隨機數的兩種方法

    隨機數在單片機的應用中也是很多的,當然產生隨機數的方法有很多,當中有一個就是利用單片機定時器,取出未知的定時器THX和TLX的值,再加以運算得到一個規定范圍內的隨機數值。這做法也是可行的。或者預先寫好一個隨機數表,然后進行取數據。也是可以的。 KEIL里面產生隨機數的函數確實是rand(),但頭文件是stdlib.h,不是time.h。C語言提供了一些庫函數來實現隨機數的產生。C語言中有三個通用的隨機數發生器,分別為 rand函數, random函數, randomize 函數;但是rand函數產生的并不是真意正義上的隨機數,是一個偽隨機數,是根據一個數,稱之為種子,為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公布,從而相當于產生了隨機數,但這不是真正的隨機數,當計算機正常開機后,這個種子的值是定了的,除非破壞了系統,為了改變這個種子的值,C提供了srand()函數,它的原形是void srand( int a);在調用rand函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。一般用for語句來設置種子的個數。 單片機產生隨機數的兩種方法 方法一:定時器直接隨機取值 每按一次按鍵生成一個隨機數,這個隨機數實際是把定時器的值給取出來了,并不能算絕對的隨機、方法二才是真正意義上的隨機。 方法二:用定時器加rand()隨機函數來實現 單片機上電之后通過按鍵去啟動取隨機數,若是單片機上電就立即取隨機數的話,那每次上電隨機的結果都是一樣的。然后是0 到9不重復的隨機數,程序中用了循環來判斷是否和前面取的隨機數相同,相同則進入,下次取隨機數,不同則存入數組。 本文是資深工程師分享的單片機C語言如何產生隨機數的方法,歡迎廣大工程師評論留言討論,一起分享知識、成長和進步。

    時間:2018-12-27 關鍵詞: 嵌入式開發 定時器 單片機 C語言

  • ST低成本MCU增加增強型定時器和接口外設

    意法半導體(st)宣布,該公司的低成本st7lite微控制器家族增加一個新的8位閃存微控制器系列產品,新系列產品在現有的st7lite功能基礎上又新增了一個嵌入式外設。這個代號為st7flite3的mcu在20引腳的封裝內引入一個12位的自動重加載定時器和一個主/從linsci異步接口,這標志新產品在通信和控制功能上前進了一大步,新產品適用于實時、工業設備、消費電子和電機控制器應用。   針對pwm信號不能重疊的電機控制應用中的半橋驅動模式,新的12位的定時器提供四個獨立的“死時生成可編程”的pwm(脈寬調制)輸出通道、一個2khz到4mhz的頻率范圍、可編程的占空比、極性控制和可編程輸出模式。嵌入式硬件linsci異步串行接口使lin(本地互連網絡)總線在汽車、工業和家電市場的應用得以順利實現,st獨有的linsci是一個硬件增強型sci端口,用于簡化軟件設計,通過降低cpu開銷提高系統性能。lin通常用于低端汽車的智能傳感器與致動器之間的通信,但是,因為能夠降低寫操作的復雜性,它在工業和消費電子系統中越來越受到歡迎。   st7flite3系列配有整套的軟硬件開發工具,在這些工具中,有的是st開發的,也有的是第三方廠商設計的。低成本開發工具,例如,st的stick programmer和raisonance的st7flite-sk/rais,使開發人員能夠快速、高效地創建和調試低成本的基于mcu的系統,這些工具很容易集成cosmic和metrowerks的編譯器,以及免費的st7軟件庫。   其它的片上功能包括一個高精度1mhz的內部振蕩器、一個內建運算放大器的快速10位模數轉換器,以及一個可調諧的內建低壓檢測功能的復位電路,因為實現這些功能不再需要外部電路,這些片上功能簡化了系統設計,降低了制造成本。8kb的擴展閃存因為工作在單電源電壓下,所以降低了電路板的復雜性,同時提供了快速編程功能。   st的st7lite系列是一個全系列的入門級8位閃存微控制器,專門為成本敏感的應用設計。在產品的每個周期階段,從構建原型到投產,該系列產品表現出極高的靈活性,同時能夠降低制造商的擁有成本,縮短產品的上市時間。所有mcu都使用相同的單電壓閃存技術,編程都使用相同的技術和工具。   st7flite3目前采用20引腳的so20和dip20封裝,訂購10000件的單價為1.30美元。

    時間:2018-11-08 關鍵詞: 定時器 增強型 外設 低成本 總線與接口

  • 如何快速理解和掌握一款新的MCU?

    任何一款MCU,其基本原理和功能都是大同小異,所不同的只是其外圍功能模塊的配置及數量、指令系統等。對于指令系統,雖然形式上看似千差萬別,但實際上只是符號的不同,其所代表的含義、所要完成的功能和尋址方式基本上是類似的。因此,對于任何一款MCU,主要應從如下的幾個方面來理解和掌握: MCU的特點 要了解一款MCU,首先需要知道就是其ROM空間、RAM空間、IO口數量、定時器數量和定時方式、所提供的外圍功能模塊(Peripheral Circuit)、中斷源、工作電壓及功耗等等。 了解這些MCU Features后,接下來第一步就是將所選MCU的功能與實際項目開發的要求的功能進行對比,明確那些資源是目前所需要的,那些是本項目所用不到的。對于項目中需要用到的而所選MCU不提供的功能,則需要認真理解MCU的相關資料,以求用間接的方法來實現,例如,所開發的項目需要與PC機COM口進行通訊,而所選的MCU不提供UART口,則可以考慮用外部中斷的方式來實現; 對于項目開發需要用到的資源,則需要對其Manua*進行認真的理解和閱讀,而對于不需要的功能模塊則可以忽略或瀏覽即可。對于MCU學習來講,應用才是關鍵,也是最主要的目的。 明確了MCU的相關功能后,接下來就可以開始編程了。對于初學者或初次使用此款MCU的設計者來說,可能會遇到很多對MCU的功能描述不明確的地方,對于此類問題,可以通過兩種方法來解決,一種是編寫特別的驗證程序來理解資料所述的功能;另一種則可以暫時忽略,程序設計中則按照自己目前的理解來編寫,留到調試時去修改和完善。前一種方法適用于時間較寬松的項目和初學者,而后一種方法則適合于具有一定MCU開發經驗的人或項目進度較緊迫的情況; 指令系統千萬不要特別花時間去理解。指令系統只是一種邏輯描述的符號,只有在編程時根據自己的邏輯和程序的邏輯要求來查看相關的指令即可,而且隨著編程的進行,對指令系統也會越來越熟練,甚至可以不自覺地記憶下來。 MCU的基本功能 對于絕大多數MCU,下列功能是最普遍也是最基本的,針對不同的MCU,其描述的方式可能會有區別,但本質上是基本相同的: TImer(定時器):TImer的種類雖然比較多,但可歸納為兩大類:一類是固定時間間隔的TImer,即其定時的時間是由系統設定的,用戶程序不可控制,系統只提供幾種固定的時間間隔給用戶程序進行選擇,如32Hz,16Hz,8Hz等,此類TImer在4位MCU中比較常見,因此可以用來實現時鐘、計時等相關的功能;另一類則是Programmable Timer(可編程定時器),顧名思義,該類Timer的定時時間是可以由用戶的程序來控制的,控制的方式包括:時鐘源的選擇、分頻數(Prescale)選擇及預制數的設定等,有的MCU三者都同時具備,而有的則可能是其中的一種或兩種。此類Timer應用非常靈活,實際的使用也千變萬化,其中最常見的一種應用就是用其實現PWM輸出(具體的應用,后續會有特別的介紹)。由于時鐘源可以自由選擇,因此,此類Timer一般均與Event Counter(事件計數器)合在一起; IO口:任何MCU都具有一定數量的IO口,沒有IO口,MCU就失去了與外部溝通的渠道。根據IO口的可配置情況,可以分為如下幾種類型: 純輸入或純輸出口:此類IO口有MCU硬件設計決定,只能是輸入或輸出,不可用軟件來進行實時的設定; 直接讀寫IO口:如MCS-51的IO口就屬于此類IO口。當執行讀IO口指令時,就是輸入口;當執行寫IO口指令則自動為輸出口; 程序編程設定輸入輸出方向的:此類IO口的輸入或輸出由程序根據實際的需要來進行設定,應用比較靈活,可以實現一些總線級的應用,如I2C總線,各種LCD、LED Driver的控制總線等; 對于IO口的使用,重要的一點必須牢記的是:對于輸入口,必須有明確的電平信號,確保不能浮空(可以通過增加上拉或下拉電阻來實現);而對于輸出口,其輸出的狀態電平必須考慮其外部的連接情況,應保證在Standby或靜態狀態下不存在拉電流或灌電流。 外部中斷:外部中斷也是絕大多數MCU所具有的基本功能,一般用于信號的實時觸發,數據采樣和狀態的檢測,中斷的方式由上升沿、下降沿觸發和電平觸發幾種。外部中斷一般通過輸入口來實現,若為IO口,則只有設為輸入時其中斷功能才會開啟;若為輸出口,則外部中斷功能將自動關閉(ATMEL的ATiny系列存在一些例外,輸出口時也能觸發中斷功能)。外部中斷的應用如下: 外部觸發信號的檢測:一種是基于實時性的要求,比如可控硅的控制,突發性信號的檢測等;而另一種情況則是省電的需要; 信號頻率的測量;為了保證信號不被遺漏,外部中斷是最理想的選擇; 數據的解碼:在遙控應用領域,為了降低設計的成本,經常需要采用軟件的方式來對各種編碼數據進行解碼,如Manchester和PWM編碼的解碼; 按鍵的檢測和系統的喚醒:對于進入Sleep狀態的MCU,一般需要通過外部中斷來進行喚醒,最基本的形式則是按鍵,通過按鍵的動作來產生電平的變化; 通訊接口:MCU所提供的通訊接口一般包括SPI接口,UART,I2C接口等,其分別描述如下: SPI接口:此類接口是絕大多數MCU都提供的一種最基本通訊方式,其數據傳輸采用同步時鐘來控制,信號包括:SDI(串行數據輸入)、SDO(串行數據輸出)、SCLK(串行時鐘)及Ready信號;有些情況下則可能沒有Ready信號;此類接口可以工作在Master方式或Slave方式下,通俗說法就是看誰提供時鐘信號,提供時鐘的一方為Master,相反的一方則為Slaver; UART(Universal Asynchronous Receive Transmit):屬于最基本的一種異步傳輸接口,其信號線只有Rx和Tx兩條,基本的數據格式為:Start Bit + Data Bit(7-bits/8-bits) + Parity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。一位數據所占的時間稱為Baud Rate(波特率)。對于大多數的MCU來講,數據為的長度、數據校驗方式(奇校驗、偶校驗或無校驗)、停止位(Stop Bit)的長度及Baud Rate是可以通過程序編程進行靈活設定。此類接口最常用的方式就是與PC機的串口進行數據通訊。 I2C接口:I2C是由Philips開發的一種數據傳輸協議,同樣采用2根信號來實現:SDAT(串行數據輸入輸出)和SCLK(串行時鐘)。其最大的好處是可以在此總線上掛接多個設備,通過地址來進行識別和訪問;I2C總線的一個最大的好處就是非常方便用軟件通過IO口來實現,其傳輸的數據速率完全由SCLK來控制,可快可慢,不像UART接口,有嚴格的速率要求。 Watchdog(看門狗定時器):Watchdog也是絕大多數MCU的一種基本配置(一些4位MCU可能沒有此功能),大多數的MCU的Watchdog只能允許程序對其進行復位而不能對其關閉(有的是在程序燒入時來設定的,如Microchip PIC系列MCU),而有的MCU則是通過特定的方式來決定其是否打開,如Samsung的KS57系列,只要程序訪問了Watchdog寄存器,就自動開啟且不能再被關閉。一般而言watchdog的復位時間是可以程序來設定的。Watchdog的最基本的應用是為MCU因為意外的故障而導致死機提供了一種自我恢復的能力。 MCU程序的編寫 MCU的程序的編寫與PC下的程序的編寫存在很大的區別,雖然現在基于C的MCU開發工具越來越流行,但對于一個高效的程序代碼和喜歡使用匯編的設計者來講,匯編語言仍然是最簡潔、最有效的編程語言。對于MCU的程序編寫,其基本的框架可以說是大體一致的,一般分為初始化部分(這是MCU程序設計與PC最大的不同),主程序循環體和中斷處理程序三大部分,其分別說明如下: 初始化:對于所有的MCU程序的設計來講,出世化是最基本也是最重要的一步,一般包括如下內容: 屏蔽所有中斷并初始化堆棧指針:初始化部分一般不希望有任何中斷發生; 清除系統的RAM區域和顯示Memory:雖然有時可能沒有完全的必要,但從可靠性及一致性的角度出發,特別是對于防止意外的錯誤,還是建議養成良好的編程習慣; IO口的初始化:根據項目的應用的要求,設定相關IO口的輸入輸出方式,對與輸入口,需要設定其上拉或下拉電阻;對于輸出口,則必須設定其出世的電平輸出,以防出現不必要的錯誤; 中斷的設置:對于所有項目需要用到的中斷源,應該給予開啟并設定中斷的觸發條件,而對于不使用的多余的中斷,則必須給予關閉; 其他功能模塊的初始化:對于所有需要用到的MCU的外圍功能模塊,必須按項目的應用的要求進行相應的設置,如UART的通訊,需要設定Baud Rate,數據長度,校驗方式和Stop Bit的長度等,而對于Programmer Timer,則必須設置其時鐘源,分頻數及Reload Data等; 參數的出世化:完成了MCU的硬件和資源的出世化后,接下來就是對程序中使用到的一些變量和數據的初始化設置,這一部分的初始化需要根據具體的項目及程序的總體安排來設計。對于一些用EEPROM來保存項目預制數的應用來講,建議在初始化時將相關的數據拷貝到MCU的RAM,以提高程序對數據的訪問速度,同時降低系統的功耗(原則上,訪問外部EEPROM都會增加電源的功耗)。 主程序循環體:大多數MCU是屬于長時間不間斷運行的,因此其主程序體基本上都是以循環的方式來設計,對于存在多種工作模式的應用來講,則可能存在多個循環體,相互之間通過狀態標志來進行轉換。對于主程序體,一般情況下主要安排如下的模塊: 計算程序:計算程序一般比較耗時,因此堅決反對放在任何中斷中處理,特別是乘除法運算; 實時性要求不高或沒有實時性要求的處理程序; 顯示傳輸程序:主要針對存在外部LED、LCD Driver的應用; 中斷處理程序:中斷程序主要用于處理實時性要求較高的任務和事件,如,外部突發性信號的檢測,按鍵的檢測和處理,定時計數,LED顯示掃描等。一般情況下,中斷程序應盡可能保證代碼的簡潔和短小,對于不需要實時去處理的功能,可以在中斷中設置觸發的標志,然后由主程序來執行具體的事務――這一點非常重要,特別是對于低功耗、低速的MCU來講,必須保證所有中斷的及時響應。 對于不同任務體的安排,不同的MCU其處理的方法也有所不同。例如,對于低速、低功耗的MCU(Fosc=32768Hz)應用,考慮到此類項目均為手持式設備和采用普通的LCD顯示,對按鍵的反應和顯示的反應要求實時性較高,應此一般采用定時中斷的方式來處理按鍵的動作和數據的顯示;而對于高速的MCU,如Fosc》1MHz的應用,由于此時MCU有足夠的時間來執行主程序循環體,因此可以只在相應的中斷中設置各種觸發標志,并將所有的任務放在主程序體中來執行; 在MCU的程序設計中,還需要特別注意的一點就是:要防止在中斷和主程序體中同時訪問或設置同一個變量或數據的情況。有效的預防方法是,將此類數據的處理安排在一個模塊中,通過判斷觸發標志來決定是否執行該數據的相關操作;而在其他的程序體中(主要是中斷),對需要進行該數據的處理的地方只設置觸發的標志。――這可以保證數據的執行是可預知和唯一的。

    時間:2018-07-20 關鍵詞: MCU 定時器 存儲技術 io口

  • μC/OS-II軟件定時器的分析與測試

    引 言 μC/OS-II操作系統是建立在微內核基礎上的實時操作系統,搶占式多任務、微內核、移植性好等特點,使其在諸多領域都有較好的應用。 在μC/OS-II 2.83及其以后的版本中,一個較大的變化就是增加了對軟件定時器的支持。這使得μC/OS實時操作系統的功能更加完善,在其上的應用程序開發與移植也更加方便。在實時操作系統中一個好的軟件定時器實現要求有較高的精度、較小的處理器開銷,且占用較少的存儲器資源。本文在對μC/OS-II定時器算法分析的基礎上,對定時精度和處理器占用情況進行了分析與測試,其結果在實時系統的設計與應用中具有借鑒意義。 1 定時器實現架構 在μC/OS-II操作系統內部,任務的延時功能及軟件定時器功能,都需要底層有一個硬件的計數器支持。硬件計數器以固定的頻率遞減,計數到0時,觸發時鐘中斷。這個特定的周期性的中斷稱為“時鐘節拍”。每當有時鐘節拍到來時,系統在保存現場和中斷嵌套計數加1后都會跳到時鐘節拍函數 OSTimTick()中,進行軟件計數器加1和遍歷任務控制塊,以判斷任務延時是否到時。 μC/OS-II中并未在 OSTim Tick()中進行定時器到時判斷與處理,而是創建了一個高于應用程序中所有其他任務優先級的定時器管理任務OSTmr_Task(),在這個任務中進行定時器的到時判斷和處理。時鐘節拍函數通過信號量給這個高優先級任務發信號。這種方法縮短了中斷服務程序的執行時間,但也使得定時器到時處理函數的響應受到中斷退出時恢復現場和任務切換的影響。軟件定時器功能實現代碼存放在tmr.c文件中,移植時需只需在os_cfg.h文件中使能定時器和設定定時器的相關參數。 2 μC/OS-II的軟件定時器算法分析 μC/OS-II中軟件定時器的實現方法是,將定時器按定時時間分組,使得每次時鐘節拍到來時只對部分定時器進行比較操作,縮短了每次處理的時間。但這就需要動態地維護一個定時器組。定時器組的維護只是在每次定時器到時時才發生,而且定時器從組中移除和再插入操作不需要排序。這是一種比較高效的算法,減少了維護所需的操作時間。 2.1 定時器管理所需的數據結構 一旦定時器被建立,一個定時器控制塊(OS_TMR)就被賦值了。定時器控制塊是定時器管理的基本單元,包含定時器的名稱、定時時間、在鏈表中的位置、使用狀態、使用方式,以及到時回調函數及其參數等基本信息。 在μC/OS-II軟件定時器中實現了3類鏈表的維護:   OSTmrTbl[OS_TMR_CFG_MAX]:以數組的形式靜態分配定時器控制塊所需的RAM空間,并存儲所有已建立的定時器控制塊。 OSTmrFreeLiSt:為空閑定時器控制塊鏈表頭指針。空閑態的定時器控制塊(OS_TMR)中,OSTmrnext和OSTmrPrev兩個指針分別指向空閑控制塊的前一個和后一個,組織了空閑控制塊雙向鏈表。建立定時器時,從這個鏈表中搜索空閑定時器控制塊。 OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:該數組的每個元素都是已開啟定時器的一個分組,元素中記錄了指向該分組中第一個定時器控制塊的指針,以及定時器控制塊的個數。運行態的定時器控制塊(OS_TMR)中,OSTmrnext和OSTmrPrev兩個指針同樣也組織了所在分組中定時器控制塊的雙向鏈表。定時器管理所需的數據結構示意圖如圖1所示。   2.2 軟件定時器實現原理 宏OS_TMR_CFG_WHEEL_SIZE定義了OSTmr-WheelTbl[]數組的大小,同時這個值也是定時器分組的依據。按照定時器到時值與 OS_TMR_CFG_WHEEL_SIZE相除的余數進行分組:不同余數的定時器放在不同分組中;相同余數的定時器處在同一組中,由雙向鏈表連接。這樣,余數值為0~OS_TMR_CFG_WHEEL_SIZE-1的不同定時器控制塊,正好分別對應了數組元素OSTmr- WheelTbl[0]~OSTmrWheelTbl[OS_TMR_CFGWHEEL_SIZE-1]的不同分組。每次時鐘節拍到來時,時鐘數 OSTmrTime值加1,然后也進行求余操作,只有余數相同的那組定時器才有可能到時,所以只對該組定時器進行判斷。這種方法比循環判斷所有定時器更高效。隨著時鐘數的累加,處理的分組也由0~OS_TMR_CFG_WHE EL_SIZE-1循環。 信號量喚醒定時器管理任務,計算出當前所要處理的分組后,程序遍歷該分組中的所有控制塊,將當前OSTmr-Time值與定時器控制塊中的到時值相比較。若相等(即到時),則調用該定時器到時回調函數;若不相等,則判斷該組中下一個定時器控制塊。如此操作,直到該分組鏈表的結尾。定時器管理任務的流程如圖 2所示。OS_TMR_CFG_WHEEL_SIZE的取值推薦為2的N次方,以便采用移位操作計算余數,縮短處理時間。   2.3 定時器移除和插入操作 定時器的到時處理函數返回后,都要進行該定時器控制塊在鏈表中的移除和再插入操作。插入前需要重新計算定時器下次到時時所處的分組。計算公式如下: 定時器下次到時的OSTmrTime值=定時器定時值+當前OSTmrTime值 新的分組=定時器下次到時的OSTmrTime值%OS_TMR_CFG_WHEEL_SIZE 3 定時器精度與抖動 在μC/OS-II操作系統中,與定時相關的功能均基于系統的時鐘節拍。系統每秒的時鐘節拍數決定了這個系統能分辨的最小時間,定時值只能為最小時間的倍數。每秒的時鐘節拍數由os_cfg.h.文件中的宏OS_TICKS_PER_SEC定義。對于不同的應用,該時鐘節拍一般在10~100次/s的范圍內選取。其對應的時鐘中斷的時間間隔為100~10 ms,即時間的最小分辨單位為10 ms。處理器處理能力越高,每秒的時鐘節拍數也相應地越大。下面的數據測試中使用了ARM9處理器。最低運行頻率為250 Hz時,時鐘節拍設為200次/s,可進行正常的多任務調度。該測試環境下,最小分辨時間為5 ms。[!--empirenews.page--] 抖動是指定時器回調函數開始執行的時間與規定的時間相比,或提前或推后的現象。在定時器中抖動總是存在的。下面主要分析2種抖動情況及其對定時精度的影響。第1種抖動情況如圖3所示。   T1:CPU響應時鐘中斷,搜索中斷號,保存中斷現場并跳到時鐘中斷處理程序OSTimTick的時間。 T2:OSTimTick()函數的執行時間。該函數中對任務延時是否到期進行了判斷。 T3:恢復現場,退出中斷并進行任務上下文切換的時間。 T4:定時器管理任務OSTmr_Task()判斷定時器是否到時的時間。 T4之后:定時器到時回調函數開始執行。 在CPU運行頻率固定的情況下T1和T3的執行時間是相對固定的,而且一般為匯編語言實現,運行速度也較快。而T2和T4的時間會隨著任務和軟件定時器數量的增多有所增加。測試時定時器定時值隨機選取。表1中的時間為不同處理器頻率下,定時器個數為1和5時觀測到的最大值。其中,T=T1+T2+T3+T4。   由測試數據可知,若有定時器到時,則經過幾個μs的延時,定時器回調函數就可以執行。與ms級的定時最小分辨時間相比,其抖動對到時準確性的影響是非常小的。隨著處理器頻率的提升和處理能力的加強,這個抖動時間還可以進一步縮小。第2種抖動情況如圖4所示。   當下一個時鐘節拍快到來時(如圖4中A時刻),一個定時器被開啟了。因為系統能分辨的最小時間即時鐘節拍的間隔時間,所以定時器開啟時記錄的當前時鐘節拍數為1,假設定時器的定時值就是一個時鐘節拍間隔。定時器開啟后,第2個時鐘節拍馬上就到了,由情況1的分析可知,這個定時器的回調函數很快就會被執行。 B時刻表示這個定時器回調函數第一次執行。C、D時刻為回調函數的第2次與第3次執行時刻,這兩次到時是比較準確的。 因此,定時器從開啟到回調函數開始執行的時間與定時值相比是有較大抖動的。若此時的時鐘節拍間隔為5 ms,則這個抖動的誤差最大即5 ms。這種情況下的抖動只能通過提高每秒的時鐘節拍數來減小。因此,在數據采集或其他定時器的應用中,要留意定時器開啟后第一次到時的處理,以免進行錯誤的判斷。 4 定時器管理任務對操作系統性能的影響 定時器管理任務的運行使應用程序可建立的任務數減1。該任務要求是系統中的最高優先級,因此每次有時鐘中斷發生它都要運行,必然會消耗掉一定的CPU資源。軟件定時器功能所占用的CPU運行時間(設為M)的計數公式為: M=定時器管理任務判斷定時器是否到時的時間+定時器回調函數執行時間+定時器控制塊移除與再插入時間+切換到次低優先級任務的時間 首先,采用μC/OS-II中自帶的統計任務測試定時器管理任務對CPU資源的占用情況。測試時系統中開啟3個任務:定時器管理任務、統計任務和Idle 任務。定時器到時回調函數在定時器管理任務中執行,增加了管理任務運行時間。為僅測試系統定時器管理功能的開銷,測試時將定時回調函數置為空操作。因統計任務要求必須在初始化時建立第一個也是唯一的一個任務中調用統計任務初始化函數OSStatInit(),所以需在定時器管理任務中進行必要改動,以保證在統計任務初始化后才開啟定時器的管理功能。測試用定時器在main函數中靜態創建。 測試后發現,當定時器數由1增加到8時,CPU的使用率一直是1%。這說明系統開啟定時器管理功能后,增加的負荷很小。另一方面因為統計任務計算CPU使用率時是整數相除、余數舍棄,這就使得0~(OSIidleCtrMax/100-1)的計數是不能被分辨的,因此統計任務不能準確地反應定時器管理任務對CPU的使用情況。 為了得到更準確的測量結果,采用“處理器占用率”這一指標對管理任務開銷進行測試。 處理器占用率=軟件定時器功能所占用的CPU運行時間(M)/CPU運行時間 當某一時鐘節拍到來時,假設這一時鐘節拍下無定時器到時,即“到時定時器回調函數執行時間”和“定時器控制塊移除與再插入時間”為0。若當前系統中所創建的定時器正好在同一個分組中,則管理任務須對每個定時器的到時值進行比較,此時為無定時器到時時定時器管理任務對CPU的最高占用率。測試中,將定時器的到時值設定為8的倍數加1,在main()函數中靜態創建。使所有定時器控制塊在同一分組中,當OSTime也是8的倍數加1時,就形成了無定時器到時時定時器管理任務的最壞運行情況。 測試環境為:ARM9(400 MHz),定時器最小分辨時間為5 ms(該值作為計算時的“CPU運行時間”),硬件計時器的最小分辨時間為0.02μs。讀硬件計時器計算時間,測試結果如表2所列。   由測試數據可知建立定時器數為8時,處理器占用率遠小于1%。每增加一個定時器,定時器管理任務的運行時間約增加6.5μs,處理器的占用率約增加0.01%,任務的切換時間不變。這是在構建的極端情況下測試的,實際應用中的時間要小于這個值。 “定時器控制塊移除與再插入時間”在400 MHz下測試為0.22μs。某一時鐘節拍處理時,若有定時器到時,則最壞情況是這個到時的定時器控制塊在鏈表的最后,只有執行完整個鏈表的判斷后才開始執行該到時定時器的回調函數。假設定時器數為8,且鏈表中最后一個定時器先到時,則該定時器到時的這個鐘節拍下處理器利用率為: (0.34μs+0.22μs+0.82μs+定時器回調函數執行時間)/5 ms=(1.38μs+定時器回調函數執行時間)/5 ms。[!--empirenews.page--] 結 論 本文對μC/OS-II軟件定時器的算法及抖動問題進行了分析,并在特定平臺上進行了測試,較好地反映出了該定時器的精度和對處理器資源的占用情況。測試結果可信度高,為在μC/OS-II下的軟件定時器應用開發提供了可靠的依據。

    時間:2014-10-15 關鍵詞: 操作系統 定時器 驅動開發 μc/os-ii

  • 詳解STM32高級定時器-PWM簡單學習案例

    詳解STM32高級定時器-PWM簡單學習案例

    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有死區有互補。 先是配置IO腳: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; void Tim1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM1); //重設為缺省值 TIM_TimeBaseStructure.TIM_Prescaler = 4000; //預分頻(時鐘分頻)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數 TIM_TimeBaseStructure.TIM_Period = 144; //裝載值 18k/144=125hz 就是說向上加的144便滿了 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置了時鐘分割 不懂得不管 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //周期計數器值 不懂得不管 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIMx的時間基數單位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效 PA8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //反向通道也有效 PB13 TIM_OCInitStructure.TIM_Pulse = 40; //占空時間 144 中有40的時間為高,互補的輸出正好相反 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互補端的極性 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空閑狀態下的非工作狀態不管 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //先不管 TIM_OC1Init(TIM1,&TIM_OCInitStructure); //數初始化外設TIMx通道1這里2.0庫為TIM_OCInit TIM_Cmd(TIM1,ENABLE); TIM_CtrlPWMOutputs(TIM1,ENABLE); } //設置捕獲寄存器1 void SetT1Pwm1(u16 pulse) { TIM1-》CCR1=pulse; } //在MAIN 中加點鍵盤掃描啥的用來改變占空比 #include “STM32Lib\stm32f10x.h” #include “hal.h” extern void SetT1Pwm1(u16 pulse); int main(void) { u16 pulse=40; ChipHalInit(); //片內硬件初始化 ChipOutHalInit(); //片外硬件初始化 for(;;) { if(GET_UP()) { while(GET_UP()); if(pulse《=144) { pulse+=5; SetT1Pwm1(pulse); } } if(GET_DOWN()) { while(GET_DOWN()); if(pulse》30) { pulse-=5; SetT1Pwm1(pulse); } } } }  

    時間:2017-04-21 關鍵詞: 定時器 STM32 pwm 驅動開發

  • ARM筆記:定時器中斷的應用

    s3c2440芯片中一共有5個16位的定時器,其中有4個定時器(定時器0~定時器3)具有脈寬調制功能,即他們都有個輸出引腳,可以通過定時器來控制引腳周期性的高低電平變化,定時器4沒有輸出引腳。上次脫機運行PWM測試程序實驗的時候就用到了這塊,所以這次將PWM和定時器放在一起來學習。 定時器部件的時鐘源為PCLK,首先通過兩個8位預分頻器降低頻率,定時器0和1共用第一個預分頻器,2,3,4共用第二個預分頻器。 預分頻器輸出接入第二級分頻器,可以生成5種分頻信號(1/2,1/4,1/8,1/16,TCLK),其中8位預分頻器是可編程,根據裝載值來分頻PCLK,值儲存在TCFG0和TCFG1中。 定時器內部控制邏輯工作流程如下: 1、程序初始,先設置TCMPBn、TCNTBn這兩個寄存器,分別表示定時器n的比較值和初始計數值。 2、然后設置TCON寄存器啟動定時器n,這時TCMPBn、TCNTBn值將被裝入內部寄存器TCMPn、TCNTn。在定時器n的工作頻率下,TCNTn開始減1計數,其值可以通過讀取TCNTOn得知。 3、當TCNTn值等于TCMPn值的時候,定時器n的輸出管腳TOUTn反轉;TCNTn繼續減1計數。 4、當TCNTn值為0,輸出管腳TOUTn再次反轉,并觸發定時器n中斷(中斷使能)。 5、當TCNTn值為0,如果在TCON寄存器中將定時器n設為自動加載,則TCMPBn、TCNTBn值將被自動裝入內部寄存器TCMPn、TCNTn中,進入下一個計數流程。 定時器n的輸出管腳TOUTn初始狀態為高電平,然后會兩次反轉, 也可以通過TCON寄存器設定其初始電平,這樣輸出就完全反相了。 通過設置TCMPBn、TCNTBn可以設置TOUTn輸出信號的占空比,這樣就是所謂的PWM。這里PWM的原理就不做介紹了。 下面介紹定時器的幾種重要寄存器,每一種我們都以定時器0為例。 TCFG0寄存器 [7:0],[15:8]各8位分別被用于控制預分頻器0,1,值為0~255。經過預分頻器出來的時鐘頻率為:PCLK/(prescaler+1)。 TCFG1寄存器 經過預分頻器得到的時鐘將進入2次分頻,這個寄存器就是設置2次分頻系數的。這樣定時器的工作頻率為:PCLK/(prescaler+1)/(divider value),其中prescaler=0~255,divider value=2,4,6,8。 TCFG0和TCFG1這兩個寄存器來配置定時器的頻率,即要確定TCNTOn每遞減一個數所需要的時間,它們之間是倒數的關系。具體的計算公式為: 定時器輸出時鐘頻率=PCLK ÷ (prescaler+1) ÷ divider 其中prescaler值由TCFG0決定,divider值由TCFG1決定,而prescaler只能取0~255之間的整數,divider只能取2、4、8和16。比如已知PCLK為50MHz,而我們想得到某一定時器的輸出時鐘頻率為25kHz,則依據公式可以使prescaler等于249,divider等于8。有了這個輸出時鐘頻率,理論上我們通過設置寄存器TCNTBn就可以得到任意與0.04毫秒(1÷25000×1000)成整數倍關系的時間間隔了。例如我們想要得到1秒鐘的延時,則使TCNTBn為25000(1000÷0.04)即可。 TCON寄存器 TCON寄存器位[3:0]、[11:8]、[15:12]、[19:16]、[22:20]分別用于定時器0~4,位[4]為死區使能位,[7:5]為保留位。除了定時器4沒有輸出反轉位外,其他位功能相似,這里以定時器0為例加以說明。位[0]開啟停止位:0停止定時器,1開始定時器。[1]手動更新位:0無用,1將TCNTBn/TCMPBn寄存器的值裝入內部寄存器TCNTn\TCMPn中。[2]輸出反轉:0不反轉,1反轉。[3]自動加載:0不自動加載,1自動加載。 TCNTBn/TCMPBn寄存器 TCNTOn寄存器 下面就具體介紹如何實現PWM功能。 1、PWM是通過引腳TOUT0~TOUT3輸出的,而這4個引腳是與GPB0~GPB3復用的,因此要實現PWM功能首先要把相應的引腳配置成TOUT輸出。 2、再設置定時器的輸出時鐘頻率,它是以PCLK為基準,再除以用寄存器TCFG0配置的prescaler參數,和用寄存器TCFG1配置的divider參數。 3、然后設置脈沖的具體寬度,它的基本原理是通過寄存器TCNTBn來對寄存器TCNTn(內部寄存器)進行配置計數,TCNTn是遞減的,如果減到零,則它又會重新裝載TCNTBn里的數,重新開始計數,而寄存器TCMPBn作為比較寄存器與計數值進行比較,當TCNTn等于TCMPBn時,TOUTn輸出的電平會翻轉,而當TCNTn減為零時,電平會又翻轉過來,就這樣周而復始。因此這一步的關鍵是設置寄存器TCNTBn和TCMPBn,前者可以確定一個計數周期的時間長度,而后者可以確定方波的占空比。由于s3c2440的定時器具有雙緩存,因此可以在定時器運行的狀態下,改變這兩個寄存器的值,它會在下個周期開始有效。 4、最后就是對PWM的控制,它是通過寄存器TCON來實現的,當不想計數了,可以使自動重載無效,這樣在TCNTn減為零后,不會有新的數加載給它,那么TOUTn輸出會始終保持一個電平(輸出反轉位為0時,是高電平輸出;輸出反轉位為1時,是低電平輸出),這樣就沒有PWM功能了,因此這一位可以用于停止PWM。 S3C2440 定時器總結: 定時器0配置步驟:(其他的也類似) 1、配置TCFG0,第一級分頻系數 2、配置TCFG1,第二級分頻系數 3、配置TCNTB0,定時器計數初始值 4、配置TCON0,啟動定時器和更新定時器計數值 如果有中斷: 5、向中斷向量表timer0安裝中斷服務函數 6、使能定時器中斷,INTMSK

    時間:2018-01-09 關鍵詞: 定時器 中斷 驅動開發

  • VxWorks共享看門狗定時器的設計與實現

    VxWorks共享看門狗定時器的設計與實現

    VxWorks是目前應用最多的嵌入式實時操作系統之一,廣泛應用于工業控制、醫療器械、通信、航空航天以及武器裝備等領域。VxWorks是32位實時嵌入式操作系統,自20世紀80年代由風河公司推出以來,其良好的實時性、對多任務的支持、體積精簡、可剪裁等優點得到眾多公司、開發者及用戶的喜愛。 在實時性要求高的應用系統中,是經常被用到的重要器件。而對于VxWorks操作系統本身來說,并未提供一個通用、高效的定時器組件。文章所提出的定時機制就是針對這種情況實現的一種通用型定時器組件。 1 VxWorks定時的方法 1.1 使用taskDely函數 函數原型為:STATUS taskDelay(int tICks)該函數提供一種簡單的任務休眠機制,常用于需要不精確定時或延時的應用中,其定時的單位為tick,默認情況下60(ticks)為1s (利用sysClkRateSet函數可以修改系統默認的時鐘速率)。在任務中調用taskDelay函數可以在指定的ticks期間空出CPU的使用權,同時改變該任務的狀態為DELAY.由于經常受到任務調度的影響,該定時機制并不精確。 1.2 看門狗watchDog VxWorks提供了一個看門狗定時器(watchDog timer),它由以下四個函數維護: wdCreate( ) 創建并初始化一個看門狗定時器;wdDelete( ) 終止并刪除一個看門狗定時器;wdStart( ) 啟動看門狗定時器;wdCANcel( ) 暫停當前看門狗定時器運行。 利用wdCreate函數,在任何任務中都可以創建一個看門狗定時器,經過設置的時間段后,實現指定的C函數。 watchDog定時器作為系統時鐘中斷服務程序的一部分來維護。因此看門狗所定時執行的程序工作在系統中斷級別具有很高的優先級,該程序必須遵守一般ISR程序的規定,不能使用任何可能被阻塞的程序。文章所介紹的高效定時器就是在看門狗定時器的基礎上設計的。 1.3 POSIX標準的timer VxWorks同時也提供IEEE的POSIX 1003.1b標準定時器接口。POSIX標準保證了應用程序與操作系統之間接口的簡易性,利用這些接口編程,可以使得應用程序很輕松地從一個操作系統移植到另外的操作系統。使用該定時機制,在指定時間段后,任務將向自身發送SIGNAL,該定時器是建立在時鐘和信號之上。POSIX標準的timer定時器常常用來編寫跨平臺、需要在多個操作系統下運行、易移植的程序。 2 基于看門狗定的高效定時機制 2.1 共享看門狗高效定時器 在一些基于嵌入式實時系統的項目中,經常使用定時器來實現某一時間段后執行某一段程序或函數,而往往計時長度都存在差異,定時器的使用也往往來自不同任務,既要求實時性,又要保證資源竟爭的有序性。鑒于這些特點,經常采用的一個定時任務使用一個看門狗定時器的模式已不再適用,如果按照這種模式構建定時器機制,在定時任務較多的情況下,由于看門狗定時器運行在中斷級別,資源消耗就會變得很大,從而對系統的實時性產生影響。 共享看門狗定時器的定時機制可以解決這種資源嚴重浪費的現象。共享看門狗定時機制,顧名思義,就是多個定時任務通過共享同一個看門狗定時器來實現定時操作,其優點是資源消耗小、實時性好、無須產生額外的定時任務。 2.2 定時算法 共享看門狗高效定時器的基本原理是動態改變看門狗的定時任務。 如圖1所示,系統中存在A、B、C三個定時任務。首先A任務提交一個500ms的定時任務,200ms后B提交一個200ms的定時任務,再100ms后C提交一個150ms的定時任務。除此之外再無其他計時,A、B、C運行情況如圖1所示。 圖1 共享看門狗定時器計時機制 圖1 共享看門狗定時器計時機制(參見下頁)定時器A在時間軸50ms處向共享定時器發起定時申請,共享定時器在其維護的定時列表中加入A的時延與執行程序的函數指針,并計算出定時器下一執行時刻TA(系統運行時間加上A的定時時延),此時由于還沒有其他定時器申請定時任務,該列表中只存在A的定時信息。當時間軸到達250ms時,定時器B發起定時申請,由于定時器A的時延為500ms,B的時延為200ms,也就是說B將在時間軸450ms處執行,比A提前了100ms(550ms減去450ms),此時定時列表將完成兩件事情,一是修改下一執行時刻TB為系統運行時間加上B的時延,二是針對執行時刻TA、TB對列表進行從小到大的順序排序。此時列表中B為表頭,A在B之后。同樣的道理當時間軸到達350ms時,定時器C發起定時申請,定時任務C被加入到定時列表,計算得出TC為系統運行時刻加上C的時延,然后依據TA、TB、TC重新進行排序,此時列表順序為B、C、A.當時間軸執行到450ms時,定時器B的ISR將被執行,同時B定時任務將從定時列表中刪除;同理,500ms、550ms時C任務與A任務將分別從列表中刪除。 此時所有定時任務執行結束,定時列表為空,共享看門狗定時器進入休眠狀態。 2.3 定時器實現 2.3.1 定時器軟件結構 共享定時器軟件結構如圖2所示: 圖2 共享看門狗定時器計時機制 CWatchDogTimer類完成了對看門狗定時器的封裝,它由一些通用的函數來維護一個看門狗定時器。其中Create()函數用來創建一個看門狗定時器;Delete()用來刪除該定時器;Start()用來啟動定時任務;Cancel()用來暫停定時器工作,此時再使用Start()函數可以恢復定時器的運行。 TimerInfo數據結構由tExe與tInterval兩個屬性構成,tExe記錄定時器的執行時間,tInterval表示定時器的時間間隔。 TimerList用來維護多個TimerInfo結構的變量,每個TimerInfo變量記錄一個定時器參數信息。 CEfficientTimer類完成對多個定時任務的管理,包括RegistTimer()函數實現注冊一個定時器;UnRegistTimer()用來注銷一個定時器;ClearTimerList()用來清空定時器列表中所有定時器任務;IsEmpty()用來判斷定時器列表是否為空。 2.3.2 看門狗定時模塊實現 看門狗定時模塊處理流程如圖3所示。 圖3 看門狗定時模塊處理流程 看門狗定時器模塊是共享定時器的基礎,它實現了單一定時器的建立、啟動、刪除、取消等功能。首先通過Create()函數建立一個看門狗定時器,同時設定定時器時延、定時次數等參數;然后通過Start()函數啟動定時器;看門狗程序判斷是否到達時間間隔,如果到達則開始執行ISR程序,如果沒有到達則繼續等待;當執行完ISR程序后,定時器將判斷當前執行次數是否到達執行總次數,如果是則結束該次定時任務,若不是程序將跳轉到重新啟動定時器后依次執行。 2.3.3 定時器管理模塊實現 定時器管理模塊是共享定時機制的核心,用來維護定時器的注冊、注銷以及定時器鏈表的排序、刪除、清空等操作。 定時器的注冊流程如圖4所示,首先使用RegistTimer()函數注冊一個新的定時器任務, 并將該定時器的TimerInfo結構插入鏈表中維護,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時間最小的將置于表頭;若在插入該定時器任務之前鏈表中為空,則定時器處于休眠狀態,此時置定時器狀態為運行;若插入前鏈表中已存在其他定時器任務,則無須重啟定時器。 圖4 看門狗定時器注冊流程 定時器的注銷流程如圖5所示, 首先使用UnRegistTimer ()函數注銷一個已注冊的定時器任務,并將該定時器的TimerInfo結構從鏈表中刪除,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時間最小的將置于表頭;若在刪除該定時器任務之前鏈表中除了該定時任務沒有其他定時任務時,則置定時器為休眠狀態;反之,則無須重置定時器狀態。 圖5 看門狗定時器注銷流程 3 結束語 共享定時器提供了簡單、高效、通用的定時方法,使用者可以拋開管理諸多看門狗定時器的煩惱,從而專心于系統其他方面的設計。作為一個通用的系統組件,開發人員不僅可以直接使用,縮短開發時間,也可以繼承此定時器類,實現更多豐富的功能,提供了良好的擴展性與靈活性。 該機制在VxWorks的網絡報文應答、設備狀態監控等方面得到了廣泛應用,在有效節省系統資源的同時提高了系統定時機制的靈活性。 0次

    時間:2018-05-30 關鍵詞: 電路設計 VxWorks 定時器 看門狗

  • 采用C的長延時定時器(二)

    本例介紹采用cd4060數字集成電路制作的長延時定時器(二),該定時器利用cd4060組成定時器的時基電路,由電路產生的定時時基脈沖,通過內部分頻器分頻后輸出時基信號。再通過外設的分頻電路的分頻,取得所需要的定時控制時間。 工作原理 采用cd4060數字集成電路制作的長延時定時器(二)電路原理圖如圖5一10所示。該電路由cd4060與外接阻容元件組成高頻振蕩器,由(rz+rrp,)c1,決定與振蕩器的振蕩頻率,通過rp調節振蕩頻率范圍。 由cd4518雙二一十進制計數器中的一個計數器組成分頻器,其分頻系數最大為10,本電路用它的輸出端q4仍作為定時輸出端。由cd4518的工作原理和引腳功能可知,當q4輸出高電平時,恰好是十進制數中的10. cd4069六反相器中的兩個門dl、d2和晶體管vt與繼電器k組成輸出與控制電路。 電路中,c3, r6組成ic1的開機復位電路,c2、r3組成ic2的開機復位電路。接通電源后,通過開機復位電路使ic1、ic2自動復位。sbl, sb2分別為icl、ic2的人工復位按鍵,當需要時按下該鍵使相應電路復位。 開機后,時基振蕩器振蕩經過分頻后向外輸出時基信號。作為分頻器的ic2開始計數分頻。當計數到10時,q4輸出高電平,該高電平經dl反相變為低電平使vt截止,繼電器斷電釋放,切斷被控電路工作電源。與此同時,di輸出的低電平經d2反相為高電平后加至ic2的cp端,使輸出端輸出的高電平保持。 電路通電使ic1、ic2復位后,icz的四個輸出端,均為低電平。而q4輸出的低電平經d1反相變為高電平,通過r4使vt導通,繼電器通電吸合。這種工作狀態為開機接通、定時斷開狀態。如果要改變為開機斷開、定時接通狀態,可在輸出端d1和vt之間加人一級反相器。 定時時間的長短,可通過rp來調整,也可根據二一十進制編碼的對應關系,通過對ic2的輸出端的連接來改變。本例電路定時范圍為3min一lh. 元器件選擇 icl選用cd4060 14位串行二進制計數/分頻/振蕩器數字集成電路;ic2選用雙二一十進制計數器數字集成電路;ic3選用cd4069六反相器。 vt選用9013或3dg12型硅npn***率晶體管,要求電流放大系數月β>1000 其他元器件均無特殊要求,可按圖5一10所標型號及參數進行選用。

    時間:2019-02-19 關鍵詞: 電路設計 定時器

  • 解析51單片機的幾種精確延時

    解析51單片機的幾種精確延時

    51單片機的幾種精確延時實現延時通常有兩種方法:一種是硬件延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟件延時,這種方法主要采用循環體進行。 1 使用定時器/計數器實現精確延時 單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,后兩種的一個機器周期分別為1 μs和2 μs,便于精確延時。本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值占用2個機器周期)。 在實際應用中,定時常采用中斷方式,如進行適當的循環可實現幾秒甚至更長時間的延時。使用定時器/計數器延時從程序的執行效率和穩定性兩方面考慮都是最佳的方案。但應該注意,C51編寫的中斷服務程序編譯后會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句,執行時占用了4個機器周期;如程序中還有計數值加1語句,則又會占用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。 2 軟件延時與時間計算 在很多情況下,定時器/計數器經常被用作其他用途,這時候就只能用軟件方法延時。下面介紹幾種軟件延時的方法。 2.1 短暫延時 可以在C文件中通過使用帶_NOP_( )語句的函數實現,定義一系列不同的延時函數,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一個自定義的C文件中,需要時在主程序中直接調用。如延時10 μs的延時函數可編寫如下: void Delay10us( ) { _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); _NOP_( ); } Delay10us( )函數中共用了6個_NOP_( )語句,每個語句執行時間為1 μs。主函數調用Delay10us( )時,先執行一個LCALL指令(2 μs),然后執行6個_NOP_( )語句(6 μs),最后執行了一個RET指令(2 μs),所以執行上述函數時共需要10 μs。 可以把這一函數當作基本延時函數,在其他函數中調用,即嵌套調用\[4\],以實現較長時間的延時;但需要注意,如在Delay40us( )中直接調用4次Delay10us( )函數,得到的延時時間將是42 μs,而不是40 μs。這是因為執行Delay40us( )時,先執行了一次LCALL指令(2 μs),然后開始執行第一個Delay10us( ),執行完最后一個Delay10us( )時,直接返回到主程序。依此類推,如果是兩層嵌套調用,如在Delay80us( )中兩次調用Delay40us( ),則也要先執行一次LCALL指令(2 μs),然后執行兩次Delay40us( )函數(84 μs),所以,實際延時時間為86 μs。簡言之,只有最內層的函數執行RET指令。該指令直接返回到上級函數或主函數。如在Delay80μs( )中直接調用8次Delay10us( ),此時的延時時間為82 μs。通過修改基本延時函數和適當的組合調用,上述方法可以實現不同時間的延時。 2.2 在C51中嵌套匯編程序段實現延時 在C51中通過預處理指令#pragma asm和#pragma endasm可以嵌套匯編語言語句。用戶編寫的匯編語言緊跟在#pragma asm之后,在#pragma endasm之前結束。 如:#pragma asm … 匯編語言程序段 … #pragma endasm 延時函數可設置入口參數,可將參數定義為unsigned char、int或long型。根據參數與返回值的傳遞規則,這時參數和函數返回值位于R7、R7R6、R7R6R5中。在應用時應注意以下幾點: ◆ #pragma asm、#pragma endasm不允許嵌套使用; ◆ 在程序的開頭應加上預處理指令#pragma asm,在該指令之前只能有注釋或其他預處理指令; ◆ 當使用asm語句時,編譯系統并不輸出目標模塊,而只輸出匯編源文件; ◆ asm只能用小寫字母,如果把asm寫成大寫,編譯系統就把它作為普通變量; ◆ #pragma asm、#pragma endasm和 asm只能在函數內使用。 將匯編語言與C51結合起來,充分發揮各自的優勢,無疑是單片機開發人員的最佳選擇。 2.3 使用示波器確定延時時間 利用示波器來測定延時程序執行時間。方法如下:編寫一個實現延時的函數,在該函數的開始置某個I/O口線如P1.0為高電平,在函數的最后清P1.0 為低電平。在主程序中循環調用該延時函數,通過示波器測量P1.0引腳上的高電平時間即可確定延時函數的執行時間。方法如下: sbit T_point = P1^0; void Dly1ms(void) { unsigned int i,j; while (1) { T_point = 1; for(i=0;i《2;i++){ for(j=0;j《124;j++){;} } T_point = 0; for(i=0;i《1;i++){ for(j=0;j《124;j++){;} } } } void main (void) { Dly1ms(); } 把P1.0接入示波器,運行上面的程序,可以看到P1.0輸出的波形為周期是3 ms的方波。其中,高電平為2 ms,低電平為1 ms,即for循環結構“for(j=0;j《124;j++) {;}”的執行時間為1 ms。通過改變循環次數,可得到不同時間的延時。當然,也可以不用for循環而用別的語句實現延時。這里討論的只是確定延時的方法。 2.4 使用反匯編工具計算延時時間 用Keil C51中的反匯編工具計算延時時間,在反匯編窗口中可用源程序和匯編程序的混合代碼或匯編代碼顯示目標應用程序。為了說明這種方法,還使用“for (i=0;i C:0x000FE4CLRA//1T C:0x0010FEMOVR6,A//1T C:0x0011EEMOVA,R6//1T C:0x0012C3CLRC//1T C:0x00139FSUBBA,DlyT //1T C:0x00145003JNCC:0019//2T C:0x00160E INCR6//1T C:0x001780F8SJMPC:0011//2T 可以看出,0x000F~0x0017一共8條語句,分析語句可以發現并不是每條語句都執行DlyT次。核心循環只有0x0011~0x0017共6 條語句,總共8個機器周期,第1次循環先執行“CLR A”和“MOV R6,A”兩條語句,需要2個機器周期,每循環1次需要8個機器周期,但最后1次循環需要5個機器周期。DlyT次核心循環語句消耗(2+DlyT&TImes;8+5)個機器周期,當系統采用12 MHz時,精度為7 μs。[!--empirenews.page--] 當采用while (DlyT--)循環體時,DlyT的值存放在R7中。相對應的匯編代碼如下: C:0x000FAE07MOVR6, R7//1T C:0x00111F DECR7//1T C:0x0012EE MOVA,R6//1T C:0x001370FAJNZC:000F//2T 循環語句執行的時間為(DlyT+1)&TImes;5個機器周期,即這種循環結構的延時精度為5 μs。 通過實驗發現,如將while (DlyT--)改為while (--DlyT),經過反匯編后得到如下代碼: C:0x0014DFFE DJNZR7,C:0014//2T 可以看出,這時代碼只有1句,共占用2個機器周期,精度達到2 μs,循環體耗時DlyT&TImes;2個機器周期;但這時應該注意,DlyT初始值不能為0。 注意:計算時間時還應加上函數調用和函數返回各2個機器周期時間。

    時間:2016-11-22 關鍵詞: 定時器 51單片機 技術前沿

  • VxWorks共享看門狗定時機制的設計與實現

    引言 VxWorks是目前應用最多的嵌入式實時操作系統之一,廣泛應用于工業控制、醫療器械、通信、航空航天以及武器裝備等領域。VxWorks是32位實時嵌入式操作系統,自20世紀80年代由風河公司推出以來,其良好的實時性、對多任務的支持、體積精簡、可剪裁等優點得到眾多公司、開發者及用戶的喜愛。 在實時性要求高的應用系統中,定時器是經常被用到的重要器件。而對于VxWorks操作系統本身來說,并未提供一個通用、高效的定時器組件。文章所提出的共享看門狗定時機制就是針對這種情況實現的一種通用型定時器組件。 1 VxWorks定時的方法 1.1 使用taskDely函數 函數原型為:STATUS taskDelay(int ticks)該函數提供一種簡單的任務休眠機制,常用于需要不精確定時或延時的應用中,其定時的單位為tick,默認情況下60(ticks)為1s (利用sysClkRateSet函數可以修改系統默認的時鐘速率)。在任務中調用taskDelay函數可以在指定的ticks期間空出CPU的使用權,同時改變該任務的狀態為DELAY.由于經常受到任務調度的影響,該定時機制并不精確。 1.2 看門狗watchDog VxWorks提供了一個看門狗定時器(watchDog timer),它由以下四個函數維護: wdCreate( ) 創建并初始化一個看門狗定時器;wdDelete( ) 終止并刪除一個看門狗定時器;wdStart( )啟動看門狗定時器;wdCancel( ) 暫停當前看門狗定時器運行。 利用wdCreate函數,在任何任務中都可以創建一個看門狗定時器,經過設置的時間段后,實現指定的C函數。 watchDog定時器作為系統時鐘中斷服務程序的一部分來維護。因此看門狗所定時執行的程序工作在系統中斷級別具有很高的優先級,該程序必須遵守一般ISR程序的規定,不能使用任何可能被阻塞的程序。文章所介紹的高效定時器就是在看門狗定時器的基礎上設計的。 1.3 POSIX標準的timer VxWorks同時也提供IEEE的POSIX 1003.1b標準定時器接口。POSIX標準保證了應用程序與操作系統之間接口的簡易性,利用這些接口編程,可以使得應用程序很輕松地從一個操作系統移植到另外的操作系統。使用該定時機制,在指定時間段后,任務將向自身發送SIGNAL,該定時器是建立在時鐘和信號之上。POSIX標準的timer定時器常常用來編寫跨平臺、需要在多個操作系統下運行、易移植的程序。 2 基于看門狗定的高效定時機制 2.1 共享看門狗高效定時器 在一些基于嵌入式實時系統的項目中,經常使用定時器來實現某一時間段后執行某一段程序或函數,而往往計時長度都存在差異,定時器的使用也往往來自不同任務,既要求實時性,又要保證資源竟爭的有序性。鑒于這些特點,經常采用的一個定時任務使用一個看門狗定時器的模式已不再適用,如果按照這種模式構建定時器機制,在定時任務較多的情況下,由于看門狗定時器運行在中斷級別,資源消耗就會變得很大,從而對系統的實時性產生影響。 共享看門狗定時器的定時機制可以解決這種資源嚴重浪費的現象。共享看門狗定時機制,顧名思義,就是多個定時任務通過共享同一個看門狗定時器來實現定時操作,其優點是資源消耗小、實時性好、無須產生額外的定時任務。 2.2 定時算法 共享看門狗高效定時器的基本原理是動態改變看門狗的定時任務。 如圖1所示,系統中存在A、B、C三個定時任務。首先A任務提交一個500ms的定時任務,200ms后B提交一個200ms的定時任務,再100ms后C提交一個150ms的定時任務。除此之外再無其他計時,A、B、C運行情況如圖1所示。 圖1 共享看門狗定時器計時機制 圖1 共享看門狗定時器計時機制(參見下頁)定時器A在時間軸50ms處向共享定時器發起定時申請,共享定時器在其維護的定時列表中加入A的時延與執行程序的函數指針,并計算出定時器下一執行時刻TA(系統運行時間加上A的定時時延),此時由于還沒有其他定時器申請定時任務,該列表中只存在A的定時信息。當時間軸到達250ms時,定時器B發起定時申請,由于定時器A的時延為500ms,B的時延為200ms,也就是說B將在時間軸450ms處執行,比A提前了100ms(550ms減去450ms),此時定時列表將完成兩件事情,一是修改下一執行時刻TB為系統運行時間加上B的時延,二是針對執行時刻TA、TB對列表進行從小到大的順序排序。此時列表中B為表頭,A在B之后。同樣的道理當時間軸到達350ms時,定時器C發起定時申請,定時任務C被加入到定時列表,計算得出TC為系統運行時刻加上C的時延,然后依據TA、TB、TC重新進行排序,此時列表順序為B、C、A.當時間軸執行到450ms時,定時器B的ISR將被執行,同時B定時任務將從定時列表中刪除;同理,500ms、550ms時C任務與A任務將分別從列表中刪除。 此時所有定時任務執行結束,定時列表為空,共享看門狗定時器進入休眠狀態。 2.3 定時器實現 2.3.1 定時器軟件結構 共享定時器軟件結構如圖2所示: 圖2 共享看門狗定時器計時機制 CWatchDogTimer類完成了對看門狗定時器的封裝,它由一些通用的函數來維護一個看門狗定時器。其中Create()函數用來創建一個看門狗定時器;Delete()用來刪除該定時器;Start()用來啟動定時任務;Cancel()用來暫停定時器工作,此時再使用Start()函數可以恢復定時器的運行。 TimerInfo數據結構由tExe與tInterval兩個屬性構成,tExe記錄定時器的執行時間,tInterval表示定時器的時間間隔。 TimerList用來維護多個TimerInfo結構的變量,每個TimerInfo變量記錄一個定時器參數信息。 CEfficientTimer類完成對多個定時任務的管理,包括RegistTimer()函數實現注冊一個定時器;UnRegistTimer()用來注銷一個定時器;ClearTimerList()用來清空定時器列表中所有定時器任務;IsEmpty()用來判斷定時器列表是否為空。[!--empirenews.page--] 2.3.2 看門狗定時模塊實現 看門狗定時模塊處理流程如圖3所示。 圖3 看門狗定時模塊處理流程 看門狗定時器模塊是共享定時器的基礎,它實現了單一定時器的建立、啟動、刪除、取消等功能。首先通過Create()函數建立一個看門狗定時器,同時設定定時器時延、定時次數等參數;然后通過Start()函數啟動定時器;看門狗程序判斷是否到達時間間隔,如果到達則開始執行ISR程序,如果沒有到達則繼續等待;當執行完ISR程序后,定時器將判斷當前執行次數是否到達執行總次數,如果是則結束該次定時任務,若不是程序將跳轉到重新啟動定時器后依次執行。 2.3.3 定時器管理模塊實現 定時器管理模塊是共享定時機制的核心,用來維護定時器的注冊、注銷以及定時器鏈表的排序、刪除、清空等操作。 定時器的注冊流程如圖4所示,首先使用RegistTimer()函數注冊一個新的定時器任務,并將該定時器的TimerInfo結構插入鏈表中維護,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時間最小的將置于表頭;若在插入該定時器任務之前鏈表中為空,則定時器處于休眠狀態,此時置定時器狀態為運行;若插入前鏈表中已存在其他定時器任務,則無須重啟定時器。 圖4 看門狗定時器注冊流程 定時器的注銷流程如圖5所示, 首先使用UnRegistTimer ()函數注銷一個已注冊的定時器任務,并將該定時器的TimerInfo結構從鏈表中刪除,然后針對該結構中的tExe變量對鏈表按照升序排列,執行時間最小的將置于表頭;若在刪除該定時器任務之前鏈表中除了該定時任務沒有其他定時任務時,則置定時器為休眠狀態;反之,則無須重置定時器狀態。 圖5 看門狗定時器注銷流程 3 結束語 共享定時器提供了簡單、高效、通用的定時方法,使用者可以拋開管理諸多看門狗定時器的煩惱,從而專心于系統其他方面的設計。作為一個通用的系統組件,開發人員不僅可以直接使用,縮短開發時間,也可以繼承此定時器類,實現更多豐富的功能,提供了良好的擴展性與靈活性。 該機制在VxWorks的網絡報文應答、設備狀態監控等方面得到了廣泛應用,在有效節省系統資源的同時提高了系統定時機制的靈活性。

    時間:2014-01-23 關鍵詞: 定時 VxWorks 定時器

  • 51單片機 | 定時器中斷應用實例

    51單片機 | 定時器中斷應用實例

    設計要求: 每秒點亮P1.0口的發光二極管一次,然后熄滅,使發光二極管形成閃爍效果 實現思路: 通過定時/計數器,每秒觸發一次P1.0取反 涉及到的功能模塊:定時器,中斷,LED操作 定時器裝填: 需要計數每秒的話,計數921600時溢出即可,在四種方式定時方式中,最大的計數范圍是方式2:65536,將921600分解成20份,每份計數46080時溢出,當溢出20次時燈閃爍,每次定時器溢出都要重新裝填 模塊設計 1、初始化 LED(上拉輸入模式) 定時器(T0,工作方式1,裝填初值,啟動(在中斷初始化后啟動)) 中斷(開放中斷,開放T0中斷) 2、while(1) 3、中斷 重置定時器(溢出位復位,重新裝填計時) 判斷溢出次數(到達20次時LED改變狀態,計數清零。未到達20次時溢出次數加一) 實現代碼: #include #include typedef unsigned char uchar; sbit LED = P1 ^ 0; uchar count = 0; void Interrupt() interrupt 1 { TH0 = (65536 - 46080) / 256; //觸發中斷時重新裝填計時 TL0 = (65536 - 46080) % 256; if (count == 20) { LED = ~LED; count = 0; } else ++count; } void main(void) { LED = 0xff; //初始化LED TMOD = 0x01; //初始化TMOD,定時器0,方式1 TH0 = (65536 - 46080) / 256; //裝填計數 TL0 = (65536 - 46080) % 256; EA = 1; //開放所有中斷 ET0 = 1; //開放定時器0中斷控制位 TR0 = 1; //定時器0開始計時 while(1) { _nop_(); }   }

    時間:2019-05-26 關鍵詞: 定時器 51單片機 中斷 技術教程

首頁  上一頁  1 2 3 4 5 6 7 8 9 10 下一頁 尾頁
發布文章

技術子站

更多

項目外包

更多

推薦博客

新时时彩
福建36选7今天开奖结果 河北十一选五手机走 12月29日步行者vs篮网 江西11选5开奖查询 欧美av性爱 30选5基本走势图 JUFD-285 冲田杏梨 古墓丽影 现金麻将游戏 吉林十一选五最大遗 五分十一选五开奖走势 谁有东京热的官网 辛运28 3d今日开奖结果 长春一条龙多少钱 四川麻将规则胡图解