STM32标准库学习笔记-4.定时器中断

参考教程:【STM32入门教程-2023版 细致讲解 中文字幕】

定时器简介

  1. TIM(Timer)定时器。
  2. 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
  3. 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。
  4. 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。
  5. 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

定时器类型

        STM32F103RCT6上总共有8个定时器,其中TIM1和TIM8是高级定时器,它们挂载在APB2高速总线上。而TIM2、TIM3、TIM4、TIM5是通用定时器,TIM6、TIM7是基本定时器,它们都挂载在APB1上,基本定时器的功能最少,高级定时器功能最多。

定时器框图

通用计时器

基本定时器

高级定时器

定时器基本结构

预分频器时序

PSC为预分频系数,(PSC+1)为分频值。PSC = 1时,信号为2分频。

计数器时序

  • ARR:重装寄存器值(需要+1)
  • PSC:预分频寄存器值(需要+1)
  • ARR预装时序(影子寄存器是否使用):

存在预装时序

不存在预装时序

        框图中结构存在阴影时表示该寄存器具有可选影子寄存器,更改该结构对应的寄存器时,使用影子寄存器时,会在TIM当前计数周期结束前保持原有值,计数周期结束后影子寄存器才装入修改值,影子寄存器作为缓冲,该修改才生效。

#include "stm32f10x.h"    // Device header

void Timer2_Init(void)
{
    //启用系统时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    //让TIM2使用内部时钟
    TIM_InternalClockConfig(TIM2);
    
    //时基单元初始化
    TIM_TimeBaseInitTypeDef TIM2_TimeBaseInitStructure;
    TIM2_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//定时器时钟预分频设置为1,也就是不分频,直接使用相应总线频率
    TIM2_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM2_TimeBaseInitStructure.TIM_Period = 10000 - 1;    //重装值9999
    TIM2_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;    //预分频系数7199,72MHz => 10KHz
    TIM2_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;//TIM1,TIM8有效;STM32定时器用TIM_RepetitionCounter设置重复计数器的值时,当TIM_RepetitionCounter为N时,定时器计数结束后不产生中断而是再重复N次后产生一次中断 。
    TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseInitStructure);
    
    //定时器中断控制
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    TIM_ClearFlag(TIM2,TIM_IT_Update);  //清除标志位避免马上进中断
    
    //使能定时器
    TIM_Cmd(TIM2,ENABLE);
    
    //NVIC配置
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef NVIC_InitTypeDefStructure;
    NVIC_InitTypeDefStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitTypeDefStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitTypeDefStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitTypeDefStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitTypeDefStructure);
    
}

//中断服务程序模板
/*void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
    {
        //...
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    }
}*/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值