高档操控定时器(Tim1)是由一个16位的主动装载计数器组成,它由一个可编程预分频器驱动。
用处在于:丈量输入信号的脉冲宽度(输入捕获),或许发生输出波形(输出比较,PWM,嵌入死区时刻的互补PWM等)。
运用定时器预分频器和RCC时钟操控预分频器,能够完成脉冲宽度和波形周期从几个微秒到几个毫秒的调理。
详细如下:
16位上下,主动装载计数器。
16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间恣意数值
4个独立通道:
输入捕获
输出比较
PWM生成
单脉冲形式输出
死区时刻可编程的互补输出
运用外部信号操控定时器和定时器互连的同步电路
在指定数目的计数器周期之后更新定时器寄存器
刹车输入信号能够将定时器输出信号置于复位状况或许一个已知状况
如下事情发生时发生中止:
更新:计数器向上溢出或许向下溢出,计数器初始化。
触发事情(计数器发动,中止,初始化)
输入捕获
输出比较
刹车信号输入
今日咱们来完成用tim1完成计数器的功用:
过程一:进行定时器时钟发动:
void tim1_on()
{
//Step1.时钟设置:发动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
}
过程二:完成对定时器的装备(对其内部寄存器进行装备初始化)
//Step2.TIM1模块设置
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure; //比较PWM的时分用。
//TIM1 运用内部时钟
//TIM_InternalClockConfig(TIM1);
//TIM1根本设置
//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后发生更新事情,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都发生更新事情
TIM_BaseInitStructure.TIM_Period = 1000;
TIM_BaseInitStructure.TIM_Prescaler = 71;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
//清中止,避免一启用中止后当即发生中止
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中止源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
//TIM1总开关:敞开
TIM_Cmd(TIM1, ENABLE);
}
依据上面的提示,咱们能够看到1000*1/1MHz=1ms的时分进入中止一次。
过程三:对定时器中止进行优先等级设置:
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
//Step3.中止NVIC设置:答应中止,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel; //更新事情
NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //呼应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //答应中止
NVIC_Init(&NVIC_InitStructure); //写入设置
}
将这儿根本设备都能好了。
咱们能够进行中止函数的设置,便是进入中止要干什么。
tim1中止有:
TIM1_BRK_IRQHandler(void) //tim1的暂停中止
TIM1_CC_IRQHandler(void)//tim1的捕获比较中止
TIM1_TRG_COM_IRQHandler(void)//tim1的触发
TIM1_UP_IRQHandler(void)//tim1的改写中止和通讯中止。
咱们运用的是向上计数的形式,所以要进入向上计数的中止:
void TIM1_UP_IRQHandler(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
delay_nms(100); //闪灯
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中止
}
将一切的准备工作的做好了,咱们开端写main函数()
如下:
RCC_Configuration();
ledGPIO_init();
//key_init();
tim1_on();
TIM_Configuration();
NVIC_Configuration();
while(1)
{
}
这样就完成了定时器1的计数器功用。