STM32通用定时器、计数器

时间记录:2024/1/30

一、时钟介绍(TIM2-TIM5)

(1)通用定时器时钟频率介绍
STM32通用定时器、计数器_第1张图片
内部时钟AHB为72MHz,经过APB1预分频器2分频变为36MHz,TIMxClk定时器时钟由时钟树可以看出,如果APB1预分频系数不为1则频率x2,所以频率为72MHz
(2)定时时间计算
1.2.1 TIMxCLK的频率为72MHz,一个时钟周期时间为1/TIMxCLK=1/72M(s)
1.2.2 然后经过定时器预分频器对TIMxCLK进行分频,频率为F=TIMxCLK/(TIM_Prescaler+1),TIM_Prescaler为预分频系数,值可以为0x0000-0xFFFF,是一个16位寄存器,经过分频后一个时钟周期时间为(TIM_Prescaler+1)/TIMxCLK(s)
1.2.3 然后根据自动重装载值的数确定计数多少个周期到达指定时间,计时时间time=(TIM_Period+1)/F,TIM_Period为自动重装载值,同样是一个16位寄存器,值可以为0x0000-0xFFFF
1.2.4 计时1s示例,定时器预分频器值设置7199,自动重装载值寄存器值设置9999
F=72M/7200=10K
time=10000/10K=1s

二、TIM通用定时器示例代码

(1)头文件

#ifndef __TIMER_H__
#define __TIMER_H__
#include 

void vTim2Init(u16 psc,u16 arr);
extern void (*vTim2Callback)(void);

#endif

(2)源文件

#include "timer.h"

void (*vTim2Callback)(void);

void vTim2Init(u16 psc,u16 arr)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能时钟
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数
    TIM_TimeBaseInitStruct.TIM_Period=arr-1;//自动重装载值寄存器
    TIM_TimeBaseInitStruct.TIM_Prescaler=psc-1;//定时器预分频器寄存器
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化timer配置timer参数,配置时基参数
    
    //配置中断管理NVIC
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//主优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级
    NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志,使能前先进行清除中断,不然可能会引发错误
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//配置定时器中断
    TIM_Cmd(TIM2,ENABLE);//使能/开启定时器
}

//定时器中断函数
void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//发生中断
        vTim2Callback();//到达时间触发中断,调用回调函数
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
    }
}

你可能感兴趣的:(STM32,stm32,单片机,嵌入式硬件)