zoukankan      html  css  js  c++  java
  • 定时器中断

    1.定时器介绍
        
    STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。基本定 时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本 定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定 时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面

    1.1 通用定时器简介
       
    STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种 用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出 比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个 通用定时器都是完全独立的,没有互相共享的任何资源。
     

    STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能:
    (1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
    (2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。
    (3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为:
             A.输入捕获
             B.输出比较
             C. PWM 生成(边缘或中间对齐模式)
             D.单脉冲模式输出

    (4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。
    (5)发生如下事件时产生中断/DMA请求:
             A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
             B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
             C.输入捕获
             D.输出比较
    (6)支持针对定位的增量(正交)编码器和霍尔传感器电路
    (7)触发输入作为外部时钟或者按周期的电流管理

    1.2 通用定时器结构框图
                    

    在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
    在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器
    进行比较。

    2.通用定时器配置步骤
       (1)使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
       (2)初始化定时器参数,包含自动重装值,分频系数,计数方式等
                 void TIM_TimeBaseInit(TIM_TypeDef*    TIMx ,    TIM_TimeBaseInitTypeDef*   TIM_TimeBaseInitStruct);
                 typedef struct
         {
           uint16_t TIM_Prescaler; //定时器预分频器
           uint16_t TIM_CounterMode; //计数模式
           uint32_t TIM_Period; //定时器周期
           uint16_t TIM_ClockDivision; //时钟分频
                      uint8_t TIM_RepetitionCounter; //重复计数器
                  } TIM_TimeBaseInitTypeDef;

    了解结构体成员功能后,就可以进行配置,例如:
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_TimeBaseInitStructure.TIM_Period=1000;   //自动装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=35999; //分频系数
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
        
    定时器定时时间计算公式如下:
    Tout= ((per)*(psc+1))/Tclk;
    (3)设置定时器中断类型,并使能
    void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
    (4)设置定时器中断优先级,使能定时器中断通道
    NVIC初始化库函数是NVIC_Init();
    (5)开启定时器
    void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
    (6)编写定时器中断服务函数
    TIM4_IRQHandler
    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    if(TIM_GetITStatus(TIM4,TIM_IT_Update))
        {
            ...//执行TIM4更新中断内控制
        }
    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

    固件库中还有两个函数是用来读取状态标志位以及清除中断标志位,函数分别为TIM_GetFlagStatus和TIM_ClearFlag。



  • 相关阅读:
    通过Android studio编写用户注册信息表单(实现用户交互)小demo
    2020年PHP基础学习day01
    js冒泡事件
    关于锚点跳转及jQuery下相关操作与插件
    (11)用css设计电子相册 {上}
    (10)用css建立表单
    (9)css 链接
    (8)css表格
    (8)盒子的定位
    (7)盒子的浮动
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/11837958.html
Copyright © 2011-2022 走看看