美文网首页
stm32---定时器中断

stm32---定时器中断

作者: 飞向深空 | 来源:发表于2019-07-12 14:57 被阅读0次

STM32F1的定时器由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。每个通用定时器都是完全独立的,没有 互相共享的任何资源。

  • 基本定时器的功能最为简单,类似于51单片机内定时器。
  • 通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功- 能。
  • 高级定时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面

有的朋友就会问,这个定时 500ms 是怎么计算的? 很简单,我们知道 TIM4 是挂接在 APB1 总线上的,而 APB1 的时钟是 36MHz, 前面介绍定时器就说过,如果 APB1 时钟分频系数为 1,TIM2-7 的时钟即为 APB1 总线的时钟,否则就是 APB1 总线时钟的 2 倍,即 72MHz。
再根据刚才设计的自 动重装载值和预分频系数就可以计算出定时时间,计算公式如下: Tout= ((per)(psc+1))/Tclk; Tclk 是定时器的时钟频率值,72M,per(定时周期即重加载数) 和 psc(预分配系数) 是我们传递的参数值,Tout 是定时器产生中断的时间,单位是 us。将数据代入即可得到产生定时更新中断 时间是 500ms。
(1000
36000)/72 = 500,000us = 500ms


  1. 开启定时器时钟
  2. 定时器初始化
  3. 设置定时器中断类型并使能
  4. 清除定时器中断标志位
  5. 设置NVIC优先级
  6. 开启定时器
  7. 定时器中断服务函数

现象:led1间隔200ms闪烁,led2间隔500ms闪烁
*time.c

#include "time.h"
#include "led.h"

void TIM4_Init(u16 per,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定时器初始化结构体(2*)
    NVIC_InitTypeDef NVIC_InitStructure;
    
    //1*开启TIM4定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
    
    //2*定时器初始化,在time.c的stm32f10x_tim.h中
    TIM_TimeBaseInitStructure.TIM_Period = per;  //定时周期即重加载数
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;  //预分配系数
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数模式配置:向上计数
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //分频因子,用于信号捕捉,不捕捉就用1
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
    
    //3*设置定时器中断类型并使能
    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
    
    //4*清除定时器中断标志位,防止一开始就进入中断
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
    
    //5*设置NVIC的中断优先级    
    NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    //6*开启定时器
    TIM_Cmd(TIM4,ENABLE);
    
}


//7*定时器中断服务函数,函数名固定,在开启文件里找
void TIM4_IRQHandler()
{
    if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)
    {
        led2=!led2;
    }
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}


time.h

#ifndef _time_H
#define _time_H

#include "system.h"

void TIM4_Init(u16 pre,u16 psc);

#endif

main.c

#include "systick.h"
#include "led.h"
#include "system.h"
#include "time.h"

int main()
{
    u8 i;
    SysTick_Init(72);  //系统时钟初始
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//在misc.c里的misc.h中寻找
    LED_INIT(); 
    TIM4_Init(1000,36000-1); //500ms,定时时间计算公式:((per)*(psc+1))/Tclk,
 //预分频系数为 36000-1,这里减 1 是因为定时器预分频器内部会自动加 1, 所以如果要进行 36000 分频的话,就传递 35999。
    
    while(1)
    { 
        i++;          //每加20就变led状态,每次延时10ms,200ms变换一次
        if(i%20==0)
        {
            led1=!led1;
        }
        delay_ms(10);
    }
}

相关文章

  • stm32---定时器中断

    STM32F1的定时器由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器...

  • stm32---外中断

    抢占式优先级和响应优先级。抢占优先级先判断,如果存在多个中断同时到达且它们的抢占优先级相同则再判断响应优先级如果不...

  • Linux C/C++定时器的实现原理和使用方法

    定时器的实现原理 定时器的实现依赖的是CPU时钟中断,时钟中断的精度就决定定时器精度的极限。一个时钟中断源如何实现...

  • 2017.12.21学习总结

    下午学习了定时器,定时器分为高级定时器、通用定时器和基本定时器,我们主要研究通用定时器。 定时器中断实现步骤:...

  • 多路舵机控制,定时器的分时复用

    多路舵机控制,多个定时器中断法

  • 第11章 定时器和时间管理

    系统定时器是一种可编程硬件芯片,能以固定频率产生中断,也就是定时器中断,其对应的中断处理程序负责更新系统时间,也负...

  • 给8051提供时间

    时间是利用定时器0中断的解决,我们设置定时器0,每个 1 毫秒中断一次,用一个变量,每次中断的时候增加 1,这样子...

  • 4.4每日站报

    DONE STM32定时器中断部分的学习 学习数电译码器部分 写了关于定时器中断的学习笔记 TODO 完成STM3...

  • Arduino基础入门篇18—数字时钟

    Arduino不但有外部中断,还有定时器中断,不同Arduino开发板其定时器数量及性能也各不相同,这取决于开发板...

  • 定时器中断

网友评论

      本文标题:stm32---定时器中断

      本文链接:https://www.haomeiwen.com/subject/yudyxctx.html