查看: 2454|回复: 0

【怪兽F7】开始打怪——多样的定时器

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-6 08:48
  • 签到天数: 169 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-6-21 10:34:28 | 显示全部楼层 |阅读模式
    分享到:
    STM32F746的定时器系统还是很丰富的,按功能分为5类。
    一、高级控制定时器,TIM1与TIM8.
    两个定时的主要功能为:


    二、通用定时器TIM2、TIM3、TIM4、TIM5
    主要功能:

    三、通用定时器TIM9~TIM14
    主要功能:

    四、基本定时器TIM6、TIM7
    主要功能:

    五、低功耗定时器LPTIM。
    主要功能:

    可以看到,高级定时器的功能是最多的。
    TIM1/TIM8相比于其他定时器,多了如下4个功能。
    带可编程死区的互补输出。
    重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器。
    2个断路输入,用于将定时器的输出信号置于用户可选的安全配置中。
    时基单元增加了重复计数器寄存器 (TIMx_RCR)
    TIM2、TIM3、TIM4、TIM5除了有16位的模式,还有32位的模式;相比于TIM9~TIM14,多了“支持定位用增量(正交)编码器和霍尔传感器电路”与“触发输入作为外部时钟或者逐周期电流管理”。
    现以TIM3为例,使用一下。
    TIM3的时基单元包括三个:

    预分频器基于16 位/32位寄存器(TIMx_PSC 寄存器)所控制的 16位计数器。
    计数器时钟可由下列时钟源提供

    通过TIM_HandleTypeDef类型的结构体对定时器进行配置。
    TIM_HandleTypeDef结构体成员为:


    寄存器的基地址是选择的TIM3的,
    #define TIM3_BASE             (APB1PERIPH_BASE + 0x0400U)而#define APB1PERIPH_BASE        PERIPH_BASE#define PERIPH_BASE            0x40000000U与手册上的地址是相同的。

    而在初始化过程中,主要使用的是TIM_Base_InitTypeDef类型的成员Init;
    而TIM_Base_InitTypeDef结构体的成员有:

    通过对以上的结构体成员进行如下的赋值,会实现1秒的定时器功能:
    TimHandle.Init.Period            = 10000 - 1;TimHandle.Init.Prescaler         = uwPrescalerValue;TimHandle.Init.ClockDivision     = 0;TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;TimHandle.Init.RepetitionCounter = 0;调用HAL_TIM_Base_Init函数中的TIM_Base_SetConfig函数,将TIM_HandleTypeDef结构体的值写入定时器的寄存器中。
    void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure){  uint32_t tmpcr1 = 0;  tmpcr1 = TIMx->CR1;    /* Set TIM Time Base Unit parameters ---------------------------------------*/  if(IS_TIM_CC3_INSTANCE(TIMx) != RESET)     {    /* Select the Counter Mode */    tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS);    tmpcr1 |= Structure->CounterMode;  }   if(IS_TIM_CC1_INSTANCE(TIMx) != RESET)    {    /* Set the clock division */    tmpcr1 &= ~TIM_CR1_CKD;    tmpcr1 |= (uint32_t)Structure->ClockDivision;  }  TIMx->CR1 = tmpcr1;  /* Set the Auto-reload value */  TIMx->ARR = (uint32_t)Structure-&gteriod ;   /* Set the Prescaler value */  TIMx-&gtSC = (uint32_t)Structure-&gtrescaler;      if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET)    {    /* Set the Repetition Counter value */    TIMx->RCR = Structure->RepetitionCounter;  }  /* Generate an update event to reload the Prescaler      and the repetition counter(only for TIM1 and TIM8) value immediately */  TIMx->EGR = TIM_EGR_UG;}如程序中的CR1寄存器:

    ARR寄存器:

    最后通过函数HAL_TIM_Base_Start_IT打开定时器。
    实际就是对TIMx_DIER寄存器的第6位进行配置。


    还要打开CR1寄存器的CEN位。

    进行了以上的配置,再与前面的LED的程序结合起来,就可以是一个与定时器关联的LED闪烁功能的程序。


    板子结果视频:
    链接:https://pan.baidu.com/s/1c1RJQIO 密码:ptuy

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-16 13:59 , Processed in 0.130458 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.