单片机学习小组
直播中

赵淑洁

7年用户 874经验值
私信 关注

什么是通用定时器?通用定时器怎么使用?

什么是通用定时器?通用定时器怎么使用?

回帖(1)

黎锦荣

2022-1-21 10:16:15
通用定时器概述

STM32F4 的定时器有14个,其中TIM2-TIM5,TIM9~TIM14属于通用定时器,TIM1 和TIM8 则属于高级控制定时器,TIM6和TIM7是基本定时器。




  • TIM2 到 TIM5 主要特性

  16 位(TIM3 和 TIM4)或 32 位(TIM2 和 TIM5) 递增、递减和递增/递减自动重载计数器。
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改) ,分频系数介于 1 到 65536 之间。
多达 4 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿和中心对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路。
发生如下事件时生成中断/DMA 请求(6个独立的IRQ/DMA请求生成器):
— 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
— 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
— 输入捕获
— 输出比较
支持定位用增量(正交)编码器和霍尔传感器电路
外部时钟触发输入或逐周期电流管理



  • TIM9 到 TIM14 主要特性

  16 位自动重载递增计数器(属于中等容量器件)
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 和 65536 之间
多达 2 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路
发生如下事件时生成中断:
— 更新:计数器上溢、计数器初始化(通过软件或内部触发)
— 触发事件(计数器启动、停止、初始化或者由内部触发计数)
— 输入捕获
— 输出比较



  • 定时器的时钟来源有 4 个:

  1)内部时钟(CK_INT)
2)外部时钟模式 1:外部输入脚(TIx)
3)外部时钟模式 2:外部触发输入(ETR) ,仅适用于 TIM2、TIM3、TIM4
4)内部触发输入(ITRx) :使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟) 。

这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1) ,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来自 APB1,而是来自 APB2 的。
定时器配置中断的步骤




  • 使能定时器时钟。
    RCC_APB1PeriphClockCmd();
  • 初始化定时器,配置ARR,PSC。
    TIM_TimeBaseInit();
  • 启定时器中断,配置NVIC。
    NVIC_Init();
  • 设置 TIM3_DIER 允许更新中断
    TIM_ITConfig();
  • 使能定时器。
    TIM_Cmd();
  • 编写中断服务函数。
    TIMx_IRQHandler();

以TIM3为例,延时1秒点亮led灯


#include "tim.h"


/*
定时器说明:
TIM3 -- APB1
定时器TIM3:84MHZ
16位定时器:值范围:0~65535


*/


void Tim3_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
        NVIC_InitTypeDef  NVIC_InitStruct;


        //1、使能定时器时钟。
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   
         //8400分频 84000 000/8400 = 10000HZ  1S数10000个数
        TIM_TimeBaseInitStruct.TIM_Prescaler    = 8400-1;   
        TIM_TimeBaseInitStruct.TIM_Period                = 10000-1;  //计10000个数 在10000HZ下,用时1s
        TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up; //向上计数
        TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子
        //2、初始化定时器,配置ARR,PSC。
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);       
       
        //NVIC通道,在stm32f4xx.h可查看通道 (可变)
        NVIC_InitStruct.NVIC_IRQChannel                                                = TIM3_IRQn;  
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority        = 0x01;                        //抢占优先级
        NVIC_InitStruct.NVIC_IRQChannelSubPriority                        = 0x01;                        //响应优先级
        NVIC_InitStruct.NVIC_IRQChannelCmd                                        = ENABLE;                //使能
    //3、启定时器中断,配置NVIC。
        NVIC_Init(&NVIC_InitStruct);               
       
        //4、设置 TIM3_DIER  允许更新中断
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
       
        //5、使能定时器。
        TIM_Cmd(TIM3, ENABLE);
}


//编写中断服务函数。这个函数不需要程序员在主函数调用,满足条件CPU自行调用的函数
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
        {
                /*处理的程序段*/
                GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分