• STM32——TIM2定时器定时


     STM32 中一共有11 个定时器,其中2 个高级控制定时器,4 个普通定时器和2 个基本定时器,以及2 个看门狗定时器和1 个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8 个定时器。关于这8 个定时器的简要说明,如图60 所示。其中TIM1 和TIM8 是能够产生3 对PWM 互补输出的高级定时器,常用于三

    相电机的驱动,时钟由APB2 的输出产生。TIM2-TIM5 是普通定时器,TIM6 和TIM7
    是基本定时器,其时钟由APB1 输出产生。由于STM32 的TIMER 功能比较复杂,
    所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是
    TIM2-TIM5 普通定时器的定时功能。

     因此,就我们现在所学习的通用定时器来说,其完全可以以72MHz 的方式去工作。

     

    关于定时器中断的配置步骤,主要分成以下三步:
    一、 配置嵌套中断控制器NVCI;
    二、定时器初始化配置;
    三、定时器中断函数处理。

     以下代码为核心代码,不包括一些.h文件,都是在一个文件中的。

    一、 配置嵌套中断控制器NVCI;

     1 //1、配置嵌套中断控制器NVIC
     2 void NVIC_config(void)
     3 {
     4     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分组
     5     
     6     NVIC_InitTypeDef nvic;
     7     nvic.NVIC_IRQChannel=TIM2_IRQn;
     8     nvic.NVIC_IRQChannelCmd=ENABLE;
     9     nvic.NVIC_IRQChannelPreemptionPriority=0;
    10     nvic.NVIC_IRQChannelSubPriority=0;
    11     NVIC_Init(&nvic);
    12 }

     二、定时器初始化配置;

     1 //2、定时器初始化配置
     2 void time2_config()
     3 {
     4     TIM_TimeBaseInitTypeDef tim;//结构体
     5     NVIC_config();//优先级函数调用
     6   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
     7     TIM_DeInit(TIM2);//?????
     8     tim.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频
     9     tim.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
    10     tim.TIM_Period=1000;//自动重装载寄存器的值
    11     tim.TIM_Prescaler=35;//时钟预分频
    12     //tim.TIM_RepetitionCounter=
    13     TIM_TimeBaseInit(TIM2,&tim);//初始化结构体
    14     TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志
    15     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    16     TIM_Cmd(TIM2,ENABLE);//开启时钟
    17     
    18 }

     三、定时器中断函数处理。

     1 //TIM2通用定时器
     2 uint16_t count = 0;
     3 void TIM2_IRQHandler(void)
     4 {
     5     
     6     
     7     if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断中断标志是否发生
     8     {
     9         count++;
    10         if(count == 1000)
    11         {
    12             //点亮红灯
    13             red_toggle();//红灯翻转,实现亮一秒灭一秒
    14             //count清零
    15             count=0;
    16         }
    17         //手动清除中断标志位
    18         
    19     }
    20     TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);    
    21 }

     四、LED灯配置

     这是GPIO配置

     1 int led_gpio_init()
     2 {    
     3     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能    
     4     GPIO_InitTypeDef a;
     5     a.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;//可在这修改颜色 另外在主函数也要相应的修改  端口 5是红色 0是绿色  1是蓝色    
     6     a.GPIO_Speed  = GPIO_Speed_50MHz;//设置输出速率50MHz
     7     a.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
     8     GPIO_Init(GPIOB,&a);//初始化GPIO,配置工作方式等
     9     GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);//默认为高电平,灭灯
    10 }

     实现翻转功能

     1 /*红灯翻转*/
     2 /*
     3 *读取电平,如果等于高就执行赋低电平,否则给高电平
     4 */
     5 void red_toggle()
     6 {
     7     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == RESET)//如果检测到低电平
     8     {
     9         GPIO_SetBits(GPIOB,GPIO_Pin_5);//高电平点亮
    10         
    11     }
    12     else
    13     {
    14         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//低点平熄灭
    15     }
    16 }

     五、主函数

     主函数主要调用这个就行

    1  led_gpio_init();//GPIO配置
    2  NVIC_config();//中断优先级配置
    3  time2_config();//定时器TIM2配置

    以STM32TIM6为例讲解定时原理

    熟记一个公式:定时时间=计数器的中断周期*中断的次数

    有一个主角:计数器,他为定时发挥巨大的作用

    计数器是一个16位的计数器,只能往上计数,最大计数值为65535(怎么算最大值??)。

    当计数到这个值的时候,如果使能了中断,定时器就产生溢出中断。

    问题来了:72MHz,36MHz,是什么意思?有什么用?

    MHz是一个频率的单位,36MHz=36000 000Hz,就是每秒产生36000 000次,那么产生一次需要1/36000 000秒,

    那么产生1ms需要多少次??

    单位换算一下,1ms等于1/1000s

    假设需要x次,则x*(1/36000 000)=1/1000

    x=36000

     

    在36MHz的频率下,计数值为36000,可以产生1ms

    再举个例子:

    上面的值实际应用看下面:

  • 相关阅读:
    学习篇之String()
    js之Math对象
    js之date()对象
    css之描点定位方式
    js详解之作用域-实例
    js精要之构造函数
    js精要之继承
    js精要之模块模式
    js精要之对象属性
    js精要之函数
  • 原文地址:https://www.cnblogs.com/kinson/p/8033484.html
Copyright © 2020-2023  润新知