计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。
PSC预分频器,顾名思义,先预备一下分频,有时候频率过高,后面的定时器承受不住,就先用PSC先分频一下。如何分频的?将每接受到一次,PSC就跳动一次,当到了PSC的设置值的时候,再传递到下一个定时器。而PSC的范围计算是从0开始的,所以定时器时钟频率应该为Fosc/(PSC+ 1)。有点类似C的数组,a[3]是a[0],a[1],a[2],但是psc[3]是psc[0],psc[1],psc[2],psc[3]。所以PSC要+1。
举个例子,STM32F10x的总线时钟最大为是72MHz,如果此时我们想要一个1ms的中断,不去分频的话1/72us不好计算,如果我们进行分频(71+1)那么此时分频后频率为1MHz,周期就是1us,再进行1000个机器周期就得到我们想要的1ms。
定时器初始化结构体详解
- typedef struct
- {
- uint16_t TIM_Prescaler; // 预分频器
- uint16_t TIM_CounterMode; // 计数模式
- uint32_t TIM_Period; // 定时器周期
- uint16_t TIM_ClockDivision; // 时钟分频
- uint8_t TIM_RepetitionCounter; // 重复计算器
- } TIM_TimeBaseInitTypeDef;
使用定时器之前必须开启定时器时钟,基本定时器属于 APB1总线外设。APB1总线外设时钟=72MHz。设置自动重装载寄存器 arr 的值为9999,设置时钟预分频器寄存器psc的值为7199,则驱动计数器的时钟:CK_CNT = APB1Periph/ (7199+1)=72MHz/7200=10KHz,计数器计数一次的时间等于:1/CK_CNT=0.0001s,当计数器从0计数到9999时,产生一次中断,则中断一次的时间为:0.0001*10000=1s。
- void TIM2_Configuration(){
-
- //初始化结构体
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- //1.分配时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
-
- //2.初始化定时器相关配置
- TIM_TimeBaseStructure.TIM_Period = 7199;
- TIM_TimeBaseStructure.TIM_Prescaler = 9999;
-
- /*一般设置为TIM_CKD_DIV1,不分频*/
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
-
- //3.打开定时器
- TIM_Cmd(TIM2,ENABLE);
- }