基本定時器

一、編程要點

1、初始化時基結構體

2、配置中斷優先級

3、寫中斷服務函數

4、寫主函數

二、定時時間計算

定時時間 = 中斷週期 * 中斷次數    (以1S爲例)

TIM_Prescaler  ->  TIMxPSC 寄存器
TIM_Period     ->  ARR  (自動重裝載寄存器) 
TIMxCLK 系統時鐘

CK_CLK = 1/(TIMxCLK/(PSC+1))                =1
中斷週期 = 1/(CK_CLK * ARR)                  =0.001s
中斷次數(time) =1000         定時時間  1*0.001*1000=1s

三、結構體&庫函數

1、定時器初始化結構體

typedef struct
{
  uint16_t TIM_Prescaler;         /*!<  預分頻器 配置TIMxPSC 寄存器    */

  //uint16_t TIM_CounterMode;       /*!<  計數器模式 向上/向下 基本定時器不用配置    */

  uint16_t TIM_Period;            /*!<  定時週期  配置 ARR  (自動重裝載寄存器)   */ 

  //uint16_t TIM_ClockDivision;     /*!<  時鐘分頻,設置定時器時鐘 CK_INT 頻率與數字濾波器採樣時鐘
頻率分頻比,基本定時器不用配置   */

  //uint8_t TIM_RepetitionCounter;  /*!<  重複計數器 高級定時器專屬 用於產生多少個PWM波    */
} TIM_TimeBaseInitTypeDef;

2、清除中斷標誌函數

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)

TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update);  	//清除中斷標誌
@brief 清除中斷標誌
@param1:TIM外設號
@param2:要清除的標誌位

3、TIM中斷使能函數

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //開啓中斷使能
@brief :開啓中斷使能
@param1:TIM外設號
@param2:中斷源
@param3:使能或失能

四、中斷服務函數

void TIM6_IRQHandler(void)
{
    Timer++;
    TIM_ClearFlag( BASIC_TIMx,  TIM_FLAG_Update);//清除中斷標誌位	
 
}

五、程序源碼

1、BASIC_Timer.h

#ifndef __BASIC_TIMER_H
#define __BASIC_TIMER_H
#include "stm32f10x.h"

#define RCC_APBxPeriphClockCmd RCC_APB1PeriphClockCmd
#define RCC_APBx_Periph    		 RCC_APB1Periph_TIM6   
#define	BASIC_TIMx						 TIM6
#define TIM_INQx               TIM6_IRQn    


void TIM6_Init(void);
#endif   //__BASIC_TIMER_H

2、BASIC_Timer.c

#include "BASIC_Timer.h"

static void TIM_NVIC_Config(void)						//配置嵌套向量中斷控制器
{
	NVIC_InitTypeDef NVIC_InitStructure;					//定義初始化結構體
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			        //配置NVIC  爲優先級組1
	
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM_INQx;				//中斷源 TIM6
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能中斷通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶佔優先級
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;				//子優先級
	NVIC_Init(&NVIC_InitStructure);
	
	
}


static void BASIC_TimerInit(void)
{
	TIM_TimeBaseInitTypeDef TIM_InitStructure;
	
	RCC_APBxPeriphClockCmd( RCC_APBx_Periph,  ENABLE);
	
	TIM_InitStructure.TIM_Prescaler = 71;
	TIM_InitStructure.TIM_Period = 1000;
	TIM_TimeBaseInit(BASIC_TIMx, &TIM_InitStructure);
	
	TIM_ClearFlag( BASIC_TIMx , TIM_FLAG_Update);  	//清除中斷標誌
	TIM_ITConfig(BASIC_TIMx ,TIM_IT_Update,ENABLE); //開啓中斷使能
	
	TIM_Cmd( BASIC_TIMx, ENABLE);

	//RCC_APBxPeriphClockCmd( RCC_APBx_Periph,  DISABLE);

}

void TIM6_Init(void)
{
	TIM_NVIC_Config();
	BASIC_TimerInit();
}

3、main.c

#include "stm32f10x.h"   // 相當於51單片機中的  #include <reg51.h>
#include "bsp_led.h"
#include "exti.h"
#include "BASIC_Timer.h"

uint32_t Timer=0;

int main(void)
{
	// 來到這裏的時候,系統的時鐘已經被配置成72M。
	LED_GPIO_Config();
	EXTI_Key_Config();
	
	TIM6_Init();
  while(1)
	{
		if(Timer==1000)
		{	
			GPIOB->ODR^=GPIO_Pin_5;// LED1 取反
			Timer=0;
		}
	
	}
	
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章