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