基本定时器

一、编程要点

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;
		}
	
	}
	
}





猜你喜欢

转载自blog.csdn.net/qq_41985317/article/details/80835963
今日推荐