TIM---基本定时器

一、定时器简介

    定时器功能:定时、输出比较、输入捕获、互补输出。

    定时器分类:基本定时器、通用定时器、高级定时器。

    定时器资源:407有2个高级定时器、10个通用定时器、2个基本定时器。

    基本定时器:

         1、计数器16bit ,只能向上计数,只有TIM6和TIM7。

         2、没有外部的GPIO,是内部资源,只能用来定时。

         3、时钟来自PCLK1,可实现1 ~ 65535分频。

    各个定时器特性:

二、功能框图

    (1)时钟源

            时钟源来自RCC的TIMx_CLK(属于内部的CK_INT)。

            APB1总线上的定时器时钟 = 42 * 2 = 84MHz。

            APB2总线上的定时器时钟 = 84 * 2 = 168MHz。

    (2)控制器

            控制器用于控制定时器的:复位、使能、计数、触发DAC。

    (3)时基(定时器的心脏)

            定时器最主要的就是时基部分,包括:预分频器、计数器和自动重装载寄存器。

            预分频器:

                16位的预分频器对内部时钟CK_INT进行分频之后,得到计数器的时钟CK_CNT。

                计数器CNT在计数器时钟的驱动下开始计数,计数一次的时间为1/CK_CNT。

            计数器和自动重装载寄存器:

                定时器使能后,计数器CNT在计数器时钟CK_CNT驱动下开始向上计数,当计数器的值与自动重装载寄存器的值相等时,就会自动生成事件并将计数器自动清零,然后自动重新开始计数,如此重复操作。

            影子寄存器:

                预分频器和自动重装载寄存器都有影子寄存器,功能框图上有个影子。

                影子寄存器的存在起到一个缓冲的作用,用户值--->寄存器--->影子寄存器--->起作用,如果不使用影子寄存器则用户值在写到寄存器之后就起作用。

三、定时时间的计算

    1、若定时器挂载在APB2总线上且PSC = 8400-1,则计数器频率 = 84MHz / (PSC + 1) = 10000HZ = 10KHz。

    2、重装载寄存器的值为4999,从0计数到4999,则共计数5000次。

    3、定时时间T = 5000 / 10000 = 0.5s。

四、初始化结构体

    typedef struct

    {

        uint16_t   TIM_Prescaler;               //设置分频因子

        uint16_t   TIM_CounterMode;        //设置计数模式,基本定时器只能向上计数

        uint32_t   TIM_Period;                   //设置自动重装载寄存器的值

        uint16_t   TIM_ClockDivision;        //设置外部输入时钟分频因子,基本定时器没有

        uint8_t   TIM_RepetitionCounter;  //设置重复计数器,基本定时器没有,高级定时器专用

    } TIM_TimeBaseInitTypeDef; 


五、程序

bsp_basic_tim.h文件

#ifndef __BSP_BASIC_TIM_H__
#define __BSP_BASIC_TIM_H__


#include "stm32f4xx_conf.h"

extern void TIM_Config(void);

#endif

bsp_basic_tim.c文件

#include "./base_tim/bsp_basic_tim.h"


/************************
    功能:配置基本定时器
    参数:无
    返回值:无
*************************/
void TIM_Config(void)
{
    TIM_TimeBaseInitTypeDef timBaseInitValue;
    NVIC_InitTypeDef nvicInitValue;
    
    /*1、打开TIM时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
    
    /*2、初始化结构体*/
    timBaseInitValue.TIM_Period = 5000-1;
    timBaseInitValue.TIM_Prescaler = 8400-1;
    TIM_TimeBaseInit(TIM6,&timBaseInitValue);
    
    /*3、清除定时器更新中断标志位*/
    TIM_ClearFlag(TIM6,TIM_FLAG_Update);
    
    /*4、配置NVIC*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    nvicInitValue.NVIC_IRQChannel = TIM6_DAC_IRQn;
    nvicInitValue.NVIC_IRQChannelCmd = ENABLE;
    nvicInitValue.NVIC_IRQChannelPreemptionPriority = 1;
    nvicInitValue.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&nvicInitValue);
    
    /*5、开启定时器更新中断*/
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
    
    /*6、使能定时器*/
    TIM_Cmd(TIM6,ENABLE);
    
}

stm32f4xx_it.c文件

/**************************
    功能:中断服务函数
    参数:无
    返回值:无
***************************/
void TIM6_DAC_IRQHandler(void)
{
    //判断是否由于更新而产生的中断
    if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET )
    {
        LED_ON(1);
        //清除中断标志位
        TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
    }
}

main.c文件

#include "./usart/bsp_usart.h"
#include "./led/bsp_led.h"
#include "./base_tim/bsp_basic_tim.h"
#include "stdio.h"

int main(void)
{
    LED_Config();
    TIM_Config();
    while(1)
    {
        
    }
}
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值