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。



  • 相关阅读:
    Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL
    CACHE COHERENCE AND THE MESI PROTOCOL
    Multiprocessor Operating System Design Considerations SYMMETRIC MULTIPROCESSORS
    Organization SYMMETRIC MULTIPROCESSORS
    PARALLEL PROCESSING
    1分钟内发送差评邮件
    Secure Digital
    SYMMETRIC MULTIPROCESSORS
    A Taxonomy of Parallel Processor Architectures
    parallelism
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/11837958.html
Copyright © 2011-2022 走看看