基本定时器:驱动DAC、DMA请求、中断
通用定时器:输入捕获、输出捕获、PWM、单脉冲输出、中断、DMA请求
高级定时器:输入捕获、输出捕获、PWM、单脉冲模式输出、带可编程死区的互补输出、使用外部信号控制定时器且可实现多个定时器互连的同步电路、中断/DMA 请求、支持定位用增量(正交)编码器和霍尔传感器电路、外部时钟触发输入或逐周期电流管理
2.寄存器 2.1定时器时钟使用APB1的定时器
基本定时器:TIM6、TIM7
通用定时器:TIM2-TIM5、TIM12-TIM14
#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) #define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) #define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) #define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) #define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) #define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) #define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) #define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) #define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100)
使用APB2的定时器
通用定时器:TIM9-TIM11
高级定时器:TIM1、TIM8
#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000001) #define RCC_APB2Periph_TIM8 ((uint32_t)0x00000002) #define RCC_APB2Periph_TIM9 ((uint32_t)0x00010000) #define RCC_APB2Periph_TIM10 ((uint32_t)0x00020000) #define RCC_APB2Periph_TIM11 ((uint32_t)0x00040000)2.2定时器配置寄存器
结构体:TIM_TimebaseInitTypeDef
| 结构体成员 | 名称 | 作用 |
|---|---|---|
| TIM_Prescaler | 预分频系数 | 预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。 CK_INT是内部时钟源的频率,根据APB1的倍频器送出的时钟频率。 其值范围是从0 – 65535。 |
| TIM_CounterMode | 计数模式 | 计数模式:向上计数、向下计数、向上向下双向计数 向上模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。 向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。 中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。 |
| TIM_Period | 自动装载值 | 设置定时器自动重载计数周期值,在事件产生时更新到影子寄存器。 其值范围是从0 – 65535。 |
| TIM_ClockDivision | 时钟分频因子 | 设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比。 |
| TIM_RepetitionCounter | 重复计数器 | 通过此参数可以非常简单的控制 PWM 输出个数。此成员只针对于高级定时器配置,基本定时器与通用定时器不用设置。 |
定时器时钟分频因子TIM_ClockDivision是决定数字滤波器采样频率的参数。
3.配置方法(1)使能定时器时钟
配置时钟的时候选择对应的时钟。
(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等
一般配置成通内部时钟源相同数值
(3)设置定时器中断类型,并使能
要先开启中断分组,根据中断优先级分组配置
(4)设置定时器中断优先级,使能定时器中断通道
(5)开启定时器
(6)编写定时器中断服务函数
进入中断服务函数首先检测是否有中断标志位,执行完事件后再清除中断标志位。
void TIM4_Init(u16 per,u16 psc)
{
TIM_TimebaseInitTypeDef TIM_TimebaseInitStructure;//定义时钟结构体
NVIC_InitTypeDef NVIC_InitStructure;//定义中断结构体
//(1)**使能定时器时钟**
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
//(2)**初始化定时器参数,包含自动重装值,分频系数,计数方式等**
TIM_TimebaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimebaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimebaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频因子
TIM_TimebaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimebaseInit(TIM4,&TIM_TimebaseInitStructure);//初始化定时器
//(3)**设置定时器中断类型,并使能**
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
//(4)**设置定时器中断优先级,使能定时器中断通道**
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
//(5)**开启定时器**
TIM_Cmd(TIM4,ENABLE); //使能定时器
}
//调用定时器
TIM4_Init(5000-1,8400-1); //定时500ms,-1是因为定时器预分频器内部会自动加 1
//(6)**编写定时器中断服务函数**
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update))//检测中断标志位
{
led2=!led2;//执行中断事件
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
}
4.定时器工作原理待后续补充
讲解不到位的希望大家指出,有需要我讲解的部分,希望大家提出,我会出文档讲解。



