TIM定时器分四个部分
目录
一.定时器基本定时功能
二.定时器输出比较功能
三.定时器输入捕获功能
四.定时器编码接口
一.定时器基本定时功能
RCC时钟树
SystmInit函数
外部晶振出问题会导致程序时钟慢了十倍
stm32C8t6 TIM1-4
RCC内部时钟
高级定时器 TIM1,TIM8--APB2总线
PWM波
三相五刷电机
通用定时器 TIM2-5 APB1总线
外部时钟ETR/TRGI
TRGI---外部时钟模式1,它还有触发输入和从模式
ITR信号
ETR,外部引脚---外部时钟模式2 配置极性选择,边沿检测,预分频器
黄字是时基单元
基本定时器 TIM6-7 APB1
只能选择内部时钟72MHZ
预分频器对时钟进行预分频,计数器自增计数,当计数值达到自动重装值时,计数值清零更新中断和更新事件
预分频的值于实际分频系数有一个数的偏移
计数器计数频率:CK_CNT=CK_PSC/(PSC+1)
计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)
移出时间:1/计数器溢出频率
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//运行控制
//配置时钟源选择
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
中断事件源控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
写分频值
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
当前计数器记到哪了
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
#include "stm32f10x.h" // Device header
extern uint16_t NUM;
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
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;//自动重装 少 比较低的频率计比较少的数
TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频 多
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_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);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}