单片机:野火的stm32f103系列

目标:掌握定时器的使用

  • 1、简介:

  • stm32定时器包括基本定时器、通用定时器、高级定时器。

  • 2、基本配置步骤

    1. 使能时钟

        // 开启定时器时钟,即内部时钟CK_INT=72M
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    1. 初始化参数

    TIM_Prescaler–预分频

     // 时钟预分频数
     TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;

    TIM_CounterMode–计数模式

    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_Period–重装载值

    TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;

    TIM_ClockDivision–分频因子

    // 时钟分频因子 ,没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;    

    TIM_RepetitionCounter–重复计数器,高级定时器才用到

    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
    1. 设置中断优先级并使能

    // 中断优先级配置
    static void GENERAL_TIM_NVIC_Config(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure; 
        // 设置中断组为0
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        
            // 设置中断来源
        NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQ ;    
            // 设置主优先级为 0
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
          // 设置抢占优先级为3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;    
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    1. 清楚中断标志位

    // 清除计数器中断标志位
    TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update);

    总结:

    使用stm32的定时器功能,首先,需要配置TIM定时器初始化和NVIC中断优先级,配置好后,使用定时器的功能,即计数到一定值,做什么功能。

    一、定时器时钟来自内部时钟72MHz,预分频系数Prescaler的值对72MHz进行缩小,以得到合适的时钟频率,若Prescaler=71时,得到72/(71+1)=1MHz=10^6Hz,则一个周期时间为1/10^6s,自动重装载寄存器的值Period=999时,则定时时间为:(999+1)* (1/10^6)=0.001s。

    代码

    static void GENERAL_TIM_Mode_Config(void)
    {   
          
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;    
        // 开启定时器时钟,即内部时钟CK_INT=72M
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        //GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK, ENABLE);    
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;
        // 时钟预分频数
        TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;    
        // 时钟分频因子 ,没用到不用管
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
        // 重复计数器的值,没用到不用管
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
        // 初始化定时器
        TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
        
        
        // 清除计数器中断标志位
        TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update);
          
        // 开启计数器中断
        TIM_ITConfig(GENERAL_TIM,TIM_IT_Update,ENABLE);
            
        // 使能计数器
        TIM_Cmd(GENERAL_TIM, ENABLE);
    }
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32定时器配置详解

    发表评论