Timer of STM32
下面是STM32得定时器程序,分两个文件Timer.c和Timer.h
/************************************************************************** * 文件名:Timer.h * * 编写人:离逝的风 * * 更新时间:2018.10.6 * * 说明:此文件属于开源,所有权对任何人开放 * * 如有问题请联系邮箱:1477153217@qq.com * * * * 通用定时器(TIM2,3,4,5)配置步骤如下: * * 1.使能定时器时钟,在APB1上 * * 2.设置定时器中断向量优先级和分组 * * 3.配置定时器寄存器(CR1,PSC,DIER,ARR)[注意:ARR需要先置零] * * 4.写中断函数,中断函数一般无返回值和无参数,同时SR寄存器最后一位清零 * ***************************************************************************/ #ifndef __TIMER_H_ #define __TIMER_H_ #include "stm32f10x.h" /**###############################下面为文件配置部分###########################################**/ //开启功能设置为1,否则为0 #define TIM2_EN 1 #define TIM3_EN 0 #define TIM4_EN 0 #define TIM5_EN 0 /*#################################相关宏定义,需用户修改######################################*/ #define TIM2_TIME_PSC 7200 //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz #define TIM2_TIME_ARR 1000 //定义计数值为1000,即定时时间为1000/10000=0.1s #define TIM3_TIME_PSC 7200 //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz #define TIM3_TIME_ARR 1000 //定义计数值为1000,即定时时间为1000/10000=0.1s #define TIM4_TIME_PSC 7200 //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz #define TIM4_TIME_ARR 1000 //定义计数值为1000,即定时时间为1000/10000=0.1s #define TIM5_TIME_PSC 7200 //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz #define TIM5_TIME_ARR 1000 //定义计数值为1000,即定时时间为1000/10000=0.1s /*################################函数接口。供用户调用########################################*/ /*---------------------TIM2---------------------------*/ #if(TIM2_EN==1) void TIM2_Init(void); void TIM2_IRQHandler(void); #endif /*---------------------TIM3---------------------------*/ #if(TIM3_EN==1) void TIM3_Init(void); void TIM3_IRQHandler(void); #endif /*---------------------TIM4---------------------------*/ #if(TIM4_EN==1) void TIM4_Init(void); void TIM4_IRQHandler(void); #endif /*---------------------TIM5---------------------------*/ #if(TIM5_EN) void TIM5_Init(void); void TIM5_IRQHandler(void); #endif #endif //FILE END
/************************************************************************** * 文件名:Timer.c * * 编写人:离逝的风 * * 更新时间:2018.10.6 * * 说明:此文件属于开源,所有权对任何人开放 * * 如有问题请联系邮箱:1477153217@qq.com * * * * 通用定时器(TIM2,3,4,5)配置步骤如下: * * 1.使能定时器时钟,在APB1上 * * 2.设置定时器中断向量优先级和分组 * * 3.配置定时器寄存器(CR1,PSC,DIER,ARR)[注意:ARR需要先置零] * * 4.写中断函数,中断函数一般无返回值和无参数,同时SR寄存器最后一位清零 * ***************************************************************************/ #include "Timer.h" /*#######################################------TIM2------#################################################*/ #if(TIM2_EN==1) void TIM2_Init(void) { RCC->APB1ENR|=(1<<0); //开启TIM2时钟 NVIC_SetPriorityGrouping(2); //设置中断优先级分组为2 NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(2,2,3)); //设置中断为:抢占优先级为2,子优先级为1 NVIC_EnableIRQ(TIM2_IRQn); //使能TIM2中断 TIM2->PSC|=TIM2_TIME_PSC-1; //预分频寄存器写入7200 TIM2->DIER|=(1<<0); //开启更新中断状态 TIM2->ARR&=0X00; //清除自动重装寄存器的值 TIM2->ARR|=TIM2_TIME_ARR-1; //自动重装寄存器1000-1 TIM2->CR1|=(1<<7); //将ARR寄存器值装入缓冲器中 TIM2->CR1|=1<<0; //使能计时器,开始计数 } void TIM2_IRQHandler(void) { /*insert your interrupt program*/ TIM2->SR&=~(1<<0); //清除中断标志位 } #endif /*#######################################------TIM3------#################################################*/ #if(TIM3_EN==1) void TIM3_Init(void) { RCC->APB1ENR|=(1<<1); //开启TIM3时钟 NVIC_SetPriorityGrouping(2); //设置中断优先级分组为2 NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(2,2,2)); //设置中断为:抢占优先级为2,子优先级为2 NVIC_EnableIRQ(TIM3_IRQn); //使能TIM2中断 TIM3->PSC|=TIM3_TIME_PSC-1; //预分频寄存器写入7200 TIM3->DIER|=1<<0; //开启更新中断状态 TIM3->ARR&=0X00; //清除自动重装寄存器的值 TIM3->ARR|=TIM3_TIME_ARR-1; //自动重装寄存器1000-1 TIM3->CR1|=(1<<7); //将ARR寄存器值装入缓冲器中 TIM3->CR1|=1<<0; //使能计时器,开始计数 } void TIM3_IRQHandler(void) { /*insert your interrupt program*/ TIM3->SR&=(~(0X01)); //清除中断标志位 } #endif /*#######################################------TIM4------#################################################*/ #if(PWM4_EN==1) void TIM4_Init(void) { RCC->APB1ENR|=(1<<2); //开启TIM4时钟 NVIC_SetPriorityGrouping(2); //设置中断优先级分组为2 NVIC_SetPriority(TIM4_IRQn, NVIC_EncodePriority(2,2,3)); //设置中断为:抢占优先级为2,子优先级为3 NVIC_EnableIRQ(TIM4_IRQn); //使能TIM2中断 TIM4->PSC|=TIM4_TIME_PSC-1; //预分频寄存器写入7200 TIM4->DIER|=1<<0; //开启更新中断状态 TIM4->ARR&=0X00; //清除自动重装寄存器的值 TIM4->ARR|=TIM4_TIME_ARR-1; //自动重装寄存器1000-1 TIM4->CR1|=(1<<7); //将ARR寄存器值装入缓冲器中 TIM4->CR1|=1<<0; //使能计时器,开始计数 } void TIM4_IRQHandler(void) { /*insert your interrupt program*/ TIM4->SR&=(~(0X01)); //清除中断标志位 } #endif /*#######################################------TIM5------#################################################*/ #if(TIM5_EN==1) void TIM5_Init(void) { RCC->APB1ENR|=(1<<3); //开启TIM5时钟 NVIC_SetPriorityGrouping(2); //设置中断优先级分组为2 NVIC_SetPriority(TIM5_IRQn, NVIC_EncodePriority(2,2,4)); //设置中断为:抢占优先级为2,子优先级为4 NVIC_EnableIRQ(TIM5_IRQn); //使能TIM2中断 TIM5->PSC|=TIM5_TIME_PSC-1; //预分频寄存器写入7200 TIM5->DIER|=1<<0; //开启更新中断状态 TIM5->ARR&=0X00; //清除自动重装寄存器的值 TIM5->ARR|=TIM5_TIME_ARR-1; //自动重装寄存器1000-1 TIM5->CR1|=(1<<7); //将ARR寄存器值装入缓冲器中 TIM5->CR1|=1<<0; //使能计时器,开始计数 } void TIM5_IRQHandler(void) { /*insert your interrupt program*/ TIM5->SR&=(~(0X01)); //清除中断标志位 } #endif //FILE END