定时器 订阅
1876年,英国外科医生索加取得一项定时装置的专利,用来控制煤气街灯的开关。它利用机械钟带动开关来控制煤气阀门。起初每周上一次发条,1918年使用电钟计时后,就不用上发条了。随着生活水平的提高,定时器的用途也越来越广泛。比如对开水机、热水器的定时控制,有了大功率定时器,定时开机、定时关机,实现节能、安全、健康的使用。 展开全文
1876年,英国外科医生索加取得一项定时装置的专利,用来控制煤气街灯的开关。它利用机械钟带动开关来控制煤气阀门。起初每周上一次发条,1918年使用电钟计时后,就不用上发条了。随着生活水平的提高,定时器的用途也越来越广泛。比如对开水机、热水器的定时控制,有了大功率定时器,定时开机、定时关机,实现节能、安全、健康的使用。
信息
外文名
The timer
作    用
计时
中文名
定时器
性    质
科学用品
定时器概述
定时器(Timer)人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的。定时器确实是一项了不起的发明,使相当多需要人控制时间的工作变得简单了许多。人们甚至将定时器用在了军事方面,制成了定时炸弹,定时雷管。不少家用电器都安装了定时器来控制开关或工作时间。
收起全文
精华内容
参与话题
问答
  • 定时器

    千次阅读 2019-04-08 17:23:02
    1.设置定时器 1.1setTimeout() 作用:到达间隔时间之后,只调用一次回调函数 **语法: ** window.setTimeout(回调函数, 间隔时间) window可以省略 间隔时间以毫秒为单位 返回这个定时器的标识符,是数字类型 ...

    1.设置定时器

      1.1setTimeout()

    作用:到达间隔时间之后,只调用一次回调函数

    **语法: ** window.setTimeout(回调函数, 间隔时间)

    • window可以省略
    • 间隔时间以毫秒为单位
    • 返回这个定时器的标识符,是数字类型

    javascript // 创建一个定时器,1秒后执行 // timerId指向这个定时器的标识符 var timerId = setTimeout(function () { console.log('Hello World'); }, 1000);

       2.1 setInterval()

    作用: 每隔一个间隔时间,就调用一次回调函数

    **语法: ** window.setInterval(回调函数, 间隔时间)

    • window可以省略
    • 间隔时间以毫秒为单位
    • 返回这个定时器的唯一标示符,是数字类型

    javascript // 创建一个定时器,每隔1秒调用一次 //timerId 指向这个定时器的标识符 var timerId = setInterval(function () { var date = new Date(); console.log(date.toLocaleTimeString()); }, 1000);

    2.清除定时器

    6.2.1 clearTimeout()

    **作用: **清除以setTimeout方法设置的定时器

    语法: widnow.clearTimeout(定时器的标识符) window可以忽略

    6.2.2 clearInterval()

    **作用: **清除以setInterval方法设置的定时器

    语法: widnow.clearInterval(定时器的标识符) window可以忽略

    小结:

    • 设置定时器 setTimeout 和 setInterval
    • 清除定时器 clearTimeout 和 clearInterval
    展开全文
  • JS 轮播图 图片切换(定时器

    万次阅读 多人点赞 2019-08-13 22:10:50
    JS 轮播图 图片切换(定时器) 这次的轮播图与上次的图片切换相比,仅仅是加上了定时器,使其可以自动切换。 上次的图片切换的链接:https://blog.csdn.net/qq_38318589/article/details/99050117

    标题JS 轮播图 图片切换(定时器)

    这次的轮播图与上次的图片切换相比,仅仅是加上了定时器,使其可以自动切换。
    上次的图片切换的链接:https://blog.csdn.net/qq_38318589/article/details/99050117
    此次全部的代码都在下面,有注释,并有效果图如下:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>图片切换</title>
        <style>
            .picture {
                position: relative;
                width: 500px;
                height: 333px;
                margin: 0 auto;
                border: 2px solid rgb(231, 127, 217);
                overflow: hidden;
            }
    
            .radius {           /* 圆点所在的p (容器)  */
                width: 100%;
                height: 10px;
                position: absolute;
                bottom: 30px;
                text-align: center;
            }
    
            .pg {                         
                position: absolute;
                margin: 0;
                width: 100%;
                height: 20px;
                background-color: rgba(0, 0, 0, .4);
                text-align: center;
                font-size: 16px;
                font-weight: 600;
                color: #fff;
            }
    
            .title {
                position: absolute;
                width: 100%;
                bottom: 0px;
                text-align: center;
                font-size: 16px;
                font-weight: 600;
                color: rgb(21, 223, 72);
            }
    
            span {
                display: inline-block;
                border: 10px solid #fdfdfd;
                border-radius: 50%;
            }
    
            .active {
                border: 10px solid #656466;
            }
    
            /* 左右箭头  */
            .arrowhead-left,
            .arrowhead-right {
                position: absolute;
                width: 41px;
                height: 69px;
                font-size: 30px;
                line-height: 70px;
                text-align: center;
                color: #D6D8D4;
                background-color: rgba(0,0,0,.3);
            }
    
            .arrowhead-left {
                left: 0;
                top: 40%;
            }
    
            .arrowhead-right {
                right: 0;
                top: 40%;
            }
        </style>
    </head>
    
    <body>
        <div class="picture">
            <!-- 图片页码 -->
            <p class="pg">封面</p>
            <img src="./image/d8.jpeg" alt="">
    
            <!-- 小圆点点 -->
            <p class="radius"></p>
            <!-- 图片的下面标题 -->
            <p class="title">标题</p>
    
            <!-- 左右箭头 -->
            <div class="arrowhead-left" id="al"> < </div> 
            <div class="arrowhead-right" id="ar"> > </div>
        </div>
    
        <script>
            var address = ["./image/d1.jpeg", "./image/d2.jpeg", "./image/d3.jpeg", "./image/d4.jpeg", "./image/d5.jpeg", "./image/d7.jpeg"];
            //  var imgs = document.getElementsByTagName("img");
            var imgs = document.querySelector("img");
            var len = address.length;               //图片地址的数量为len
            var str = "";
            var pp = document.getElementsByTagName("p");//获取的是p标签的集合
            //  var pp  = document.querySelector("p");    //获取的是一个元素
            var al = document.getElementById("al");
            var ar = document.getElementById("ar");
            var n = 0 ;
    
            //添加span标签(小圆点),个数为len个
            for (i = 0; i < len; i++) {
                str += ' <span></span>'
            }
            pp[1].innerHTML = str;
           
            var spans = pp[1].getElementsByTagName('span');  //获取p[1]里所有span标签
            spans[0].className = 'active';                  //给第一个span标签添加样式 active
    
            for (i = 0; i < len; i++) {
                spans[i].index = i;              //自定义索引值
            
                spans[i].onmouseover = function () {            //鼠标指向圆点时的事件
                    for (i = 0; i < len; i++) {
                        spans[i].className = "";               //通过循环,清除所有圆点的类名
                    }
                    n=this.index ;
                    this.className = 'active';                 //给鼠标移入的圆点添加类名
                    imgs.src = address[this.index];
                    pp[0].innerHTML = [this.index + 1] + "/6";    
                    pp[2].innerHTML = "风光" + [this.index + 1];
                    
                }
               
            }
                
            ar.onclick = function () {            //右侧箭头,点击一次图片向右换一张
                n++;
               if (n>5) {
                  n=0;  
               } 
               for (i = 0; i < len; i++) {
                    spans[i].className = "";
                }
    
                spans[n].className = "active";
                imgs.src = address[n];
                pp[0].innerHTML = (n+1) + "/6";
                pp[2].innerHTML = "风光" +(n+1);
              
            }
    
            al.onclick = function () {        // //左侧箭头,点击一次图片向左换一张
              n--;
             if (n<0) {
                 n=(len-1);
             }
             for (i = 0; i < len; i++) {
                  spans[i].className = "";
              }         
              spans[n].className = "active";
              imgs.src = address[n];
              pp[0].innerHTML = (n+1) + "/6";
              pp[2].innerHTML = "风光" +(n+1);
            } 
           
           setInterval(ar.onclick,3000);             //添加定时器  setInterval(函数,间隔时间单位为毫秒)
                                                     //此次添加的函数为点击右侧箭头,间隔为3秒
        </script>
    </body>
    
    </html>
    

    与上次相比,仅仅添加了一句 setInterval(ar.onclick,3000);
    setInterval(函数,间隔时间单位为毫秒)
    ar.onclick是点击右侧箭头的函数,3000是3000毫秒,既3秒。

    (请忽略图片上的水印,随便找的一个做动图的软件,带水印-_-!)在这里插入图片描述

    展开全文
  • 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    万次阅读 多人点赞 2019-08-13 09:10:04
    今天我们来学习定时器,32的定时器有着非常丰富的功能,输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与...

    前言:

    今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

     

    所用工具:

    1、芯片: STM32F407ZET6/STM32F103ZET6

    2、STM32CubeMx软件

    3、IDE: MDK-Keil软件

    4、STM32F1xx/STM32F4xxHAL库 

    5

    知识概括:

    通过本篇博客您将学到:

    SMT32定时器原理

    STM32CubeMX创建定时器例程

    HAL库TIM定时器函数库

    定时器中断的创建与使用

    定时器简介:

    SMT32F1系列共有8个定时器:

    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

    SMT32F4系列共有15个定时器:

    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。

     

    基本定时器功能(TIM6、TIM7):

    •  16位向上、向下、向上/下自动装载计数器
    •  16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
    • 触发DAC的同步电路 注:此项是TIM6/7独有功能.
    • 位于APB1总线上


    通用定时器(TIM2~TIM5)的主要功能:

    •  16位向上、向下、向上/下自动装载计数器
    • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
    • 4 个独立通道(TIMx_CH1~4)可以用作:
    •                   测量输入信号的脉冲长度( 输入捕获) 
    •                   输出比较
    •                   单脉冲模式输出 
    •                   PWM输出(边缘或中间对齐模式) 
    • 支持针对定位的增量(正交)编码器和霍尔传感器电路 
    • 如下事件发生时产生中断/DMA:
    •                更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
    •               触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
    •               输入捕获  
    •               输出比较  
    • 位于APB1总线上


    高级定时器(TIM1,TIM8)的主要功能:

    • 高级定时器具有基本,通用定时器的所有的功能,
    • 还具有控制交直流电动机所有的功能,
    • 输出6路互补带死区的信号,刹车功能等等
    • 位于APB2总线上

    总括:基本定时器就是单纯的定时计数器,通用定时器多了四个通道,相对应的增加了功能,高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能

    定时器计数模式

    通用定时器可以向上计数、向下计数、向上向下双向计数模式。

    • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
    • 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
    • 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

    简单地理解三种计数模式,可以通过下面的图形:

     

    计数时钟的选择

    计数器时钟可由下列时钟源提供:

    • 内部时钟(TIMx_CLK) 
    • 外部时钟模式1:外部捕捉比较引脚(TIx)
    • 外部时钟模式2:外部引脚输入(TIMx_ETR) 仅适用TIM2,3,4
    • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
       

    定时器的主从模式:   (选看)

    定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动。这里所谓某一个条件可以是定时到时间、定时器超时、比较成功等许多条件。

    这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式接受触发信号而启动的定时器工作于从模式

    触发条件:

    定时器的四种主从机模式:

    •  外部触发模式1
    • IRC重置模式
    • 门控模式
    • 触发模式

    这个我们用的很少,介绍下主要是为了下面的讲解   如果需要全面了解,请参考 《STM32中文参考手册》 275页 定时器主从模式

    工程创建

    1设置RCC

    设置高速外部时钟HSE 选择外部时钟源

    2设置时钟

     

     

    我的是  外部晶振为8MHz 

    • 1选择外部时钟HSE 8MHz   
    • 2PLL锁相环倍频72倍
    • 3系统时钟来源选择为PLL
    • 4设置APB1分频器为 /2
    • 5  这时候定时器的时钟频率为72Mhz

    32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

    3定时器设置

    1选择TIM2

    2定时器时钟选择内部时钟

    Clock Source(时钟来源)       

    • 选项1 :Internal Clock  内部时钟 
    • 选项2 : ETR2 外部触发输入(ETR)(仅适用TIM2,3,4)

    Prtscaler (定时器分频系数)  : 7199

    Counter Mode(计数模式)    Up(向上计数模式)                    

    Counter Period(自动重装载值) :    4999     

    CKD(时钟分频因子) :       No Division 不分频 

    选项:  可以选择二分频和四分频                         

    auto-reload-preload(自动重装载)  :    Enable 使能

    TRGO Parameters    触发输出 (TRGO)               不使能    与本节无关,之后做详细介绍 

    TRGO:    定时器的触发信号输出  在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换,) 

    这两个为定时器主从模式配置,很少用到,我们用不到,所以全部关闭

    使能定时器中断:

             

    定时器溢出时间:

                                                

    这里我们 arr=4999  psc=7199 Tclk=72Mhz        Tout = (5000*7200)/72  us  = 500ms

    4项目文件设置

             

    • 1 设置项目名称
    • 2 设置存储路径
    • 3 选择所用IDE

       

    5创建工程文件

    然后点击GENERATE CODE  创建工程

    配置下载工具

    新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

    函数讲解:

    HAL_TIM_IRQHandler(&htim2);

    定时器中断处理函数   在stm32f4xx_it.c的 TIM2_IRQHandler()定时器中断服务函数中

    这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断.....),然后进入相应的中断回调函数

     

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,

    这里我们是使用定时器溢出中断回调函数

     

    •  void TIM3_IRQHandler(void)   首先进入中断函数
    •  HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数
    • 判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
    •  void HAL_TIM_PeriodElapsedCallback(&htim2);    进入相对应中断回调函数
    • 在中断回调函数中添加用户代码

     

    你也可以在在stm32f1xx_it.c中找到中断回调函数

         __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   

    例程:

    定时器溢出时间为500ms,LED点亮延时500ms闪烁

     

    在main.c主函数上方初始化使能定时器2

      /* USER CODE BEGIN 2 */
        /*使能定时器1中断*/
        HAL_TIM_Base_Start_IT(&htim2);
      /* USER CODE END 2 */
    

    在main.c主函数下方添加中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        static unsigned char ledState = 0;
        if (htim == (&htim2))
        {
            if (ledState == 0)
                HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
            else
                HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);
            ledState = !ledState;
        }
    }

    展开全文
  • 【STM32】通用定时器的PWM输出(实例:PWM输出)

    万次阅读 多人点赞 2018-04-19 15:22:43
    STM32F1xx官方资料: ...STM32的通用定时器分为TIM2、TIM3、TIM4、TIM5,而每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。 STM32的定时器除了TIM6和TIM7(基本定时器...

    STM32F1xx官方资料:

    《STM32中文参考手册V10》-第14章  通用定时器

     

    通用定时器PWM概述

    STM32定时器输出通道引脚

    这里以TIM3为例来讲解。STM32的通用定时器分为TIM2、TIM3、TIM4、TIM5,而每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。

    STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32最多可以同时产生30路PWM输出!

    从图中的内容可以看出,TIM3的4个通道相对应的各个引脚以及重映射情况下的各个引脚的位置。

    PWM的工作原理

    在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、右下部分(PWM输出)这三个部分。这里主要讲解一下右下部分(PWM输出),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)

    下面以向上计数为例,简单地讲述一下PWM的工作原理:

    • 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
    • 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
    • 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。

    这个时候就可以对其下一个准确的定义了:所谓脉冲宽度调制模式(PWM模式),就是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

    PWM的通道概览

    每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。

    捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。

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

    • CCR1寄存器:捕获/比较值寄存器:设置比较值;
    • CCMR1寄存器:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1或者PWM模式2;
    • CCER寄存器:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
    • CCER寄存器:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

    PWM输出的模式区别

    通过设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式

    • PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
    • PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

    注意:PWM的模式只是区别什么时候是有效电平,但并没有确定是高电平有效还是低电平有效。这需要结合CCER寄存器的CCxP位的值来确定。

    例如:若PWM模式1,且CCER寄存器的CCxP位为0,则当TIMx_CNT<TIMx_CCR1时,输出高电平;同样的,若PWM模式1,且CCER寄存器的CCxP位为2,则当TIMx_CNT<TIMx_CCR1时,输出低电平。

    PWM的计数模式

    向上计数模式

    下面是一个PWM模式1的例子。当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。

    向下计数模式

    在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形。

    中央对齐模式

    当TIMx_CR1寄存器中的CMS位不为’00’时,为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位设置,比较标志可以在计数器向上计数时被置’1’、在计数器向下计数时被置’1’、或在计数器向上和向下计数时被置’1’。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。

     

    自动加载的预加载寄存器

    在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

    在TIMx_CRx寄存器的ARPE位,决定着是否使能自动重装载的预加载寄存器。

    根据TIMx_CR1位的APRE位的设置,APRE=0时,预装载寄存器的内容就可以随时传送到影子寄存器,此时两者是互通的;APRE=1时,在每一次更新事件时,才将预装在寄存器的内容传送至影子寄存器。

    简单的说:ARPE=1,ARR立即生效;APRE=0,ARR下个比较周期生效。

     

    PWM相关配置寄存器

    捕获/比较模式寄存器1(TIMx_CCMR1)

    捕获/比较模式寄存器总共2个,TIMx_CCMR1和TIMx_CCMR2。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。

    其中模式设置位OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。

    作用:在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。

    捕获/比较使能寄存器(TIMx_CCER)

    作用:在PWM输出模式下,确定PWM的输出极性和输出使能

    捕获/比较寄存器1(TIMx_CCR1)

    作用:在PWM输出模式下,确定比较的值

     

    PWM相关配置库函数

    • 1个输出初始化函数
    void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

    作用:在四个通道中选择一个,初始化PWM输出模式、比较输出极性、比较输出使能、比较值CCRx的值

    • 1个参数设置函数
    void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
    void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
    void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
    void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

    作用:在四个通道中选择一个,设置比较值。通常在初始化函数中已经设置了比较值,此函数用于除初始化之外的修改。

    • 2个使能函数
    void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

    作用:前者在四个通道中选择一个,使能输出比较预装载,后者使能自动重装载的预装载寄存器允许位。

     

    PWM的一般步骤

    实例要求:使用TIM3来产生PWM输出,并使用TIM3的通道2,把通道2重映射到PB5,产生PWM来控制DS0的亮度。

    • 使能定时器和相关IO口时钟。调用函数:RCC_APB1PeriphClockCmd();RCC_APB2PeriphClockCmd();
    • 初始化IO口为复用功能输出。调用函数:GPIO_Init();  
    • 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。调用函数:RCC_APB2PeriphClockCmd();GPIO_PinRemapConfig();
    • 初始化定时器。调用函数:ARR,PSC等:TIM_TimeBaseInit();
    • 初始化输出比较参数。调用函数:TIM_OC2Init();
    • 使能预装载寄存器。调用函数:TIM_OC2PreloadConfig();
    • 使能定时器。调用函数:TIM_Cmd();
    • 不断改变比较值CCRx,达到不同的占空比效果。调用函数:TIM_SetCompare2()。

    下面按照这个一般步骤来进行一个简单的PWM输出程序:

    //TIM3 PWM部分初始化 
    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    void TIM3_PWM_Init(u16 arr,u16 psc)
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    	
    	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
     
       //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
     
       //初始化TIM3
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	
    	//初始化TIM3 Channel2 PWM模式	 
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
     	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
    
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
     
    	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
    	
    
    }
    
     int main(void)
     {		
     	u16 led0pwmval=0;
    	u8 dir=1;	
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	LED_Init();			     //LED端口初始化
     	TIM3_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
       	while(1)
    	{
     		delay_ms(10);	 
    		if(dir)led0pwmval++;
    		else led0pwmval--;
    
     		if(led0pwmval>300)dir=0;
    		if(led0pwmval==0)dir=1;										 
    		TIM_SetCompare2(TIM3,led0pwmval);		   
    	}	 
     }

     

    展开全文
  • 《STM32中文参考手册V10》-第14章通用定时器   STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为: 高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 ...
  • //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法 window.clearTim
  • JMeter(八):定时器Timer经典介绍

    万次阅读 2017-10-23 19:55:29
    背景:JMeter常被定义成性能测试工具或是自动化测试工具,都没错,同时还可以作为接口测试及web功能测试,关键使用者根据业务需求选择使用其功能;性能测试方向:后起之秀JMeter与革命前辈Loadrunner的比较,JMeter...
  • JS设置定时器和清除定时器

    万次阅读 多人点赞 2018-09-03 14:50:52
    JS设置定时器和清除定时器  在做项目中难免会碰到需要实时刷新,动画依次出现等等需求,这时候就需要定时器登上我们的代码舞台了,所以今天我们就先来了解一下JS定时器的设置和清除吧。 一、启用定时器  window...
  • 我利用STM32F407控制电机,用TIM1输出互补对称的PWM波,利用TIM3读取 磁编码器的相对式位置,并用TIM3触发TIM5来进行数据记录。...但实际上定时器又确实被定时器3或者5给影响了。请问这是怎么回事呢?
  • //linux只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理 // //这个实现允许用户使用多个自定义的定时器,每个自定义的定时器将周期地被触发直到其被删除。实现的主要思路...
  • CANOpen定时器

    千次阅读 2018-03-19 19:46:31
    在CANOpen中,有部分和时间相关的子协议,比如pdo和lifegrd等,这就要求移植的时候实现定时器的底层接口。 在timer.h中给出了接口声明 /* 设置定时器重载值 */ void setTimer(TIMEVAL value); /* 获取当前定时器...
  • js定时器

    千次阅读 2015-09-02 11:18:52
    js有两种专用定时器函数,分别为: 倒计时定时器:var timename = setTimeout("function()",delaytime); 循环定时器:var timename = setInterval("function()",delaytime); 说明:a.其中function()是定时器触发后...
  • 内核定时器

    千次阅读 2012-02-27 16:03:00
    内核定时器  内核定时器是设备驱动程序中经常要用到的另一个重要的内核设施。如果驱动程序希望在将来某个可度量的时间点到期后,由内核安排执行某项任务(此处的任务通常是驱动程序自身定义的某个函数,接下来的...
  • 我用stm8s003做一个马达停止检测的实验,当马达运行时不断的有触发信号给芯片,每接到一个信号,定时器就从设定的时间开始定时,就是定时器会以最后一个触发信号开始定时,但实验时发现定时器定时时间会受到上一...
  • python 定时器,轮询定时器

    万次阅读 2018-01-10 15:35:00
    python 定时器默认定时器只执行一次,第一个参数单位S,几秒后执行 import threading def fun_timer(): print('Hello Timer!') timer = threading.Timer(1, fun_timer) timer.start() 改成以下可以执行多次 ...
  • STM32F1xx官方资料: 《STM32中文参考手册V10》-第14章 通用定时器 ...这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获...
  • 需要定时器每6秒执行一次TimerPro中的代码,在TimerPro中需要访问外部仪器 设备,如果某次和仪器发生通信故障会产生超过6秒的阻塞时间,即某次TimerPro处理时间超过6秒,假设本次TimerPro用时8秒,如果遇此情况如何...
  • 今天研究定时器,在网上看了一篇不错的文章,推荐给大家! http://www.jb51.net/article/44297.htm
  • 使用场景:获取验证码 1,data中定义参数 data: { color: "#ff6f10", disabled: false, getCode: "获取验证码", }, 2,wxml中的引用 ... class='form-code-btn' bindt..
  • vue定时器和关闭定时器

    千次阅读 2019-03-13 22:23:15
    @vue定时器和关闭定时器 vue定时器和关闭定时器 mounted() {  clearInterval(this.timer) this.setTimer() }, distroyed: function () {//并没用 console.log('distroyed') clearInterval(this....
  • TCP的定时器系列 — 超时重传定时器

    万次阅读 2015-03-30 22:53:28
    主要内容:TCP定时器开篇,超时重传定时器、ER延迟定时器、PTO定时器的实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd   Q:一条TCP连接会使用多少个定时器呢? A:目前的答案是9个: 超时重传...
  • 主要内容:零窗口探测定时器的实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd   出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: 发送方的发送速度大于接收方的接收速度。 接收方的...
  • STM32定时器详解(定时器中断实验)

    千次阅读 多人点赞 2019-04-18 21:19:09
    文章目录STM32定时器分类定时器中断实验计数器时钟频率计数器模式向上计数模式库函数操作 STM32定时器分类 STM32的定时器分为很多类,按照功能的不同可以分为: 高级定时器(TIM1和TIM8) 通用定时器(TIM2-TIM5) ...
  • DSP之时钟与定时器之二通用定时器

    万次阅读 2012-08-15 10:20:55
    C55x DSP片内有两个2通用定时器,利用定时器可向CPU产生周期性中断或向DSP片外的器件提供周期信号。其中TMS320VC5503/5507/5509/5510 DSP提供的是2个20位通用定时器. 1 结构框图 20位的定时器由两部分组成:...
  • 1.查看是否开启evevt与开启evevt。 1.1、MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的。 show VARIABLES LIKE '%sche%';...2.创建定时器的过程 2

空空如也

1 2 3 4 5 ... 20
收藏数 73,177
精华内容 29,270
关键字:

定时器