歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

  • 前言

有接觸過8051 MCU的朋友可能知道,在8051中,能夠使用其內部Timer來達成計數器的功能。對相關的暫存器設定完成無誤後,從8051晶片外部輸入負緣訊號(falling edge)到8051的T1或T0(對應Timer1和Timer0)腳位,即可實現計數功能。每當輸入一個負緣訊號,就會看到timer中的計數暫存器(THx/TLx)的值+1,也就是上數(count up)

而STM32系列MCU內部的Timer當然也有這種功能,只是又更加的複雜且多元(畢竟8051是30幾年被開發的MCU晶片)
 
近期因為收到朋友的緊急協助需求,希望使用STM32 MCU上面的計數器的功能(由MCU外部輸入訊號達成計數)
 
起初使用網路上許多文章所介紹使用ETR的方式(數年前曾用過),但在此IDE上使用STM32CubeMX tool作相對應的設定後沒有成功(原因尚不清楚,或許有些小地方沒注意到)。於是花了些時間查資料,後來在網路上有看到外國朋友所做的影片,是透過STM32CubeMX tool去做對應的設定,並產生出相對應的code。這篇文章會介紹參考這個影片的設定方式,並在STM32CubeIDE開發環境上面重現實驗和功能測試的過程,過程中會有一些與上述影片中不同的地方
 
所以這篇文章就僅當成一個實驗紀錄供參考,暫時不分析講解STM32內部Timer的各種模式或較複雜的細節
 
對於細節有興趣的朋友可自行參考ST官方文件,例如:
 
 
 
 
----------------
 
  • 本文重點
我們用的實驗平台是STM32F407G-DISC1 (STM32 discovery系列的板子MB997D),與上述國外網友的影片中所用的平台型號不同
 
 
- STM32F405xx, STM32F407xx MCU官方datasheet: 
STM32F407G-DISC1開發板
 
而從上述官方資料中的電路圖可得知,板子上面的藍色按鈕(代號B1)是被接到STM32F407VG MCU晶片的PA0這根pin腳,且平常是pull down(透過220K電阻)的狀況,而當按鈕按下時會是一個high level訊號輸入PA0。如下圖:
 
 
STM32F407G-DISC1開發板上的藍色小按鈕對應電路圖
(圖片來源: 
ST官方資料 UM1472 User manual Discovery kit with STM32F407VG MCU)

而我們可以從STM32F407G datasheet的pin out & pin description中看到,PA0這隻腳位的Alternate functions欄位中,是有包含TIM2_CH1_ETR的。基本上這些資訊就提示了我們可以使用這塊開發板上面的藍色按鈕來進行計數器的MCU晶片外部訊號的產生來源(demo驗證功能用)
 
STM32F407G datasheet中的PA0的pin out & pin description

 
接下來開始關於軟體的部分。在STM32Cube IDE開設一個關於你自己的STM32平台所屬的專案(看是針對你的MCU型號或者你所使用的開發板型號)
 
並且使用STM32CubeMX tool(開啟專案內的.ioc檔案,在左方的Timers裡面的TIM2的Slave Mode設定為External Clock Mode 1 並將Mode(深灰色項目)中Trigger Source選擇為TI1FP1。此時會在右方MCU對應腳位圖看到PA0這根腳位被設為TIM2_CH1用途 (眾多alternate functions之一)
 
STM32Cube IDE相關設定(Mode)
 
 
再來接著進行Configuration(深灰色項目)中的設定,首先是Parameter Settings(深藍色選項,被選到時會變成比較淺的藍色)。注意: Counter Period一定要設定,不能設為0。例如你設定100,那Timer最多計數到100,再到下一個tick時,計數值(CNT register的值)就會變成0,簡單來說這個就是設定上限。而因為這顆STM32F407的TIMER2(TIM2)的長度是32bits,所以這個Counter Period在這顆MCU晶片上最多可以設定到2的32次方)。Trigger polarity設為Rising Edge(正緣觸發)設定畫面如下:
 
STM32Cube IDE相關設定(Configuration-Parameter Settings)
 
 
而關於計數器從外部輸入訊號所需對應的GPIO Settings(深藍色選項,被選到時會變成比較淺的藍色)如下圖,基本上在我這次的應用需求上沒什麼需要更動的
 
STM32Cube IDE相關設定(Configuration-GPIO Settings)
 
接下來就是按下Ctrl + S或者IDE上面的Project選項內的Generate Code,以產生相關的程式碼
 
 
接著,在程式中加入實際執行時須呼叫的函式HAL_TIM_Base_Start(&htim2)以啟動TIM2 ,否則TIM2是不會動的。
 
再來就是燒錄&執行程式(若不清楚操作步驟的朋友可參考網路上其他教學),這邊是用Debug模式進行測試 (透過板子上的stlink進行線上除錯模式觀看暫存器的值)。
 
進入Debug模式後透過右上方的tool觀察TIM2之CNT暫存器的值
 
執行結果如下影片(特別觀察上圖中下方紅色圈起來的地方的CNT(counter register)值的變化,每按一下板子上了藍色按鈕,其值即會+1(上數)。而用滑鼠點擊IDE畫面上的Debug tool的RD按鈕圖示是為了更新畫面上顯示的暫存器值
 

另外,如果要用軟體的方式取得本例中的TIM2的CNT值,可以使用__HAL_TIM_GET_COUNTER這個macro function,其內容在stm32f4xx_hal_tim.h內

 
__HAL_TIM_GET_COUNTER macro function
而像本例是用TIM2,所以加上參數後的函式呼叫就是長這樣子: __HAL_TIM_GET_COUNTER(&htim2);
 
【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章
arrow
arrow
    創作者介紹
    創作者 阿良 (孫文良) 的頭像
    阿良 (孫文良)

    阿良的嵌入式系統技術學習區

    阿良 (孫文良) 發表在 痞客邦 留言(0) 人氣()