天天看點

【菜鳥必看】stm32定時器的妙用

摘要:本文為你帶來關于stm32定時器的使用的便利和優勢之處。

使用定時器去計算擷取一條的時間

一、初步了解定時器

stm32定時器時鐘圖如下:

【菜鳥必看】stm32定時器的妙用

定時器2-7:普通定時器

定時器1、8:進階定時器

【菜鳥必看】stm32定時器的妙用
【菜鳥必看】stm32定時器的妙用

二、使用定時器

以下,我使用定時器7(以下TIM7)去實作計算擷取一條指令的運作時間。

1.TIM7初始化

以下初始化函數中

  • 入口參數:TIMx:TIM7,arr:重載值,psc分頻值
  • 函數功能:TIM7的定時配置
  • 傳回參數:無
  • 說明:和timer7隻具有更新中斷功能
void Timer7_Init(TIM_TypeDef * TIMx, unsigned short arr, unsigned short psc)     {       TIM_TimeBaseInitTypeDef timer_initstruct;       NVIC_InitTypeDef nvic_initstruct;       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);       nvic_initstruct.NVIC_IRQChannel = TIM7_IRQn;       timer_initstruct.TIM_CounterMode = TIM_CounterMode_Up;       timer_initstruct.TIM_Period = arr;       timer_initstruct.TIM_Prescaler = psc;       TIM_TimeBaseInit(TIMx, &timer_initstruct);       TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);                    //使能更新中斷       nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;       nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1;       nvic_initstruct.NVIC_IRQChannelSubPriority = 1;       NVIC_Init(&nvic_initstruct);       TIM_Cmd(TIMx, ENABLE); //使能定時器     }      

2.中斷服務函數

産生更新中斷時進入

void TIM7_IRQHandler(void)     {         if(TIM_GetITStatus(TIM7, TIM_IT_Update) == SET)         {             TIM_ClearITPendingBit(TIM7, TIM_IT_Update);             timer_info.timer7Out++;         }     }      

其中timer_info為結構體,存放更新次數變量(也可以用靜态變量)

typedef struct     {         unsigned char timer7Out;     } TIM_INFO;     extern TIM_INFO timer_info;     TIM_INFO timer_info = {0};      

3.使用例程

  • 調用初始化函數 Timer6_7_Init(TIM7, 49999, 71);//1us計數一次,50ms中斷一次
  • 關閉定時器,清零計數 TIM_Cmd(TIM7, DISABLE); TIM_SetCounter(TIM7, 0);
  • 在指令之前打開定時器,指令完成之後關閉定時器
  • 計算時間,通過中斷次數、計數器剩餘值判斷。
  • 清零

以下代碼為計算usart1發送"hello word!"的時間

#include "stm32f10x.h"     #include "delay.h"     #include "usart.h"     #include "timer.h"     void Hardware_Init(void)     {         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷控制器分組設定         Delay_Init();            //Systick初始化,用于普通的延時         Usart1_Init(9600);        //初始化序列槽1,波特率9600         Timer6_7_Init(TIM7, 49999, 71);    //1us計數一次,50ms中斷一次         TIM_Cmd(TIM7, DISABLE);        //關閉定時器         TIM_SetCounter(TIM7, 0);        //清零計數器     }     int main(void)     {         unsigned int time = 0;         Hardware_Init();                                    //硬體初始化         while(1)         {             TIM_Cmd(TIM7, ENABLE);                            //使能定時器計時             UsartPrintf(USART1, "\r\nhello word!!n\r\n");             TIM_Cmd(TIM7, DISABLE);                            //關閉定時器             time = timer_info.timer7Out * 50000;            //測算時間-中斷次數*中斷周期             time += TIM_GetCounter(TIM7);                    //擷取目前中斷前的剩餘值             TIM_SetCounter(TIM7, 0);                        //清零             timer_info.timer7Out = 0;             UsartPrintf(USART1, "發送時間: %d微秒\r\n", time);             DelayMs(2500);         }     }      

效果如下

【菜鳥必看】stm32定時器的妙用

點選關注,第一時間了解華為雲新鮮技術~

【菜鳥必看】stm32定時器的妙用

繼續閱讀