STM32--定时器简述

概述

这次是STM32中定时器部分的介绍,他与51系统的不同是定时器数量的增加以及寄存器的调用,说白了,库函数还是基于寄存器的。
STM32F103系列的单片机一共有11个定时器:
2个高级定时器、4个通用定时器、2个基本定时器、2个看门狗定时器、1个系统滴答定时器、除去看门狗定时器和滴答定时器,其他8个定时器列表:
STM32--定时器简述_第1张图片
其中,
TIM1和TIM8是高级定时器
TIM2 - TIM5是通用定时器
TIM6和TIM7是基本定时器
这8个定时器都是16位的,它们计数的类型除了基本定时器TIM6和TIM7,都支持向上、向下、向上/向下3种计数模式。
基本定时器(TIM6和TIM7)主要功能:
只有最基本的定时功能。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
通用定时器(TIM2 - TIM5)主要功能:
除了基本的定时器的功能外,还可以测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。
高级定时器(TIM1和TIM8)主要功能:
高级定时器不但具有基本、通用定时器的所有的功能,还具有控制交直流电动机的所有功能。比如它可以输出6路互补带死区的信号,刹车功能等等。
以上摘自STM32官方数据手册!!!
了解了一部分定时器的使用了的话我打算用定时器来实现一个精准的LED闪烁实验:
1.首先新建工程不必说
2.新建两个新建两个文件,tim.c 和 tim.h
STM32--定时器简述_第2张图片
3.在tim.c中添加以下代码

#include “tim.h”
 
void TIMx_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;         //声明TIMx定时器结构体
    NVIC_InitTypeDef NVIC_InitStructure;                   //声明中断优先级结构体
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //配置中断优先级分组
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //使能APB1总线上的TIMx时钟
    
    TIM_TimeBaseStructure.TIM_Period = arr;                       //设置在下一个更新事件活动的自动装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = psc;                    //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;       //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);                //根据指定的参数初始化TIMx的时间基数单位
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                      //允许TIMx中断更新
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;               //配置外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     //设置抢先优先级为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;            //设置子优先级为3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                               //初始化中断优先级
    
    TIM_Cmd(TIM3,ENABLE);                                         //使能TIMx
}
 
 
void TIM3_IRQHandler(void)                                        //TIMx中断服务函数
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)              //检查TIMx更新中断
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);                //清除TIMx中断标志位
        GPIOC->ODR ^= 0X0001<<13;                                 //PC.13高低电平交替翻转
    }
}

定时器中断配置步骤:

  1. NVIC优先级组配置
  2. 使能定时器时钟
  3. 初始化定时器
  4. 设置定时器允许更新中断
  5. 设置定时器中断优先级
  6. 使能定时器
  7. 编写中断服务函数
    STM32--定时器简述_第3张图片实现闪烁,需要注意的是:在中断函数中需要检验一下标志位,因为定时器的所有事件共用一个中断。但只使用更新中断不用检验也是没有问题滴。这也是需要注意的地方之一。。。

你可能感兴趣的:(STM32--定时器简述)