STM32通用定时器、计数器

时间记录:2024/1/30

一、时钟介绍(TIM2-TIM5)

(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 <stm32f10x.h>

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);//清除中断标志
    }
}

相关推荐

  1. stm32使用通用定时器生成pwm

    2024-01-31 07:46:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 07:46:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 07:46:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 07:46:04       87 阅读
  4. Python语言-面向对象

    2024-01-31 07:46:04       96 阅读

热门阅读

  1. vue2与vue3部分面试题

    2024-01-31 07:46:04       41 阅读
  2. Dubbo的集群容错策略剖析

    2024-01-31 07:46:04       55 阅读
  3. qt学习:多媒体Multimedia摄像头

    2024-01-31 07:46:04       59 阅读
  4. 在 C# 中 checked 和 unchecked 关键字

    2024-01-31 07:46:04       50 阅读
  5. MyBatis-Plus同款ES ORM框架

    2024-01-31 07:46:04       57 阅读