一、CH32F207VCT6定时器
通用定时器模块包含一个 16 位可自动重装的定时器(TIM2、TIM3、TIM4 和 TIM5),用于测量脉
冲宽度或者产生特定频率的脉冲、PWM 波等。可用于自动化控制、电源等领域。
二、定时器时钟源
1.时钟模式
定时器的时钟源有四种可选,分别为一下四种模式。
- 编码器模式
- 外部时钟模式1
- 外部时钟模式2
- 内部时钟模式
2.内部时钟模式
对于定时器2,3,4,5,6,7挂在APB1总线下如果APB1预分频系数为1那么定时器时钟为APB1时钟的1倍,如果预分频不为1则定时器时钟为APB1的2倍。
对于定时器1,8,9,10 挂在APB2总线下如果APB2预分频系数为1那么定时器时钟为APB2时钟的1倍,如果预分频不为1则定时器时钟为APB2的2倍。
SYSCLK=96M
AHB时钟=96M
APB1时钟=48M
所以APB1的分频系数=AHB/APB1时钟=2所以,通用定时器时钟CK_INT=2*48M=96M。
3.计数模式
定时器计数模式主要有3种,分别为向上计数模式,向下计数模式,中间计数模式
向上计数模式:从0开始计数计数到自动重装载值后计数器会发生溢出,将会产生中断与事件。
向下计数模式:从自动重装载值开始0计数当计数到0时后计数器会发生向下溢出,将会产生中断与事件
中间计数模式:从0开始计数到自动计数装载值字计数到0,将会在向上溢出时产生事件与中断,在向下溢出发生事件中断,中间计数模式只会在从0计数到自动重装载值产生中断。
三、定时器配置
使能定时器外设时钟
初始化定时器
使能定时器中断
初始化NVIC
编写定时器中断服务函数(需要手动清除标志位)
void Timer3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体名字
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体名字
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器时钟
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //定时其分频系数
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //模式选择向上计数
TIM_TimeBaseInitStructure.TIM_Period=arr; //重装载
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //预分频
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //定时器基础功能初始化
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能定时器更新中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //通道使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //从优先级
NVIC_Init(&NVIC_InitStructure); //中断初始化
TIM_Cmd(TIM3,ENABLE); //使能定时器
}
重要函数
TIM_GetITStatus()//获取中断标志位
TIM_ClearITPendingBit()//清除中断标志位
TIM_ITConfig(); //使能定时器中断