STM32F429通用定时器(TIM)
目錄
一、通用定時器是什么?
1.計數模式
2.工作過程?編輯
3.內部時鐘選擇
二、通用定時器HAL庫函數流程
三、小實驗程序要求
四、代碼實現
1.TIM.h
2.TIM.c
3.main.c
一、通用定時器是什么?
????????通用定時器包含一個 16 位或 32 位自動重載計數器( CNT),該計數器由可編程預分頻器( PSC) 驅動。 STM32F429 的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等。 使用定時器預分頻器和 RCC 時鐘控制器預分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調整。 STM32F429 的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。
1.計數模式
??????? 通用定時器可以向上計數,向下計數、向上向下雙向計數模式。
??????? ①向上計數模式:計數器從0計數到自動加載值(TIMx_ARR),然后重新從0開始計數并且產生一個計數器溢出事件。
??????? ②向下計數模式:計數器從自動加載值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。
??????? ③中央對齊模式(向上/向下計數):計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然后向下計數到1并且產生一個計數器溢出事件;然后再從0開始重新計數。
2.工作過程
??????? 紅色框作用就是產生CK_PSC時鐘,之后經過CK_PSC預分頻器,到CNT計數器,可以通過觸發控制器里的從模式控制器來使CNT復位、使能、遞增/遞減等等。
??????? 四種來源產生CK_PSC時鐘(計數器時鐘可以由以下時鐘源提供):
??????? 1.內部時鐘(CK_INT);
??????? 2.TIMx_ETR(外部時鐘來源);
??????? 3.ITR0-ITR4(定時器級聯:輸出的定時器可以作為輸入)(內部觸發輸入口)經過選擇器選擇哪一路,一路到觸發控制器;
??????? 4.通過外部通道引腳TIMx_CH1和TIMx_CH2,經過Tl1FP1和Tl2FP2選擇器到達觸發控制器。???
3.內部時鐘選擇
???????
??????? 如果APB1分頻系數是1,則CK_INT就是×1倍,就該是多是是多少;如果APB1分頻系數是2或者4或者其他的系數,則CK_INT就得×2倍。
??????? 對于F407,配置系統時鐘為:
??????? SYSCLK = 168M;??????? AHB時鐘 = 168M;??????? APB1時鐘 = 42M;
??????? APB1分頻系數 = AHB / APB1 = 4,所以通用定時器CK_INT = 2 * 42M = 48
二、通用定時器HAL庫函數流程
??????? 1.TIMx時鐘使能(x:2~5)????????拿TIM3為例
??????? HAL_RCC_TIM3_CLK_ENABLE();??????? // 使能TIM3時鐘
??????? 2.初始化定時器參數,設置自動重裝值,分頻系數,計數方式等
??????? HAL_TIM_Base_Init();
??????? 3.使能定時器更新中斷,使能定時器
??????? HAL_TIM_Base_Start_IT;??????? // 使能句柄指定的定時器更新中斷
??????? HAL_TIM_Base_Start;??????? ?? // 使能句柄指定的定時器
???????
??????? 4.TIM3中斷優先級設置
??????? HAL_NVIC_SetPriority(TIM3_IRQn, x, x);
??????? HAL_NVIC_EnableIRQ(TIM3_IRQn);
???????
??????? 5.編寫中斷服務函數(也要編寫中斷回調函數)
??????? void HAL_TIM_IRQHandler();??????? // 中斷服務函數
??????? HAL_TIM_IRQHandler();??????????????? // 中斷處理入口函數
??????? void HAL_TIM_PeriodElapseCallback();??????? // 定時器更新中斷回調函數
三、小實驗程序要求
??????? 通過定時器中斷配置,每500ms中斷一次,然后中斷服務函數中控制LED1實現LED1狀態取反。LED0在主函數利用delay_ms實現1s一次反轉。
??????? ????????????????????????公式:Tout(溢出時間) = (ARR + 1)(PSC + 1) / Tclk
例如500ms:
??????? ARR + 1 = 5000??????? PSC + 1 = 9000??????? Tclk = 90M(STM32F429)
??????? Tout = 500ms
四、代碼實現
1.TIM.h
#ifndef __TIM3_H #define __TIM3_H#include "sys.h"void TIM3_Init(void); #endif2.TIM.c
#include "TIM3.h" #include "led.h"TIM_HandleTypeDef TIM3_Handler; // TIM句柄void TIM3_Init(void) {TIM3_Handler.Instance = TIM3;TIM3_Handler.Init.Period = 4999; // 自動裝載值,公式中會自動加1 TIM3_Handler.Init.Prescaler = 8999; // 預分頻器,公式中會自動加1 TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;HAL_TIM_Base_Init(&TIM3_Handler); // TIM初始化HAL_TIM_Base_Start_IT(&TIM3_Handler); // 使能定時器3,并且開啟更新中斷}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) // Init回調函數 {if (htim->Instance == TIM3) // 定時器中得判斷是否為TIM3,也可也用else if來判斷其他的定時器{__HAL_RCC_TIM3_CLK_ENABLE(); // 時鐘使能HAL_NVIC_EnableIRQ(TIM3_IRQn); // 使能TIM3中斷HAL_NVIC_SetPriority(TIM3_IRQn, 2, 3); // 中斷優先級}}void TIM3_IRQHandler(void) // 中斷服務函數 {HAL_TIM_IRQHandler(&TIM3_Handler); // 中斷處理入口函數}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 中斷回調函數 {if (htim->Instance == TIM3) {LED1 = !LED1; // LED1反轉}}3.main.c
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "TIM3.h"int main() {HAL_Init();Stm32_Clock_Init(360, 25, 2, 8);delay_init(180);uart_init(115200);led_Init(); TIM3_Init();while (1){LED0 = !LED0;delay_ms(1000);}}總結
以上是生活随笔為你收集整理的STM32F429通用定时器(TIM)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wsf
- 下一篇: html5 3d 签到墙,GO互动首创年