寫在前面——
本文将介紹嵌入式競賽實訓平台(CT117E-M4)開發闆上定時器中斷的使用。
目錄
一、硬體平台
三、STM32G4系列定時器簡介
四、配置過程
五、編寫函數
六、總結
一、硬體平台
嵌入式競賽實訓平台(CT117E-M4)是北京國信長天科技有限公司設計、生産的一款“藍橋杯全國軟體與資訊技術專業人才大賽–嵌入式設計與開發科目”專用競賽平台,平台以STM32G431RBT6為主要晶片,預留擴充闆接口,可為使用者提供豐富的實驗場景。
CT117E-M4産片圖檔
二、軟體平台
KEIL5,STM32CubeMX
三、STM32G4系列定時器簡介
從資料手冊當中我們可以找到,STM32G431x6/x8/xB裝置包括兩個進階電機控制定時器、最多六個通用定時器、兩個基本定時器、一個低功耗定時器、兩個看門狗定時器和一個SysTick定時器。下表比較了進階電機控制、通用和基本定時器的功能。
表格中所含的資訊大緻為:
1.進階電機控制定時器(TIM1、TIM8)
先進的電機控制定時器可以看作是8個通道上的四相PWM多路複用。它們具有可程式設計插入死區時間的互補PWM輸出。它們也可以被視為完整的通用計時器。 4個獨立通道可用于:
- 輸入捕獲
- 輸出比較
- PWM生成(邊緣或中心對齊模式),具有全調制能力(0-100%)
- 單脈沖模式輸出
2.通用定時器(TIM2、TIM3、TIM4、TIM15、TIM16、TIM17)
STM32G431x6/x8/xB裝置中最多嵌入六個可同步的通用定時器(差異見上圖)。每個通用定時器可用于産生PWM輸出,或作為一個簡單的時基。
- TIM2、TIM3和TIM4它們是功能齊全的通用定時器:
–TIM2有一個32位自動加載上/下計數器和32位預分頻器
–TIM3和TIM4有16位自動加載上/下計數器和16位預分頻器。
這些定時器具有4個獨立通道,用于輸入捕獲/輸出比較、PWM或單脈沖模式輸出。它們可以 一起工作,也可以通過計時器連結功能與其他通用計時器一起工作,以實作同步或事件連結。計數器可以在調試模式下當機。它們都有獨立的DMA請求生成,并支援正交編碼器。
- TIM15、16和17它們是具有中頻功能的通用定時器:
它們有16位自動重新加載計數器和16位預分頻器
–TIM15有2個通道和1個互補通道
–TIM16和TIM17有1個通道和1個互補通道
所有通道可用于輸入捕獲/輸出比較、PWM或單脈沖模式輸出。定時器可以通過定時器連結功能進行同步或事件連結。定時器具有獨立的DMA請求生成功能。計數器可以在調試模式下當機。
3.基本計時器(TIM6和TIM7)
基本定時器主要用于DAC觸發器的生成。它們也可以用作通用的16位時基。
NOTE:需要注意非常重要的一點就是TIM2、TIM3、TIM4、TIM6、TIM7與APB1總線相連,TIM1、TIM8、TIM15、TIM16、TIM17與APB2總線相連,在下面的配置過程中會介紹到。
四、配置過程
(一)時鐘配置
通過官方給的例程我們一般将時鐘配置為80MHz,這樣APB1總線與APB2總線的時鐘都是80MHz了,在使用時就很友善了 ,下面的定時器配置就要以80MHz為基礎。
(二)定時器配置
基本配置步驟:
1.選擇TIM2
2.定時器時鐘選擇内部時鐘
Clock Source(時鐘來源)
- 選項1 :Internal Clock 内部時鐘
- 選項2 : ETR2 外部觸發輸入(ETR)(僅适用TIM2,3,4)
3.配置參數
- Prtscaler (定時器分頻系數):7999
- Counter Mode(計數模式):Up(向上計數模式)
- Counter Period(自動重裝載值):999
- CKD(時鐘分頻因子):No Division 不分頻 ,選項: 可以選擇二分頻和四分頻
- auto-reload-preload(自動重裝載): Enable 使能
- TRGO Parameters:觸發輸出 (TRGO),不使能,與本節無關
TRGO:定時器的觸發信号輸出 在定時器的定時時間到達的時候輸出一個信号(如:定時器更新産生TRGO信号來觸發ADC的同步轉換)
4.使能定時器中斷
NOTE: 定時器溢出時間是這樣計算的
這裡我們 arr=999,psc=7999,Tclk=80MHz Tout = (1000*8000)/80us = 100ms
五、編寫函數
首先在主函數初始化區域調用:
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); //使能定時器中斷
/* USER CODE END 2 */
在中斷回調函數中可以這樣寫:
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
i++;
if(i==10)
{
i=0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 1);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 1);
}
}
/* USER CODE END 4 */
如果出現程式在延時函數中死循環不出來,可以看看https://blog.csdn.net/m0_57147943/article/details/123518122?spm=1001.2014.3001.5501能不能幫你解決
常用函數:
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); //使能定時器
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); //停止定時器
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); //使能定時器中斷,同時使能定時器
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); //停止使能定時器中斷,同時停止定時器
六、總結
定時器中斷就到這裡了,如果此文章對你有幫助,歡迎
點贊
關注
收藏
轉發