定时器的基本计数功能和PWM输出模式。
1. 计数器功能
计数器功能是定时器提供的最基本的功能,最典型的应用是内部任务的周期性管理。
计数器功能支持定时器的向上,向下和中央对齐方式。
通过预分频寄存器TIMx_PSC设置timer的频率,f(timer) = 系统频率/(TIMx_PSC+1)
通过自动重装载寄存器TIMx_ARR设置timer的触发周期,即多少个计数器周期产生timer中断,在中断里可以设置内部任务的基准计数值(定时周期),定时周期 = f(timer)/TIMx_ARR.
以下是计数器频率为10KHz,1ms产生一次timer中断,即计数精度为1ms的参考代码。
1. hal_timer.c
#include "includes.h"
void hal_timer_func_config(TIM_TypeDef* TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseInitStructure.TIM_Prescaler = 7199; //timer1的频率 = 72000000/7200 = 10KHz
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上,向下还是中央计时模式
TIM_TimeBaseInitStructure.TIM_Period = 9; // 中断1ms发生一次.
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);
}
//2. timer nvic config
void hal_timer_nvic_config()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//3. timer init
void hal_timer_init(TIM_TypeDef* TIMx)
{
hal_timer_func_config(TIM1);
hal_timer_nvic_config();
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清中断
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //中断使能
//enable timer
TIM_Cmd(TIM1,ENABLE);
}
2. stm32f10x_it.c
中断函数中,timer的配置。其中gTimer1_ms_counter和gTimer1_s_counter 供应用程序调用。
uint32_t gTimer1_ms_counter = 0;
uint32_t gTimer1_s_counter = 0;
void TIM1_UP_IRQHandler()
{
//
if(TIM_GetITStatus(TIM1,TIM_IT_Update) == SET){
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
gTimer1_ms_counter++;
if(gTimer1_ms_counter%1000 == 0){
gTimer1_s_counter++;
}
}
}