小白學習STM32(二)(基於cubemx+MDK)定時器

定時器

定時器的基本概述

STM32的常見的定時器資源: 系統嘀嗒定時器SysTick看門狗定時器WatchDog實時時鐘RTC基本定時器通用定時器高級定時器

系統嘀嗒定時器SysTick :這是一個集成在Cortex M3內核當中的定時器,它並不屬於芯片廠商的外設,也就是說使用ARM內核的不同廠商,都擁有基本結構相同的系統定時器。主要目的是給RTOS提供時鐘節拍做時間基準。
基本定時器:TIM6、TIM7。
通用定時器:TIM2、TIM3、TIM4、TIM5。在基本定時器的基礎上,實現輸出比較、輸入捕獲、PWM生成、單脈衝模式輸出等功能。這類定時器最具***代表性***,使用也***最廣泛***。
高級定時器:TIM1、TIM8。

STM32通用定時器的重要知識點

通用定時器的基本結構組成
STM32的通用定時器,是一個通過可編程預分頻器(Prescaler)驅動的16位自動重裝主計數器(Counter Period)構成。可以對內部時鐘或觸發源以及外部時鐘或觸發源進行計數。

TIMx主要功能:通用TIMx (TIM2、TIM3、TIM4和TIM5)定時器功能包括:

  • 16位向上、向下、向上/向下自動裝載計數器
  • 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲1~65536之間的意
    數值
  • 4個獨立通道:
    • 輸入捕獲
    • 輸出比較
    • PWM生成(邊緣或中間對齊模式)
    • 單脈衝模式輸出
  • 使用外部信號控制定時器和定時器互連的同步電路
  • 如下事件發生時產生中斷/DMA:
    • 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
    • 觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)─
    • 輸入捕獲
    • 輸出比較
  • 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
  • 觸發輸入作爲外部時鐘或者按週期的電流管理
    • 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
      觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)
      輸入捕獲
      輸出比較

通用定時器的==基本工作原理==:
首先,定時器時鐘信號送入16位***可編程預分配器***(Prescaler),該預分配器係數爲0~65535之間的任意數值。預分配器溢出後,會向16位的主計數器(Counter Period)發出一個脈衝信號。
預分頻器,本質上是一個加法計數器,預分頻係數實際上就是加計數的溢出值。

定時器發生中斷時間的計算方法
定時時間 = (Prescaler+1 ) X (Counter Period+1) X 1/ 定時器時鐘頻率(信號的週期)
時鐘信號1KHz,Prescaler爲9,Counter Period爲999,定時時間?

在這裏插入圖片描述

例子:時鐘信號32MHz,每隔500ms翻轉一次PB9的輸出電平

【1】設置Clock Source時鐘源
【2】設置Prescaler和Counter Period參數
【3】設置NVIC嵌套向量中斷控制器

:Prescaler和Counter Period參數的設置不是唯一的,一般設置方法:時鐘信號爲X,則Prescaler爲X-1,需要的時間爲Yms,則Counter Period設置爲Y-1, 上題中,Prescaler和Counter Period參數爲32000和500,32000 * 500/32000 = 0.5s = 500ms

CUBEMX設置

大部分設置和之前寫的一樣,LED腳作GPIO_OUTPUT,配置時鐘源。

  1. 配置定時器TIM2,Prescaler和Counter Period參數設置

在這裏插入圖片描述

  1. 使能TIM2

在這裏插入圖片描述

  1. 配置時鐘數

在這裏插入圖片描述

  1. 生成工程


MDK設置

  1. 編寫回調函數

    stm32l4xx_it.c中生成的中斷處理函數如下,定時器TIM2所有的中斷都會調用該中斷服務函數TIM2_IRQHandler

在這裏插入圖片描述

  1. 在中斷處理函數中自動生成了HAL_TIM_IRQHandler(&htim2)代碼,該代碼會自動根據中斷事件回調相應的函數,這裏我們需要處理更新中斷的事件,回調函數默認是__weak定義的,所以在tim.c中重新定義該回調函數,並且在該函數中添加功能的時候,因爲該回調函數會被所有的==定時器共用==,所以需要先判斷是哪個定時器在調用:

在這裏插入圖片描述

  1. 最後在main函數中開啓TIM2並使能其中斷(TIM2初始化代碼之後,while之前):

HAL_TIM_Base_Start_IT(&htim2);


最後就可以看見LED以0.5S爲週期閃爍了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章