圖片1.png (290.15 KB, 下載次數: 60)
下載附件
2020-3-26 15:39 上傳
定時器(LED航情燈、指示燈閃爍)一、定時器簡介
定時器具有定時功能,類似于生活中的“鬧鐘”,可以用定時器產生精確的定時時間,用來延時或者處理一些實時事件。 STM32系列的定時器分為基本定時器、通用定時器、高級控制定時器。后者包括前者的全部功能。通常地,STM32高級定時器是TIM1、TIM8,通用定時器是TIM2、TIM3、TIM4、TIM5,基本定時器是TIM6、TIM7。 而飛控的主核心STM32F103CBT6則有4路16位定時器分別是高級定時器TIM1、通用定時器TIM2、TIM3以及TIM4。
二、定時器寄存器STM32F103定時器相關的寄存器眾多,這里只講解重要的幾個寄存器。 (1)TIMx_CR1:使能寄存器,最低位控制寄存器的開關,如下圖所示:
圖片1.png (9.36 KB, 下載次數: 66)
下載附件
2020-3-26 15:40 上傳
TIM_CR1寄存器主要配置定時器的循環計數、使能等操作,例如CEN位為1是使能計數,為0是關閉計數。 (2)TIMx_DIER: 定時器中斷使能寄存器, 最低位控制事件更新中斷的開關, 如下圖所示:
圖片2.png (8.27 KB, 下載次數: 54)
下載附件
2020-3-26 15:40 上傳
該寄存的主要功能是配置定時器是定時器的中斷使能位,主要使用的是UIE位,UIE為1是使能中斷,為0時關閉中斷。 (3)TIMx_PSC:定時器時鐘分頻寄存器,如下圖所示:
圖片3.png (5.77 KB, 下載次數: 54)
下載附件
2020-3-26 15:40 上傳
該寄存器負責把定時器時鐘分頻之后,再輸出給計數器,PSC[15:0]為分頻系數。 (4)TIMx_ARR:定時器自動重裝載寄存器,如下圖所示:
圖片4.png (5.56 KB, 下載次數: 53)
下載附件
2020-3-26 15:41 上傳
ARR[15:0]為自動重裝載值,當定時器采用向上計數時,計數值等于ARR時,產生一個更新事件;當定時器采用向下計數時,最開始將ARR的值賦給計數值,計數值向下累減為0時,產生一個更新事件,再次將ARR的值賦給計數值,進行新一輪的向下計數。 (5)TIMx_SR: 狀態寄存器,標記當前與定時器相關的各種事件/中斷是否發生,我們只用到最低位表示事件更新中斷的標志位,如下圖所示:
圖片5.png (10.49 KB, 下載次數: 60)
下載附件
2020-3-26 15:41 上傳
該寄存器主要用于查看定時器的更新中斷標志位,當計數發生上溢或者下溢時,UIF位將被置1,標志一次計數完成。 三、定時器實驗本節實驗的內容是主要是針對GPIO中的周期性點亮無人機的航情燈以及信號燈,對其進行變形,使用通用定時器TIM3精確定時周期性點亮及關閉無人機的航情燈以及信號燈。 同樣也是查看原理圖可以得知無人機的航情燈同一接在NPN三極管Q1上,而三極管的基極又接在了單片機的PA8上;兩個信號燈分別接在了PC13和PC14上。
圖片6.png (552.55 KB, 下載次數: 59)
下載附件
2020-3-26 15:42 上傳
圖片7.png (9.43 KB, 下載次數: 60)
下載附件
2020-3-26 15:42 上傳
圖片8.png (84.6 KB, 下載次數: 55)
下載附件
2020-3-26 15:43 上傳
關于GPIO這部分的驅動代碼可以沿襲保留,不同的是需要加入定時器的初始化以及配置定時器中斷,編寫代碼的思路如下表所示。 編程思路 1 | | 1、定義結構體; 2、使能時鐘; 3、填充結構體; 4、裝載結構體。 | | | 1、定義結構體; 2、使能時鐘; 3、填充結構體; 4、裝載結構體; 5、使能時鐘; 6、使能定時器。 | | | | | | 1、判斷是否觸發中斷; 2、清除標志位; 3、其它邏輯。 |
按照代碼思路,編寫代碼(通過調用官方庫)如下圖所示為GPIO相關驅動代碼:
圖片9.png (22.46 KB, 下載次數: 57)
下載附件
2020-3-26 15:44 上傳
圖片10.png (28.25 KB, 下載次數: 52)
下載附件
2020-3-26 15:44 上傳
完成配置GPIO后,便是對定時器進行配置,我們的STM32是外接了8MHz的晶振的,主頻是72MHz先來看一下時鐘樹圖,如下圖所示。
圖片11.png (2.55 MB, 下載次數: 53)
下載附件
2020-3-26 15:44 上傳
定時器是掛載在APB1時鐘總線下的(從手冊可知),從時鐘樹圖中可知APB1用于定時器的時鐘頻率在未分頻的是情況下72MHz,根據定時器時鐘分頻寄存器(TIMx_PSC)以及定時器自動重裝載寄存器(TIMx_ARR)之間的關系,可以得出,定時時間: Tout=((arr+1)*(psc+1))/Ft s 其中Tout為定時時間單位為s,arr為自動重裝載寄存器的初值,psc為分頻系數,Ft為APB的主頻,也就是72MHz。那么要定時1s則只需要把arr設置為載值9999,psc設置為7199即可,即: Tout=((9999+1)*(7199+1))/72000000 =10000*7200/72000000 =72000000/72000000 =1s 所以可以得到定時器初始化代碼如下圖所示。
圖片12.png (64.09 KB, 下載次數: 61)
下載附件
2020-3-26 15:46 上傳
配置完成后便會1s周期進入一次定時器中斷,在定時器中斷里對無人機的航情燈以及指示燈的GPIO端口進行翻轉即可實現,周期性點亮,代碼如下圖所示。
圖片13.png (32.52 KB, 下載次數: 56)
下載附件
2020-3-26 15:47 上傳
寫好代碼后保存、編譯、下載,然后就可以看到飛控的LED指示燈以及四個螺旋槳下面的航情燈周期1S閃爍,如下圖所示。
圖片14.png (330.16 KB, 下載次數: 62)
下載附件
2020-3-26 15:47 上傳
|