精华内容
下载资源
问答
  • 555定时器原理及应用

    2012-12-07 23:54:56
    555定时器原理及应用
  • 555定时器原理及应用(报告)

    千次阅读 多人点赞 2020-06-15 17:26:37
    555定时器应用 2.1 555定时器组成施密特触发器 2.1.1 电路结构 2.1.2 工作原理 2.2 555定时器组成单稳态触发器7 2.2.1 电路结构 2.2.2 工作原理 2.3 555定时器组成多谐振荡器 2.3.1 电路结构 2.3.2 工作...

    一. 555定时器简介

    1.1 概述

    1.2 应用范围

    1.3 结构及其工作原理

    1.3.1 电路结构

    1.3.2 工作原理

    二. 555定时器的应用

    2.1 555定时器组成施密特触发器

    2.1.1 电路结构

    2.1.2 工作原理

    2.2 555定时器组成单稳态触发器7

    2.2.1 电路结构

    2.2.2 工作原理

    2.3 555定时器组成多谐振荡器

    2.3.1 电路结构

    2.3.2 工作原理

    三. 基于555定时器的救护车发声电路

    3.1 工作原理

    3.2 电路仿真

    参考文献

    555定时器简介

    概述

    555定时器是一种多用途的,集数字、模拟于一体的中规模集成电路,其应用极为广泛。它不仅用于信号的产生和变换,还常用于控制和检测电路中。由于使用灵活、方便,故而在波形的产生与交换、测量与控制、家用电器、电子玩具等许多领域中都得到了广泛应用。

    555定时器分为双极型和CMOS两种类型,它们的结构及其工作原理基本相同岁,没有本质的区别。一般来说,双极型定时器的驱动能力较强,电源电压范围为5~16V,最大的负载电流可以达到200 mA。而CMOS定时器的电源电压范围为3~18V,最大负载电流在4 mA一下,它具有功耗低、输入阻抗高等优点。

    应用范围

    1. 构成施密特触发器(双稳态模式)。此模式下,在DIS引脚空置且不外接电容的情况下,555的工作方式类似于一个RS触发器,可用于构成锁存开关。用于TTL系统的接口,整形电路或脉冲鉴幅等。

    2. 构成单稳态触发器(单稳态模式)。在此模式下,555功能为单次触发,常用于定时延时整形及一些定时开关中。应用范围包括定时器,脉冲丢失检测,反弹跳开关,轻触开关,分频器,电容测量,脉冲宽度调制(PWM)等。

    3. 构成多谐振荡器(无稳态模式)。在此模式下,555以振荡器的方式工作,用于组成信号产生电路。这一工作模式下的555芯片常被用于频闪灯、脉冲发生器、逻辑电路时钟、音调发生器、脉冲位置调制(PPM)等电路中。如果使用热敏电阻作为定时电阻,555可构成温度传感器,其输出信号的频率由温度决定。

    555应用电路采用这3种方式中的1种或多种组合起来可以组成各种实用的电子电路,如定时器、分频器、元件参数和电路检测电路、玩具游戏机电路、音响告警电路、电源交换电路、频率变换电路、自动控制电路等。

    结构及其工作原理

    电路结构

    自从Signetics公司于1972年推出这种产品以后,国际上个主要的电子器件公司也都相继的生产了各自的555定时器产品。尽管产品型号繁多,但是所有双极型产品型号最后的3位数码都是555,所有CMOS产品型号最后的4位数码都是555.而且,它们的功能和外部引脚排列完全相同。


    555定时器电路结构图

    555定时器的内部电路由分压器、电压比较器C1C2、简单SR锁存器、放电三极管TD以及缓冲器G组成,其内部结构如图 1所示。

    555 定时器的功能主要由两个比较器决定。两个比较器的输出电压控制 RS 触发器和放电管的状态。在电源与地之间加上电压,当 5 脚悬空(可对地接上0.01 μF \text{μF} μF 左右的滤波电压),则电压比较器 C1 的同相输入端的电压为   2 3 V cc \ \frac{2}{3}V_{\text{cc}}  32Vcc,C2 的反相输入端的电压为Vcc 若触发输入端 TR 的电压小于   1 3 V cc \frac{\ 1}{3}V_{\text{cc}} 3 1Vcc,则比较器 C2 的输出为 0,可使 RS 触发器置 1,使输出端 OUT=1。如果阈值输入端 TH 的电压大于     2 3 V cc \ \frac{\ 2}{3}V_{\text{cc}}  3 2Vcc,同时 TR 端的电压大于   1 3 V cc \frac{\ 1}{3}V_{\text{cc}} 3 1Vcc*,则 C1 的输出为 0,C2 的输出为 1,可将 RS 触发器置 0,使输出为 0 电平。*如表 1所示,为555定时器管脚的对应功能。

    555定时器管脚对应功能表

      *序号*   *功能*
    -------- -------------------
      *1*      *接地(GND)*
      *2*      *触发输入(TRI)*
      *3*      *输出(Vo、OUT)*
      *4*      *复位(RESET)*
      *5*      *控制电压(THL)*
      *6*      *阈值输入(THR)*
      *7*      *放电端(DISC)*
      *8*      *电源(VCC)*
    

    放电三极管T为外接电路提供放点电路,在使用定时器时,该三极管的集电极(7脚)一般都要外接上拉电阻。

    R D ‾ \overline{R_{D}} RD为直接复位输入端,当 R D ‾ \overline{R_{D}} RD 为低电平时,不管其他的输入端状态如何,其输入端Vo始终为低电平。

    工作原理

    555定时器功能表
    在这里插入图片描述

    如表 2所示:

    • 当v11 >   2 3 V cc > \frac{\ 2}{3}V_{\text{cc}} >3 2Vcc,v12 >   1 3 V cc > \frac{\ 1}{3}V_{\text{cc}} >3 1Vcc时,比较器C1输出低电平,比较器C2输出高电平,简单SR锁存器Q端置0,放电三极管导通,输出端vo为低电平。

    • 当v11 <   2 3 V cc < \frac{\ 2}{3}V_{\text{cc}} <3 2Vcc,v12 <   1 3 V cc < \frac{\ 1}{3}V_{\text{cc}} <3 1Vcc时,比较器C1输出高电平,比较器C2输出低电平,简单SR锁存器置1,放电三极管截止,输出端vo为高电平。

    • 当v11 <   2 3 V cc < \frac{\ 2}{3}V_{\text{cc}} <3 2Vcc,v12 >   1 3 V cc > \frac{\ 1}{3}V_{\text{cc}} >3 1Vcc时,简单SR锁存器R=1,S=1,锁存器状态不变,电路保持原状态不变。

    1. 555定时器的应用

      555定时器组成施密特触发器

    图片来自知网
    施密特触发器(反向)电路结构图
    图片来自知网

    工作原理

    由555定时器功能表可知,当vI <   2 3 V cc < \frac{\ 2}{3}V_{\text{cc}} <3 2Vcc时,vo输出高电平;vI继续增加,若   1 3 V cc < v i \frac{\ 1}{3}V_{\text{cc}} < v_{i} 3 1Vcc<vi<   2 3 V cc \frac{\ 2}{3}V_{\text{cc}} 3 2Vcc,输出vo维持高电平不变;vI继续增加,一旦vI >   2 3 V cc > \frac{\ 2}{3}V_{\text{cc}} >3 2Vcc时,vo由高电平跳变到低电平。如图 3为 555定时器构成的施密特触发器工作波形及电压传输曲线。

    若将施密特触发器控制电压(5脚)接VIC,通过改变VIC可以调节电路回差电压的大小。

    在这里插入图片描述

    555定时器组成单稳态触发器

    在这里插入图片描述
    单稳态触发器电路结构图
    图片来自知网

    工作原理

    在没有触发信号时,vI处于高电平(vI   >   1 3 V cc \ > \frac{\ 1}{3}V_{\text{cc}}  >3 1Vcc),如果接通电源后Q = 0,vo = 0,T导通,电容通过放电三极管T放电,使得vc = 0 。保持低电平不变。如果接通电源后Q = 1,放电三极管T就会截止,电源通过电阻R向电容C充电,当vc上升到   2 3 V cc \frac{\ 2}{3}V_{\text{cc}} 3 2Vcc时,由于R = 0,S = 1,锁存器置0,vo为低电平此时放电三极管T导通,电容C放电,vo保持低电平不变。因此在电路通电后没有触发信号时,电路只有一种稳定状态vo = 0。

    若触发输入端施加触发信号(vI   <   1 3 V cc \ < \frac{\ 1}{3}V_{\text{cc}}  <3 1Vcc),电路的输出状态由低电平跳变为高电平,电路进入暂稳态,放电三极管截止。此后电容C充电,当电容C充电至vc =   2 3 V cc \frac{\ 2}{3}V_{\text{cc}} 3 2Vcc时,电路的输出电压vo 由高电平反转为低电平,同时T导通,于是电容C放电,电路返回到稳定状态。电路工作波形如图 5。

    若忽略T的饱和压降,则可以得到vc从零电平上升到   2 3 V cc \frac{\ 2}{3}V_{\text{cc}} 3 2Vcc需要的时间,即为输出电压vo的脉宽tw

    t w = R C l n 3 ≈ 1.1 R C \begin{matrix} t_{w} = RCln3 \approx 1.1RC \end{matrix} tw=RCln31.1RC
    在这里插入图片描述

    555定时器组成多谐振荡器

    电路结构

    在这里插入图片描述

    工作原理

    在这里插入图片描述

    当电源接通时,电容C被充电,当vc上升到   2 3 V cc \frac{\ 2}{3}V_{\text{cc}} 3 2Vcc时,使得vc为低电平,同时放电三极管T处于导通状态,此时电容C通过R_2和T放电,vc下降,当vc下降到 1 3 V cc \frac{1}{3}V_{\text{cc}} 31Vcc时,vo翻转为高电平。电容充电放电,循环往复,电容器C放电时间为

    t pL = R 2 C l n 2 ≈ 0.7 R 2 C \begin{matrix} t_{\text{pL}} = R_{2}Cln2 \approx 0.7R_{2}C \end{matrix} tpL=R2Cln20.7R2C

    当放电结束时,T截止,Vcc将通过R1、R_2向电容器C充电,vc 1 3 V cc \frac{1}{3}V_{\text{cc}} 31Vcc上升到 2 3 V cc \frac{2}{3}V_{\text{cc}} 32Vcc所需要的时间为

    t pH = ( R 1 + R 2 ) C l n   2 ≈ 0.7 ( R 1 + R 2 ) C \begin{matrix} t_{\text{pH}} = \left( R_{1} + R_{2} \right)Cln\ 2 \approx 0.7\left( R_{1} + R_{2} \right)C\end{matrix} tpH=(R1+R2)Cln 20.7(R1+R2)C

    当vc上升到 2 3 V cc \frac{2}{3}V_{\text{cc}} 32Vcc时,电路又翻转为低电平。如此周而复始,于是,在电路的输出端会得到一个周期性的矩形波。电路的工作波形如图 6所示。

    f = 1 t pL + t pH ≈ 1.43 ( R 1 + 2 R 2 ) C # 2.3.2.3 \begin{matrix} f = \frac{1}{t_{\text{pL}} + t_{\text{pH}}} \approx \frac{1.43}{\left( R_{1} + 2R_{2} \right)C}\# 2.3.2.3 \\ \end{matrix} f=tpL+tpH1(R1+2R2)C1.43#2.3.2.3

    电路输出波形的占空比为

    q ( % ) = R A R A + R B × 100 % # 2.3.2.4 \begin{matrix} q\left( \% \right) = \frac{R_{A}}{R_{A} + R_{B}} \times 100\%\# 2.3.2.4 \\ \end{matrix} q(%)=RA+RBRA×100%#2.3.2.4

    1. 基于555定时器的救护车发声电路

      1. 工作原理

    电路由两只555定时器、电阻、电容、扬声器组成,两只555定时器都工作在多谐振荡状态。555(0)的工作频率比较低,频率由555(0)的第3脚输出振荡方波,通过R3用来控制555(1)的振荡频率。
    在这里插入图片描述
      因为555的第5脚控制端外接一个参考电压,可以改变触发电平值,当555(0)的3脚输出方波为低电平时,通过R3加到555(1)的5脚,555(1)的振荡频率就变低,当555(0)的3脚输出为高电平时,555(1)的振荡频率变高,其变化的信号通过C3,使扬声器发出高、低音交错的鸣救护车的警笛声。改变R4、R5、C2的值,警笛声的频率也会发声相应的变化。

    由之前得到的公式:

    t pH = ( R 1 + R 2 ) C l n   2 ≈ 0.7 ( R 1 + R 2 ) C t_{\text{pH}} = \left( R_{1} + R_{2} \right)Cln\ 2 \approx 0.7\left( R_{1} + R_{2} \right)C tpH=(R1+R2)Cln 20.7(R1+R2)C

    将参数带入,可以计算uo1的高电平持续时间为:

    t pH = 1.1 s t_{\text{pH}} = 1.1s tpH=1.1s

    可以得到uo1 = 11V,Uco=8.8V,UT+=8.8V ,UT-=4.4V。

    T 1 = ( R 1 + R 2 ) Cln U cc − U T − U cc − U T + + R 5 C 2 l n 2 T_{1} = \left( R_{1} + R_{2} \right)\text{Cln}\frac{U_{\text{cc}} - U_{T -}}{U_{\text{cc}} - U_{T +}} + R_{5}C_{2}ln2 T1=(R1+R2)ClnUccUT+UccUT+R5C2ln2

    得到T1,所以低频率 $f_{1}\ $为

    f 1 = 1 T 1 =   611 H z f_{1} = \frac{1}{T_{1}} = \ 611Hz f1=T11= 611Hz

    所以uo1低电平持续时间为

    t L = R 2 C 1 l n 2 t_{L} = R_{2}C_{1}ln2 tL=R2C1ln2

    得到 t L = 1.04 s t_{L} = 1.04s tL=1.04s,uo1 = 0.2V,Uco=8.8V,UT+=6V ,UT-=3V。

    同理,可得到T2 ,继而算出高频率 f 2 = 1 T 2 = 876 H z f_{2} = \frac{1}{T_{2}} = 876Hz f2=T21=876Hz

    电路仿真

    在这里插入图片描述

    在这里插入图片描述

    参考文献

    1. 康华光.电子技术基础------数字部分[M].第五版.高等教育出版社.2005.07:414-423.

    2. 朱红永,陈勇,王博.555定时器构成的报警电路设计[J].内燃机与动力装置,2009,(S1):65-66.

    3. 李莹.555定时器典型应用电路及其PCB设计[J].天津职业院校联合学报,2016,18(04):80-86.

    4. 邹岚.555定时器的典型电路及其实际应用[J].化工自动化及仪表,2017,44(04):406-409+414.

    5. 李君,王兆欣,宋亚姬.论电路实验在555定时器一课中的应用[J].电子测试,2018,(17):115-116.DOI:10.16520/j.cnki.1000-8519.2018.17.061

    6. 姚远香. ne555救护车警笛电路http://www.elecfans.com/d/711627.html[DB/CD]. 2018-07-17

    7. zhouyr006救护车扬声器发声电路https://wenku.baidu.com/view/3ccd93b511661ed9ad51f01dc281e53a59025137.html [DB/CD]2019-03-30

    展开全文
  • STM32 SysTick 滴答定时器原理及应用

    千次阅读 2017-10-30 01:11:18
    SysTick滴答定时器 一、功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器。...二、实现原理 SysTick定时器是一个24位的倒计数,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,
    SysTick滴答定时器
    一、功能
    SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器。SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟。
    无论用作延时还是用作系统心跳时钟,不需要太复杂的功能,SysTick即可胜任。
    二、实现原理
    SysTick定时器是一个24位的倒计数,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,同时可以选择在这个时候产生中断(异常号:15)。
    例如从RELOAD的值为999,那么当倒计数为0时,就会从复位为999继续倒计数。
            只要不把它在SysTick控制及状态寄存器中的使能位清楚,就永不停息,即使在睡眠模式下也能继续工作。
    三、SysTick寄存器(在 core_cm3.h 有定义,凡是 M3 内核的单片机都是一样的)
    #define SysTick             ((SysTick_Type *)       SysTick_BASE) 
    #define SysTick_BASE        (SCS_BASE +  0x0010)
    #define SCS_BASE            (0xE000E000) 
    typedef struct
    {
      __IO uint32_t CTRL;  // 控制及状态寄存器
      __IO uint32_t LOAD;   // 重装载数值寄存器
      __IO uint32_t VAL; // 当前计数数值寄存器
      __I  uint32_t CALIB;  // 校准寄存器
    } SysTick_Type;
    SysTick->CTRL: (可通过 SysTick_CLKSourceConfig() 函数设置)
    COUNTFLAG(16)R: 计数标志位
    当SysTick数到0,则该位被硬件置 1,当读取该位时,将被硬件清零
    CLKSOURCE(2)R/W: 时钟源设置
    1 = 外部时钟源(STCLK) (AHB总线时钟的1/8(HCLK/8))
    0 = 内核时钟(FCLK)  (AHB总线时钟的频率(HCLK))
    TICKINT(1)R/W: 中断使能位
    1 = SysTick 倒数到0时产生 SysTick 异常请求
    0 = 数到 0 时无动作
    ENABLE(0)R/W: SysTick 定时器使能位
    (当中断被使能后,需要关注 void SysTick_Handler(void) 函数)
    SysTick_Type->LOAD: (SysTick_Config() 函数会设置该寄存器)
    RELOAD(23:0)R/W: 重装载数值寄存器
    当SysTick数到0,将被重装载的值
    SysTick_Type->VAL: (SysTick_Config() 函数会设置该寄存器)
    CURRENT(23:0)R/Wc: 当前计数数值寄存器
    读取时返回当前倒计数的值,写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志。
    四、库函数分析
    misc.c
    ----------------------------------------------------------------------------------
    #define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
    #define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)
    #define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
    ((SOURCE) == SysTick_CLKSource_HCLK_Div8))
    void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
    {
      /* Check the parameters */
      assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
      if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
      {
    SysTick->CTRL |= SysTick_CLKSource_HCLK; // 设置 CLKSOURCE 为 1
      }
      else
      {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;       // 设置 CLKSOURCE 为 0
      }
    }

    core_cm3.c
    ----------------------------------------------------------------------------------
    #define SysTick_LOAD_RELOAD_Pos             0                                           
    #define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)
    typedef enum IRQn
    {
    //...
    SysTick_IRQn                = -1, 
    //...
    }IRQn_Type;
    #define __NVIC_PRIO_BITS          4
    #define SysTick_CTRL_CLKSOURCE_Pos          2                                           
    #define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)          

    #define SysTick_CTRL_TICKINT_Pos            1                                           
    #define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)            

    #define SysTick_CTRL_ENABLE_Pos             0                                           
    #define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos) 
    static __INLINE uint32_t SysTick_Config(uint32_t ticks)
      if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
      // 设置计数值为 ticks - 1 
      // 原因1:视频说是执行这些代码需要时间,所以减少一个节拍
      // 原因2:我认为是因为 SysTick 的倒计数到 0,例如设置 1000 ,那么范围就应该是 999 ~ 0。
      SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;     
      // 设置中断优先级
      NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 
      SysTick->VAL   = 0;                                
      // 设置时钟源为外部时钟源,同时开启中断、并使能 SysTick 定时器
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
       SysTick_CTRL_TICKINT_Msk   | 
       SysTick_CTRL_ENABLE_Msk;                   
      return (0);                                                 
    }
    五、延时应用
    1、中断方式
    static __IO uint32_t TimingDelay;
    void Delay(__IO uint32_t nTime)
       TimingDelay = nTime;
       while(TimingDelay != 0);
    }
    /* 中断服务函数 */
    void SysTick_Handler(void)
    {
    if (TimingDelay != 0x00) 
    TimingDelay--;
    }
    }
    int main(void)
    {  
    // ...
    if (SysTick_Config(SystemCoreClock / 1000)) // 注意,这里systick时钟为HCLK,中断时间间隔1ms 
    {
    while (1);
    }
    while(1)
    {
    Delay(200);//2ms
    // ...
    }
    }
    SysTick_Config(SystemCoreClock / 1000): (原代码这里假设是采用时钟源为 HCLK)
    这里设置的是 72000000Hz / 1000 = 72000 ticks,也就是说 SysTick 从 (72000-1) 开始倒数。
    每倒数完 72000 个节拍就触发一次中断。
    一个节拍的时间为:72000000 / 72000 = 1000us == 1ms
    SysTick_Config((SystemCoreClock / 8000000) * 1000 * 1): 
    SysTick_Config() 会设置时钟源为 HCLK/8 所以实际应用中不能按照上述代码的参数。
    SystemCoreClock / 8000000: 1us 的节拍数
    1us的节拍数 * 1000: 则为 1ms 的节拍数
    1ms 的节拍数 * 1: 设置 1ms 一个SysTick中断,即从 ((SystemCoreClock / 8000000) * 1000 * 1) - 1 开始倒数。
    2、轮询方式
    static u8  fac_us=0; //us延时倍乘数    
    static u16 fac_ms=0; //ms延时倍乘数
    void delay_init()
    {
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟  HCLK/8
    fac_us = SystemCoreClock/8000000;         // 为系统时钟的1/8  1us = 72000000 / 8000000 =  9 个节拍
    fac_ms = (u16)fac_us*1000; // 1ms 需要 9 * 1000 = 9000 个节拍
    }
    //延时 nus 微秒         
    void delay_us(u32 nus)
    {
    u32 temp;
    SysTick->LOAD=nus*fac_us;  //时间加载     
    SysTick->VAL=0x00;          //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;                //开始倒数
    do
    {
    temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达  
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器
    SysTick->VAL =0X00;                     //清空计数器  
    }
    //延时nms
    //注意nms的范围
    //SysTick->LOAD为24位寄存器,所以,最大延时为:
    //nms<=0xffffff*8*1000/SYSCLK
    //SYSCLK单位为Hz,nms单位为ms
    //对72M条件下,nms<=1864 
    void delay_ms(u16 nms)
    {        
    u32 temp;    
    SysTick->LOAD=(u32)nms*fac_ms;   //时间加载(SysTick->LOAD为24bit)
    SysTick->VAL =0x00;                       //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;  //开始倒数 
    do
    {
    temp=SysTick->CTRL;
                    //等待时间到达,这里使用了一个小技巧,通过(temp&0x01)检查 SysTick 的使能位,避免 Systick 定时器被关闭而导致无限循环 
    }while((temp&0x01)&&!(temp&(1<<16)));  
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
    SysTick->VAL =0X00;                      //清空计数器        
    展开全文
  • 本文注意介绍了基本定时器,并提供了两种方式做led闪烁实验,一种为有中断,一直为无中断,即查询定时器

    前言

    在前面我们说了系统滴答定时器(systick)。这里说定时器(TIM)。
    关于这两个的区别如下:
    1.systick属于内核上的外设。TIM是片上外设。
    2.systick计数值为24位,且只能向下递减计数。TIM计数值位16位,且有向上计数(TIM6/7),可以向上也可以向下技术(除了TIM6/7以外其他计数器)。
    3.systick通常为操作系统服务。

    1.定时器概念

    STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。
    基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。
    通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。
    高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。
    在这里插入图片描述

    2.基本定时器结构TIM6/7

    基本定时器 TIM6 和 TIM7 还可以为DAC(数模转换器提供时钟).
    就内部结构讲解:
    在这里插入图片描述

    2.1 时钟源

    定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果
    APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。

    2.2 计数器时钟

    定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。
    具体计算方式为: CK_CNT=TIMxCLK/(PSC+1)

    2.3 计数器

    计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。

    2.4 自动重装载寄存器

    自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
    这里要说明一点,定时器溢出后可以产生中断也可以不产生。具体的区别会在下面的程序中说明。

    3.定时时间计算

    定时器的一次定时时间等于计数器的中断周期乘以中断的次数。
    计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于: 1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于: 1/(CK_CLK * (ARR+1))。
    即(ARR+1)(PSC+1)/TIMxCLK。
    如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 :
    (ARR+1)
    (PSC+1)/TIMxCLK*time。

    4.定时器初始化结构体

    对定时器外设建立了四个初始化结构体,基本定时器只用到其中一个即 TIM_TimeBaseInitTypeDef,其他三个我们在通用/高级定时器章节讲解。

    typedef struct {
    	uint16_t TIM_Prescaler; // 预分频器
    	uint16_t TIM_CounterMode; // 计数模式
    	uint32_t TIM_Period; // 定时器周期
    	uint16_t TIM_ClockDivision; // 时钟分频
    	uint8_t TIM_RepetitionCounter; // 重复计算器
    } TIM_TimeBaseInitTypeDef;
    

    1.预分频器时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC 寄存器的值。可设置范围为 0 至 65535,实现 1 至 65536 分频。
    2.定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化
    3.定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535。
    4.时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。
    5.重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。这里不用设置。

    注意:影子寄存器的引入是ARM的一个特点。在框图表示上下面有一个阴影。
    这表示在物理上这个寄存器对应2个寄存器:一个是我们可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器.数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。

    5.实验:精确定时的led闪烁(无中断)

    前面我们说了,定时器溢出之后可以中断也可以不中断,那么不中断,就去查询它的溢出标志位(TIM_FLAG_Update)。
    bsp_basetim.h内容:

    #ifndef __BSP_BASETIM_H
    #define __BSP_BASETIM_H
    
    #include "stm32f10x.h"
    
    
    /********************基本定时器TIM参数定义,只限TIM6、7************/
    #define BASIC_TIM6 // 如果使用TIM7,注释掉这个宏即可
    
    #ifdef  BASIC_TIM6 // 使用基本定时器TIM6
    #define            BASIC_TIM                   TIM6
    #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
    #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
    //计时1ms
    #define            BASIC_TIM_Period            (1000-1)
    #define            BASIC_TIM_Prescaler         (72-1)
    
    
    #else  // 使用基本定时器TIM7
    #define            BASIC_TIM                   TIM7
    #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
    #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM7
    #define            BASIC_TIM_Period            (1000-1)
    #define            BASIC_TIM_Prescaler         71
    
    
    #endif
    
    void BASIC_TIM_Config(void);
    
    void TIM_Delay_Ms( __IO uint32_t ms);
    
    
    #endif /* __BSP_BASETIM_H */
    

    bsp_basetim.c内容:

    #include "bsp_basetim.h"
    
    void BASIC_TIM_Config(void)
    {
    		TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    		
    		// 开启定时器时钟,即内部时钟CK_INT=72M
        BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
    	
    		// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;	
    
    	  // 时钟预分频数为
        TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
    	
    		// 时钟分频因子 ,基本定时器没有,不用管
        //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    		
    		// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
        //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
    		
    		// 重复计数器的值,基本定时器没有,不用管
    		//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    	
    	  // 初始化定时器
        TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
    		
    		// 清除计数器中断标志位
        TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
    	  
    		// 开启计数器中断
       // TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
    		
    		// 使能计数器
        TIM_Cmd(BASIC_TIM, ENABLE);
    		
    		while( TIM_GetFlagStatus(BASIC_TIM, TIM_FLAG_Update)==RESET	);
    		
    }
    
    void TIM_Delay_Ms( __IO uint32_t ms)//计时多少ms,在这里传递参数
    {
    	uint32_t i;
      for (i=0; i<ms; i++) 
    	{
    			BASIC_TIM_Config();
    	}
    }
    
    

    main.c内容:

    #include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
    #include "bsp_led.h"
    #include "bsp_basetim.h"
    
    
    int main(void)
    {
    	// 来到这里的时候,系统的时钟已经被配置成72M。
    	LED_GPIO_Config();
    	
    	while(1)
    	{
    		//GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
    		LED_G(ON);
    		//Delay(0xFFFFF);
    		TIM_Delay_Ms(500);
    		
    		//GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
    		LED_G(OFF);
    		//Delay(0xFFFFF);
    		TIM_Delay_Ms(500);
    	}
    }
    

    6.实验:精确定时的led闪烁(有中断)

    1-基本定时器产生500MS定时
    2-在中断函数里面让LED反转

    bsp_basetim.h内容:

    #ifndef __BSP_BASETIM_H
    #define __BSP_BASETIM_H
    
    #include "stm32f10x.h"
    
    
    /********************基本定时器TIM参数定义,只限TIM6、7************/
    #define BASIC_TIM6 // 如果使用TIM7,注释掉这个宏即可
    
    #ifdef  BASIC_TIM6 // 使用基本定时器TIM6
    #define            BASIC_TIM                   TIM6
    #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
    #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
    #define            BASIC_TIM_Period            (1000-1)//定时500 ms
    #define            BASIC_TIM_Prescaler         (36000-1)
    #define            BASIC_TIM_IRQ               TIM6_IRQn
    #define            BASIC_TIM_IRQHandler        TIM6_IRQHandler
    
    #else  // 使用基本定时器TIM7
    #define            BASIC_TIM                   TIM7
    #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
    #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM7
    #define            BASIC_TIM_Period            (1000-1)
    #define            BASIC_TIM_Prescaler         (36000-1)
    #define            BASIC_TIM_IRQ               TIM7_IRQn
    #define            BASIC_TIM_IRQHandler        TIM7_IRQHandler
    
    #endif
    
    void BASIC_TIM_Init(void);
    
    
    #endif /* __BSP_BASETIM_H */
    

    bsp_basetim.c内容:

    #include "bsp_basetim.h"
    /*
    
    1-基本定时器产生500MS定时
    2-在中断函数里面让LED反转
    
    编程要点
    1-配置时基初始化结构体
    2-开启定时器更新中断(即定时时间到了)
    3-配置中断优先级
    4-使能定时器
    5-编写中断服务函数
    6-编写main函数
    
    */
    
    // 中断优先级配置
    static void BASIC_TIM_NVIC_Config(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure; 
        // 设置中断组为0
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);		
    		// 设置中断来源
        NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;	
    		// 设置主优先级为 0
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	 
    	  // 设置抢占优先级为3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    
    static void BASIC_TIM_Config(void)
    {
    		TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    		
    		// 开启定时器时钟,即内部时钟CK_INT=72M
        BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
    	
    		// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;	
    
    	  // 时钟预分频数为
        TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
    	
    		// 时钟分频因子 ,基本定时器没有,不用管
        //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    		
    		// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
        //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
    		
    		// 重复计数器的值,基本定时器没有,不用管
    		//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    	
    	  // 初始化定时器
        TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
    		
    		// 清除计数器中断标志位
        TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
    	  
    		// 开启计数器中断
        TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
    		
    		// 使能计数器
        TIM_Cmd(BASIC_TIM, ENABLE);
    }
    
    void BASIC_TIM_Init(void)
    {
    	BASIC_TIM_NVIC_Config();
    	BASIC_TIM_Config();
    }
    
    

    主函数内容都是一样的。

    后记

    基本定时器,只具备最基本的定时功能。产生中断或DMA操作。驱动DAC。

    展开全文
  • 针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器、通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器原理应用。对于通用定时器根据...

    一、简介:

        不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器、通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器的原理和应用。对于通用定时器根据位数和计数方式的不同又可以分为3类,相关分类的图表如下:

    二、应用:

        1、更新:计数器的上溢或下溢。2、事件触发。3、输入捕获。4、输出比较。5、支持针对定位的增量编码和霍尔传感器电路。5、触发输入作为外部时钟或按周期电源管理。下边会针对部分应用做相关介绍和代码分析。

    三、框图:

        下图是通用定时器TIM2~TIM5的框图,其他定时器的框图和该框图是类似的,只不过是在该框图的基础上做相应的裁剪做出小的变动。

    下边对定时器的框图做相关拆解,并对各个部分做相关分析。

    四、时钟选择及分频:

        这部分的功能由框图的如下图部分产生:

        由图中可以发现时钟来源有:1、内部时钟(CK_INT)。2、外部时钟模式1;外部引脚TIx,由输入捕获部分产生。3、外部时钟模式2;外部触发输入ETR。4、内部触发输入ITRx,该时钟是由另一个定时器输出产生的,对应到框图中的TRGO。经过相应的选择后产生时钟CK_PSC。

        这部分同时会在相关寄存器设定计时器的计数模式、复位和使能等相关操作。

    五、时基单元

        时基单元框图如下:

        其中包括:1、PSC预分频器;负责对选择的时钟CK_PSC分频,产生最终计数器用到的时钟CK_CNT。2、CNT计数器:负责计数,做为定时器的核心单元。3、自动重载寄存器:负责在相关事件触发后,将寄存器中的值装载到计时器中。

    六、输入捕获

        对输入捕获功能的基本描述就是;通过检测TIM_CHx上的边沿信号,在信号跳变时,将当前计数器的值存放到相应的捕获/比较寄存器中。该功能部分在框图中如下图所示:

        其实这是定时器的4个相关通道,拿出其中一个做相关分析,其中一个通道的框图如下:

        TI1为通道输入信号,经过滤波后产生TI1F,再经过边沿检测(上升沿或下降沿),再经过相关选择后产生的信号通过分频器分频后产生最后需要捕获的信号。

        对于输入捕获相关库函数介绍如下;

        void TIM_ICInit(TIM_TypeDef* TIMx,TIM_ICInitTypeDef* TIM_ICInitStruct);   //设置通道的相关参数。
        void TIM_OCxPolarityConfig(TIM_TpeDef* TIMx,uint16_t TIM_OCPolarity);   //通道极性设置。
        uint32_t TIM_GetCapturex(TIM_TypeDef* TIMx);   //获取通道捕获值。

    七、输出比较

        对输出比较功能的描述:在CCRx寄存器中设定相应的值,计数器中的值与该值做比较,根据比较结果和相应的极性和有效性设定,确定输出电压的高低电平状态。和输入捕获相同,拿出其中一个通道进行分析,其中一个通道的框图如下:

        通道信号经过输出模式控制器,做出模式、极性以及开关等设置后获得需要的输出信号。CCRx:捕获比较寄存器,用于设定比较值。CCMRx:设置PWM的模式。CCER:CC1P位设置极性有效性。CCER:CC1E位输出使能设定。

        对输出比较相关库函数介绍如下:

        void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)     //设置相关通道的参数。
        void TIM_SetComparex(TIM_TypeDef* TIMx, uint32_t Comparex);    //设置比较值。
        TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  //使能输出比较预装载。

        TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, ENABLE);//使能自动重装载预装载寄存器
    


    八、相关初始化实例——输入捕获

    //定时器5通道1输入捕获配置
    //arr:自动重装值(TIM2,TIM5是32位的!!)
    //psc:时钟预分频数
    void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  	//TIM5时钟使能    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
    	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0
    
    	GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5
      
    	  
    	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    	
    	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
    	
    
    	//初始化TIM5输入捕获参数
    	TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 	选择输入端 IC1映射到TI1上
            TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获
            TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
            TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //配置输入分频,不分频 
            TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
            TIM_ICInit(TIM5, &TIM5_ICInitStructure);
    		
    	TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断	
    	
            TIM_Cmd(TIM5,ENABLE ); 	//使能定时器5
    
     
            NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、	
    }

    九、相关初始化实例——PWM输出

    //TIM14 PWM部分初始化 
    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    void TIM14_PWM_Init(u32 arr,u32 psc)
    {		 					 
    	//此部分需手动修改IO口设置
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);  	//TIM14时钟使能    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	//使能PORTF时钟	
    	
    	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
    	GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
    	  
    	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    	
    	TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
    	
    	//初始化TIM14 Channel1 PWM模式	 
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
     	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
    	TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
    
    	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
     
            TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 
    	
    	TIM_Cmd(TIM14, ENABLE);  //使能TIM14										  
    }  
    

     
    

    
    展开全文
  • MSP430单片机定时器原理应用 ,timer-A,以及各种定时器的原理
  • 555定时器原理应用

    2011-08-07 20:54:04
    555原理 定时器 应用,例题指导希望下载,很好资源
  • 介绍了应用555定时器原理。经典脉冲波形的产生及其整形
  • 单片微机的定时器计数器原理及应用,详细讲述了单片机定时器的工作原理
  • 例7-3 已知晶振频率fosc=12MHz要求定时器0产生10ms的定时时间试对定时器进行初始化编程 解由于晶振频率为12MHz机器周期Tcy=1s选用方式0时最大定时时间8.192ms选择方式1时最大定时时间为65.536ms要求的定时时间为10ms...
  • 555定时器工作原理及应用引脚图.doc
  • 定时器是的重点中的重点,但不是难点,大家一定要完全理解并且熟练掌握定时器应用定时器的初步认识时钟周期:时钟周期t是时序中最小的时间单位具体计算的方法就是1/时钟源,如果大家用的晶振是11.0592m,那么...
  • 单片机定时器,讲解非常清晰,值得参考!!!!!!!!! 单片机定时器,讲解非常清晰,值得参考!!!!!!!!!
  • 555定时器(时基电路)是一种用途广泛的模拟数字混合集成电路。1972年由西格尼蒂克斯公司(Signetics)研制;设计新颖、构思奇巧,备受电子专业设计人员和电子爱好者青睐;它可以构成单稳态触发器、多谐振荡器、...
  • 单片微型计算机原理与接口技术(第二版):第六章单片微机的定时器计数器原理及应用.ppt
  • 定时器原理

    2013-11-17 21:54:47
    本图片是应用于STM32的定时器原理图,图片清晰,结构表达清楚,希望大家喜欢
  • 本篇文章基于CC2530单片机,介绍了定时器原理及使用,通过定时器1实现了0.5S的定时,控制LED灯1Hz闪烁。 完整的源代码 #include <ioCC2530.h> //定义控制灯的端口 #define LED1 P1_...
  • 定时器原理

    2021-05-20 12:11:21
    定时器的实现依赖的是CPU时钟中断,时钟中断的精度就决定定时器精度的极限。一个时钟中断源如何实现多个定时器呢?对于内核,简单来说就是用特定的数据结构管理众多的定时器,在时钟中断处理中判断哪些...作为应用.
  • 定时器工作原理及其应用

    千次阅读 2020-05-21 20:38:29
    1 定时器T0和T1 2 定时器/计数器的4种工作方式 2.1 方式0 2.2 方式1 2.3 方式2 2.4 方式3 1)工作方式3下的T0 2)T0工作在方式3下T1的各种工作方式 1 定时器T0和T1 T0和T1是2个独立的16bit向上计数定时器...
  • 定时器/计数器 41定时器/计数器T0和T1 411定时器/计数器T0和T的结构功能 412定时器计数器T0和T1的功能寄存器 413定时器/计数器T和T1的工作方式 414定时器/计数器T0和T1应用举例 42定时器什数器T2 42,1定时器/...
  • 定时器:设置一个定时器,在设置一个等待的时间,到达指定时间后,执行对应的操作  window.setInterval([function],[interval])  设置一个定时器,到达指定的时间interval ,执行我们的操作function,然后定时器...
  • 浅谈555定时器原理及其应用,都是一些很常用的应用!很有参考价值!
  • 单片机原理及应用教程 C语言版第6章 MCS-51单片机定时器/计数器主 编周国运中国水利水电出版社第6章 MCS-51单片机定时器/计数器目 录6.1 单片机定时器/计数器的结构及原理6.2 定时器/计数器T0T16.3 定时器/计数器T...
  • 555定时器功能及应用

    2009-01-06 11:43:00
    555电路功能介绍与应用设计 555时基电路是一种将模拟功能与逻辑功能巧妙地结合在同一硅片上的组合集成电路。该电路可以在最基本的典型应用方式的基础上,根据实际需要,经过参数配置和电路的重新...电路结构逻辑功能
  • 定时器原理应用定时器/计数器的方式和控制寄存器~方式寄存器TMOD~控制寄存器TCOM定时器/计数器方式二级目录三级目录 定时器/计数器的方式和控制寄存器 ~方式寄存器TMOD D7 D6 D5 D4 D3 D2 D1 D0 GATE C/...
  • 1.看门狗工作原理  S3C44B0X看门狗定时器用于在诸如噪声和系统错误干扰的情况下,继续进行控制操作,还可以用做16位的内部定时器,来请求中断服务。看门狗定时器每隔128个MCLK周期便产生一个复位信号,在程序正常...
  • 单片机原理及应用系统设计第7章 定时器/计数器主要内容定时器/计数器T0和T112定时器/计数器T23定时器/计数器T3和T47.1 定时器T0和T17.1.1 定时器/计数器T0/T1的结构和工作原理定时器T0T1结构框图如图7-1所示图7-1 T0...
  • 通用定时器原理

    千次阅读 2016-09-26 14:59:50
    一,STM32三种定时器区别 2个高级定时器 4个通用定时器 2个基本定时器 二,定时器的计数模式向上计数模式: 计数器从0开始计数,当计数到自动装载值(TIMx_ARR)时产生向上溢出事件 向下计数模式: 计数器从自动装载值...
  • 定时器/计数器的工作原理及应用 定时器/计数器是增1计数器 定时器/计数器T0、T1有四种工作方式(方式0123),由TMOD选择,TCON控制启停+显示状态 计数器的起始计数是从初值开始。单片机复位时计数器的初值为0,也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,470
精华内容 16,588
关键字:

定时器原理及应用