STM32F103RCT6定时器的简单使用方法详解
STM32F10xx参考手册英文和中文版
百度网盘:https://pan.baidu.com/s/1Z2nB0WVJIxvm3VOI9MQiiw
提取码:lxlx
STM32F103RCT6数据手册
链接:https://pan.baidu.com/s/1tRchgf-5C1MN4W58vQ9zPg
提取码:lxlx
定时器分类
STM32F103RCT6包括,高级控制定时器TIM1和TIM8,通用定时器TIM2-5,基本定时器TIM6和TIM7.
高级控制定时器TIM1,TIM8
TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意 数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 ─ 输出比较 ─ 刹车信号输入 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理
通用定时器TIM2-5
通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: ● 16位向上、向下、向上/向下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值 ● 4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 使用外部信号控制定时器和定时器互连的同步电路 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 ─ 输出比较 ● 支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理
基本定时器TIM6和TIM7
TIM6和TIM7定时器的主要功能包括: ● 16位自动重装载累加计数器 ● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值 分频 ● 触发DAC的同步电路 ● 在更新事件(计数器溢出)时产生中断/DMA请求
通用定时器函数
初始化
TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//初始化定时器
TIM_Prescaler=psc;//时钟预分频数
TIM_CounterMode;//选择向上计数或向下计数
TIM_Period=arr;//自动重装值
TIM_ClockDivision=CKD;//时钟分频
TIM_RepetitionCounter;//参数设置为0时,时间周期不翻倍
//参数设置为1时,时间周期翻1倍
//参数设置为2时,时间周期翻2倍。
使能
TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//TIMx ——TIM2-5; FunctionalState NewState——ENABLE/DISABLE
中断标志位
TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
//TIMx ——TIM2-5; TIM_IT——TIM_IT_Update
清除中断标志位
TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); //清除中断标志位
//TIMx ——TIM2-5; TIM_IT——TIM_IT_Update
代码实现
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); ///使能TIM2时钟
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStructure.TIM_Period = arr ;//arr:自动重装值。
TIM_TimeBaseInitStructure.TIM_Prescaler = psc ;//时钟预分频数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM2
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器2更新中断
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
TIM_Cmd(TIM2,ENABLE); //使能定时器2
//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET) //溢出中断
{
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
}