STM32F7xx —— Timer
生活随笔
收集整理的這篇文章主要介紹了
STM32F7xx —— Timer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
STM32F7xx ?—— Timer
?
目錄
STM32F7xx ?—— Timer
一、基礎定時器配置
二、帶回調定時器
?
?
作用:輸出PWM,測量脈沖長度,定時等。
一、基礎定時器配置
// 基本定時器 #define TIMER_CHANNEL TIM3 #define TIMER_PREEMPT_PRIO TIM_PRIORITY #define TIMER_RCC_FUNC __HAL_RCC_TIM3_CLK_ENABLE #define TIMER_IRQ TIM3_IRQn #define TIMER_IRQ_FUNC TIM3_IRQHandler #define TIMER_DIV (10800 - 1) #define TIMER_PERIOD (100 - 1)static TIM_HandleTypeDef timer_handler; // 定時器操作句柄// Period:自動重裝值。 Prescaler:時鐘預分頻數 // 定時器溢出時間計算方法:Tout=((Period+1)*(Prescaler+1))/Ft us. // Ft=定時器工作頻率,單位:Mhz void TimerInit(void) {timer_handler.Instance = TIMER_CHANNEL;timer_handler.Init.Prescaler = TIMER_DIV;timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;timer_handler.Init.Period = TIMER_PERIOD;timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&timer_handler);HAL_TIM_Base_Start_IT(&timer_handler); }// 定時器底層驅動 開啟時鐘 設置中斷優先級 // 此函數會被 HAL_TIM_Base_Init()函數調用 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer) {TIMER_RCC_FUNC();HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);HAL_NVIC_EnableIRQ(TIMER_IRQ); }void TIMER_IRQ_FUNC(void) {HAL_TIM_IRQHandler(&timer_handler); }// 中斷服務函數調用 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer) {if(timer == (&timer_handler)){// do something} }?
二、帶回調定時器
使用回調函數,以鏈表的方式管理所有的定時器。檢測時間到,執行回調函數。TimerRun定時運行,TimerCreate創建一個定時器,TimerStart開啟定時器。這里只是寫了一個比較簡單的定時器,操作系統里面也有類似的定時接口。
#define TIMER_CHANNEL TIM3 #define TIMER_PREEMPT_PRIO TIM_PRIORITY #define TIMER_RCC_FUNC __HAL_RCC_TIM3_CLK_ENABLE #define TIMER_IRQ TIM3_IRQn #define TIMER_IRQ_FUNC TIM3_IRQHandler #define TIMER_DIV (10800 - 1) #define TIMER_PERIOD (100 - 1)static struct {timer_t *next; } timer_run;static volatile uint32_t timer_ticks; static uint32_t timer_ticks_run;static TIM_HandleTypeDef timer_handler; // 定時器操作句柄// Period:自動重裝值。 Prescaler:時鐘預分頻數 // 定時器溢出時間計算方法:Tout=((Period+1)*(Prescaler+1))/Ft us. // Ft=定時器工作頻率,單位:Mhz void TimerInit(void) {timer_run.next = NULL;timer_handler.Instance = TIMER_CHANNEL;timer_handler.Init.Prescaler = TIMER_DIV;timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;timer_handler.Init.Period = TIMER_PERIOD;timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&timer_handler);HAL_TIM_Base_Start_IT(&timer_handler); }// 定時器底層驅動 開啟時鐘 設置中斷優先級 // 此函數會被 HAL_TIM_Base_Init()函數調用 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer) {TIMER_RCC_FUNC();HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);HAL_NVIC_EnableIRQ(TIMER_IRQ); }void TIMER_IRQ_FUNC(void) {HAL_TIM_IRQHandler(&timer_handler); }// 中斷服務函數調用 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer) {if(timer == (&timer_handler)){++timer_ticks;} }//====================================================================================================== void TimerRun(void) {timer_t *timer;timer_t *timer_done;timer_done = NULL;while(timer_ticks_run != timer_ticks){timer = timer_run.next;if(timer){if(timer->ticks){++timer_ticks_run;timer->ticks--;}// 將后續超時的定時器都移除while(timer && (0 == timer->ticks)){timer_run.next = timer->next;timer->next = timer_done;timer_done = timer;timer = timer_run.next;}}else{++timer_ticks_run;}}while(timer_done){timer = timer_done;timer_done = timer->next;timer->next = NULL;timer->handler(timer->param);} }void TimerCreate(timer_t *timer, timer_cb_t handler, void *param) {timer->handler = handler;timer->param = param; }void TimerStart(timer_t *timer, uint32_t timeout) {timer_t *p;uint32_t ticks = (timeout + 9) / 10;TimerCancel(timer);p = (timer_t *)&timer_run;while(p->next){if(ticks <= p->next->ticks){p->next->ticks -= ticks;break;}else{ticks -= p->next->ticks; // ticks 有可能為 0}p = p->next;}timer->ticks = ticks;timer->next = p->next;p->next = timer; }void TimerCancel(timer_t *timer) {timer_t *p;if(NULL == timer){return;}p = (timer_t *)&timer_run;while(p->next){if(p->next == timer){if(timer->next){timer->next->ticks += timer->ticks;}p->next = timer->next;timer->next = NULL;break;}p = p->next;} } static timer_t timer; static void handler(void *param) {TimerStart(&timer, 1000);printf("TimerStart\r\n"); }TimerCreate(&timer, handler, NULL);TimerStart(&timer, 1000);TimerRun(); // 放在10ms任務中運行?
?
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的STM32F7xx —— Timer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序轮播图中间变大_微信小程序实现
- 下一篇: 高手详解SQL性能优化十条经验