有人使用STM32芯片開發產品,其中有個功能就是統計某外部信號脈沖個數。他采用外部中斷方式,來一個信號觸發一次中斷,在中斷程序里實現計數累加。但由于被統計的信號頻率較高,而中斷本身也是需要時間的,往往導致有些脈沖沒被統計而發生丟數的問題。況且,CPU這樣頻繁地去響應中斷還會衍生出其它系統性問題。
他咨詢是否可以將該信號作為定時器的時鐘源,每來一個脈沖信號計數器就自動加1。這樣的話,用戶適時去讀取計數器的值即可。若有,如何實現?
對于這種情況,我們可以將被統計信號連接到定時器的ETR腳,并作為定時器的計數時鐘。開啟定時器更新中斷對溢出次數進行統計,擇時讀取計數器的值和溢出次數即可。這樣既避免了CPU頻繁進中斷而無法應對別的事情的困境,也避免了因CPU優先忙于別的事情而來不及響應外部中斷導致計數出錯的麻煩。
對于STM32來講,從ETR腳引入時鐘信號,可以有兩種模式。
第一種模式,即外部時鐘1模式,此時來自ETR腳的信號經過濾波、邊沿檢測和極性選擇后,以觸發信號的角色連接到從模式控制器,并作為定時器的時鐘源,即上圖中的1路。
第二種模式,即外部時鐘2模式,來自ETR腳的時鐘信號經過極性選擇、分頻、濾波后不經過從模式控制器,而是像內部時鐘源一樣直接為計數器提供計數時鐘,即上圖中的2路。
現在分別以上面提到的兩種模式演示定時器對來自ETR腳的時鐘信號進行計數的過程。這里以STM32F411 Nucleo開發板來進行實驗。
用TIM1_CH1模擬產生某頻率的PWM脈沖信號,將其通過跳線連接到ETR腳。為便于測量和演示,讓TIM1工作在單脈沖PWM模式,結合RCR寄存器輸出指定個數的脈沖。使用TIM3對來自ETR腳的時鐘信號進行計數,同時開啟TIM3更新中斷對溢出次數進行統計。
讓TIM1-CH1啟動后輸出248個脈沖后停下來,而TIM3每統計200個脈沖就產生溢出,即令TIM3_ARR值等于199。
現在使用STM32CUBEMX進行基本的配置。
先對用來模擬產生外來脈沖信號的TIM1進行配置。做些基本的時基配置即可。
然后對TIM3進行配置,時鐘來自ETR腳,工作在外部時鐘模式2。
將時鐘、NVIC等配置完畢后即可生成初始化代碼。
定義變量CNT_Update記錄TIM3的溢出次數。基于STM32Cube 庫稍加組織代碼即可查看結果。
編譯運行查看結果:
TIM3發生溢出1次,結合上面配置可知其對應的脈沖個數為200,此時計數器里的值為0x30,即48,總共248個脈沖,跟TIM1_CH1輸出的248個脈沖數相同。
上面的實驗是基于TIM3工作在ETR外部時鐘模式2,我們不妨再看看基于外部時鐘模式1的情況。現在只需對TIM3的時鐘配置稍作調整,其它參數不動。
生成初始化代碼后,基于前面組織的用戶代碼不做任何調整即可編譯運行驗證。
上面驗證結果與外部時鐘模式2完全相同,跟TIM1_CH1輸出的脈沖數完全吻合。
從上面示例來看,當時鐘信號來自ETR腳時,不論使用外部時鐘模式1還是外部時鐘模式2,都可以實現完全相同的結果。那么基于同一個時鐘源,為什么弄出2個時鐘模式呢?
首先,定時器本身支持多鐘時鐘模式,其中包括外部時鐘模式1與外部時鐘模式2。只不過來自ETR腳的時鐘信號既可以工作外部時鐘模式1,也可以工作在外部時鐘模式2。
外部時鐘模式1的主要特點是時鐘信號還同時兼具觸發信號的角色,此時定時器也一定工作在從模式,這個從模式就是外設時鐘模式1從模式。STM32參考手冊關于這個模式,在講解定時器主從連接的相關實例時進行過介紹,但沒有將其跟復位從模式、觸發從模式等從模式一起單列出來進行介紹。我們在用STM32CubeMX進行配置時也可以發現有個從模式選項就是外部時鐘1從模式。
前面也提到了,外部時鐘模式1下的時鐘除了做時鐘外,還做觸發信號。基于這個觸發信號可以產生觸發事件,從而觸發中斷或產生DMA請求。而外部時鐘模式2就是特指來自ETR腳的時鐘,只是個純粹的時鐘,不具備觸發功能。但是,選擇外部時鐘模式2的定時器,既可以工作在主模式,也可以工作在諸如復位/觸發/門控等從模式。
另外,作為外部時鐘模式1的時鐘,它可以有多個來源,除了ETR腳外,還可以是TI1、TI2輸入腳或者其它定時器的觸發輸出,而工作在外部時鐘模式2的時鐘只能來自ETR腳。顯然,基于開篇的客戶需求,它的被測信號還可以接到別的特定管腳上來處理。
最后做點提醒。基于上面應用,弄清實現原理后,自行組織用戶代碼應該說非常簡單了。不過,即使這樣,可能還是會有不少人在有個地方出問題,就是沒有下圖中那句對TIM3的更新事件標志進行清零的代碼。很多場景,這行代碼可有可無。當遇到目前這種應用時,就不能可有可無了。
基于上面的程序邏輯,如果沒有這句代碼會發生統計所得的溢出次數與實際溢出次數多1的狀況。以上面應用為例,我什么都不改動,只將那行代碼注釋掉,運行結果會變成下面的樣子。計數器里的值雖然還是48,但溢出次數變成2了!
像這種需要統計精確數據的情形,發生這種問題往往就難以接受。為什么要加這句代碼呢?如果不加這句代碼怎么會導致統計到的溢出次數平白無故多1次呢?
關于這點可以自行思考下,在此不延申解釋了。也可以參考下面文章《STM32定時器中的更新操作與更新事件》的結尾部分,那里有就該問題做些分析。
責任編輯:pj
-
信號
+關注
關注
11文章
2804瀏覽量
77100 -
STM32芯片
+關注
關注
0文章
38瀏覽量
4424
發布評論請先 登錄
相關推薦
詳解CKS32F107xx系列的定時器同步功能
![詳解CKS32F107xx系列的<b class='flag-5'>定時器</b>同步功能](https://file1.elecfans.com/web3/M00/00/04/wKgZO2dFmo2AEGVaAAAmt1_ZZbs531.png)
紅石比較器兩種模式的作用
定時器的基本組成和工作模式
plc與傳感器的兩種連接方式
時間繼電器與定時器的區別
s7200定時器的五種故障介紹
stm32主從定時器門控模式,怎么控制在不產生PWM時從定時器cnt不要計數?
使用555定時器的可調雙定時器電路
![使用555<b class='flag-5'>定時器</b>的可調雙<b class='flag-5'>定時器</b>電路](https://file1.elecfans.com/web2/M00/C1/D8/wKgaomXa6PqABqXTAABhX_zgqZw100.png)
評論