TIM--基本定时器
类型 | 编号 | 总线 | 功能 |
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
stm32f103c8t6只有TIM1 TIM2 TIM3 TIM4定时器
功能框图:
基本定时器的核心是时基。
1.预分频器PSC:对输入的基准频率提前进行一个分频操作。预分频器可对计数时钟进行预分频, 输出频率=输入频率/(预分频值+1)[最大值65535+1]
2.实际分频值=预分频值+1
3.计数器 计数器CNT是一个16位的计数器,只能向上计数,最大计数值为65535。计数达到自动重装寄存器的时候产生更新事件(中断),并且清零从头开始计数。
4.自动重装载寄存器 存储计数目标,达到目标后清零计数器并产生中断信号。
5 .计数器计数频率: CK_CNT=CK_PSC/(PSC+1)
计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
6.缓冲寄存器:某时刻将预分频器有0改1,当计数到一半的时候改变了分频值,这个变化不会马上生效,⽽是会等到本次计数周期结束时,产⽣了了更新事件,预分频器的值才会被传递到缓冲寄存器⾥⾯去,才会⽣效。
举个例⼦,如果我们想改变ARR寄存器中的值,但是当前的定时还没有结束,在这时如 果未设置影⼦寄存器,那么设定的值会⽴即⽣效。⽽如果设置了影⼦寄存器,那么新的值会 在当前计数周期结束之后⽣效。
定时器常⽤的库函数
void TIM_DeInit(TIM_TypeDef* TIMx);//恢复缺省配置函数
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//时基单元初始化函数
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//时基单元初始化函数
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//结构体变量赋⼀个默认值函数
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalStateNewState);//使能中断输出信号函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟函数
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_tTIM_InputTriggerSource);//选择ITRx其他定时器的时钟函数
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx,uint16_tTIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIx捕获通道的时钟函数
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式1输⼊的时钟函数
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式2输⼊的时钟函数
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//单独配置ETR引脚的预分频器、极性、滤波器这些参数的函数
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
TIM_InternalClockConfig(TIM2);//使⽤内部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分
频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设
置向上计数
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR⾃动重装值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,
⾼级定时器特有
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写⼊参数
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init(&NVIC_InitStructure);//写⼊参数
TIM_Cmd(TIM2, ENABLE);//开启定时器
}