我是靠谱客的博主 现代水杯,最近开发中收集的这篇文章主要介绍STM32F103ZET6 — TIM6/TIM7,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

介绍

STM32F103ZET6 定时器资源非常丰富,根据 datasheet 描述,涵盖如下几种类型:

  • 高级定时器 TIM1 / TIM8
  • 通用定时器 TIM2 / TIM3 / TIM4 / TIM5 
  • 基本定时器 TIM6/ TIM7

本次描述的重点是基本定时器 TIM6/ TIM7

基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。


时钟

可以看到来自 APB1 的低频时钟经过频率x2供给了 TIM2~TIM7,其中包含了 TIM6/ TIM7,所以供给此部分的时钟为 72MHz

在 TIM6 / TIM7 中存在一个预分频器,支持输入的时钟进行预分频,计数器使用预分频后的时钟进行计数:


预分频的参数配置支持 1~65536


模式

TIM6 / TIM7 支持基本的循环计数,计数方式是从小到大。并且可以支持在任何时间内进行预分频系数的配置,配置在下一个UEV产生后生效。(UEV指的是一个更新时间,即一次计数溢出,当然,也可以支持软件进行主动触发)


可以支持 auto reload 和 one shot 的模式,即计数器完成一次计数之后,是自动重载之前的值,继续计数,还是完成一次计数任务后,停止计数。通过配置 TIMx_CR1 的 OPM单脉冲模式 (One-pulse mode) 来选择:



中断

可以通过配置中断,来达到计数器上溢出时刻产生对应的中断


配置过程

1. 打开 TIM6 / TIM7 的时钟

2. 配置中断优先级 NVIC 并使能中断

3. 配置分频系数和计数器的达到溢出的上限数值

4. 启用自动重装载预装载

5. 选择auto reload模式

6. 选择更新源(全开)

7. 开启溢出中断

8. 使能定时器


代码

初始化部分

这里 72MHz 的时钟输入,预分频为 7200(7200 - 1,这里是 datasheet中描述的预分频计算方法),计数为10000次溢出,故产生的是 1s 的定时器:

#define TIM6_CNT    (10000 - 1)
#define TIM6_PSC    (7200 - 1)
static SK_TIM6_NVICConifg(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;


    /* PE5/PE6 */
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void SK_TIM6_Init(void)
{   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    SK_TIM6_NVICConifg();

    /// Step 1 : Open TIM6&TIM7 Clock
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

    /// Step 2 : Set basic settings
    // Input CLOCK = 72MHz
    TIM_TimeBaseStructure.TIM_Period = TIM6_CNT;
    TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PSC;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    TIM_ARRPreloadConfig(TIM6, ENABLE);

    TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Repetitive);

    TIM_UpdateRequestConfig(TIM6, TIM_UpdateSource_Global);

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM6, ENABLE);
}

中断处理部分
void TIM6_IRQHandler(void)
{
    static uint8_t cnt = 0;
    if (TIM_GetITStatus(TIM6, TIM_IT_Update))
    {
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
        if (!cnt)
        {
            SK_SetLedStatus(SK_LED_1, SK_LED_ON);
            cnt++;
        }
        else
        {
            SK_SetLedStatus(SK_LED_1, SK_LED_OFF);
            cnt--;
        }
    }
}


最后

以上就是现代水杯为你收集整理的STM32F103ZET6 — TIM6/TIM7的全部内容,希望文章能够帮你解决STM32F103ZET6 — TIM6/TIM7所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部