精华内容
下载资源
问答
  • 传统时钟源的内外频标切换是用检波器对外频标进行检波,用检波出来的信号去控制晶振的电源通断,从而实现切换。但这种传统的检波方式,只能对频标的有无进检波,无法检出参考的频率,而且要求内外频标的频率相等,...
  • 0 引 言 ... 本文设计的自适应式时钟源的内外频标切换采用软件检测和控制来适应5 MHz,10 MHz和20 MHz频标,通过改变芯片内部寄存器的频率控制字,改变参考频率的倍频次数,最终得到所需频率的
  • 除了基本定时器的基功能,还可对外做输入捕捉、输出比较以及连接其它传感器接口【编码器和霍尔传感器】。 高级定时器: 此类定时器的功能最为强大,除了具备通用定时器的功能,还包含一些与电机控制和数字...

    常规定时器包括:基本定时器、通用定时器和高级定时器。

    基本定时器

    没有任何对外输入/输出,主要用作时基计数、定时。
    在这里插入图片描述

    通用定时器:

    除了基本定时器的时基功能外,还可对外做输入捕捉、输出比较以及连接其它传感器接口【编码器和霍尔传感器】。
    在这里插入图片描述

    高级定时器:

    此类定时器的功能最为强大,除了具备通用定时器的功能外,还包含一些与电机控制和数字电源应用相关的功能,比方带死区控制的互补信号输出、紧急刹车关断输入。
    在这里插入图片描述

    从功能模块整体了解STM32定时器

    在这里插入图片描述
    从寄存器特色了解STM32定时器

    • 定时器中的PSC/ARR/RCR/CCR寄存器具有预装载功能,即每类寄存器具有双寄存器机制;

    • 分别由各自的影子寄存器和预装载寄存器组成;

    • 影子寄存器是真正起作用的寄存器,预装载寄存器为影子寄存器提供缓冲,提前做数据或指令准备;

    • 用户操作的永远只是预装载寄存器!

    • 在开启预装载功能时,影子寄存器的内容须借助更新事件完成更新!

    • 关于预装载功能的开启或关闭,往往也犹如影子、如幽灵般影响到我们的定时器应用开发。充分了解预装载机制与更新事件很重要!

    一、基本单元

    在这里插入图片描述
    基本定时器、通用定时器的时基单元由3部分组成: 分频器、计数器、自动重装器。

    TIMx_PSC分频寄存器:设置分频器对时钟源的分频比
    TIMx_CNT 核心计数器 :对从分频器过来的时钟进行计数
    TIMx_ARR自动重装寄存器:为计数器设置计数边界或重装值。比如计数器向上计数时,记到多少发生溢出;向下计数时从多少开始往下计数。
    TIMx_ARR/ TIMx_PSC 都分别由影子寄存器和预装载寄存器组成即使用双寄存器机制。
    影子寄存器:乃TIMER运行中真正起作用的寄存器,即实际寄存器。
    预装载寄存器:乃用户操作的寄存器,提前为影子寄存器做数据准备。
    在发生更新事件时,预装载寄存器的数据拷贝到 影子寄存器发挥作用

    STM32高级定时器时基单元
    在这里插入图片描述
    相比通用定时器,高级定时器时基单元增加了 重复计数器 和对应的寄存器TIMx_RCR,重复计数器是个向下计数器;当计数器发生 TIMx_RCR+1次溢出动作后 会触发更新事件。

    二、计数器的时钟源

    在这里插入图片描述
    内部时钟TIMx_CLK
    在这里插入图片描述
    内部触发输入:ITRx
    在这里插入图片描述
    外部时钟源模式1示例:TI2上升沿
    在这里插入图片描述
    在这里插入图片描述
    外部时钟源模式2
    在这里插入图片描述
    在这里插入图片描述
    各种时钟源的寄存器配置
    在这里插入图片描述

    展开全文
  • HAL 库驱动中,由于某些外设的驱动需要使用超时判断(比如 I2C、 SPI、 SDIO 等),需要精确延时(精度为 1ms),使用的是 SysTick,但是在操作系统里面,我们需要使用 SysTick 来提供系统基, 那么就冲突了。...


        HAL 库驱动中,由于某些外设的驱动需要使用超时判断(比如 I2C、 SPI、 SDIO 等),需要精确延时(精度为 1ms),使用的是 SysTick,但是在操作系统里面,我们需要使用 SysTick 来提供系统时基, 那么就冲突了。
        HAL库的时钟源主要用于HAL_Delay()这个函数,这个函数用于实现延时以及上面说的外设驱动的超时判断。这个函数主要是靠不断读取SysTick计数器的值来实现延迟。但是加入了RTOS之后,RTOS强制将systick的中断设置为最低,假设在一个中断优先级比systick高的中断int_a中调用HAL_Delay()来进行延时,那么由于int_a中断优先级高于systick,从而导致systick无法抢占,也就无法增加计数器的值,就会导致int_a中断服务函数死等HAL_Delay()延时,无法退出,从而造成比int_a优先级低的中断服务都无法使用,系统也无法调度。

        解决办法重写重写 HAL 库里面延时相关的函数,只有三个:HAL_InitTick()、 HAL_GetTick() 和 HAL_Delay(),这三个函数在 HAL 库中都是弱定义函数(函数开头带 __weak 关键字),弱定义的意思是只要用户重写这三个函数,原来 HAL 库里面的就会无效。

        可以使用TIM6计时器来重新上面三个函数,如果是这样,直接在cubemx里面,将SYS里面的Timebase Source改成TIM6即可,如下图:
    ​​
    在这里插入图片描述

        如果不想使用TIM6,毕竟占用了一个定时器资源,那么可以考虑使用DWT来实现。下面这段及代码来之野火的《RT-Thread 内核实现与应用开发实战——基于 STM32》第16章。

        在 Cortex-M 内核里面有一个外设叫 DWT(Data Watchpoint and Trace),该外设有一个 32 位的寄存器叫 CYCCNT,它是一个向上的计数器,记录的是内核时钟运行的个数,最长能记录的时间为:10.74s = 2 的 32 次方/400000000 (CYCNNT 从 0 开始计数到溢出,最长的延时时间与内核的频率有关,假设内核频率为 400M,内核时钟跳一次的时间大概为 1/400M=2.5ns),当 CYCCNT 溢出之后,会清 0 重新开始向上计数。这种延时方案不仅精确,而且还不占用单片机的外设资源,非常方便。所以 HAL 库里面刚刚讲到的需要重写的三个函数我们都基于 CYCCNT 的方案来实现。增加core_delay.c 和 core_delay.h这两个文件并添加到工程中即可。
    注意:使用DWT来实现延迟有一个好处,就是如果你单片机主频足够高,可以精确实现us级延时。
        下面的代码是以STM32H743为例,使用的是HAL库,如果要适配其它型号STM32,直接修改对应的头文件即可。

    core_delay.c代码如下:

    
    /**
    
      ******************************************************************
    
      * @file    core_delay.c
    
      * @author  fire
    
      * @version V1.0
    
      * @date    2018-xx-xx
    
      * @brief   使用内核寄存器精确延时
    
      ******************************************************************
    
      * @attention
    
      *
    
      * 实验平台:野火 STM32H743开发板  
    
      * 论坛    :http://www.firebbs.cn
    
      * 淘宝    :https://fire-stm32.taobao.com
    
      *
    
      ******************************************************************
    
      */
    
      
    
    #include "core_delay.h"   
    
    
     
    
    /*
    
    **********************************************************************
    
    *         时间戳相关寄存器定义
    
    **********************************************************************
    
    */
    
    /*
    
     在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),
    
     该外设有一个32位的寄存器叫CYCCNT,它是一个向上的计数器,
    
     记录的是内核时钟运行的个数,最长能记录的时间为:
    
     10.74s=2的32次方/400000000
    
     (假设内核频率为400M,内核跳一次的时间大概为1/400M=2.5ns)
    
     当CYCCNT溢出之后,会清0重新开始向上计数。
    
     使能CYCCNT计数的操作步骤:
    
     1、先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能
    
     2、使能CYCCNT寄存器之前,先清0
    
     3、使能CYCCNT寄存器,这个由DWT_CTRL(代码上宏定义为DWT_CR)的位0控制,写1使能
    
     */
    
    
     
    
    #define  DWT_CR      *(__IO uint32_t *)0xE0001000
    
    #define  DWT_CYCCNT  *(__IO uint32_t *)0xE0001004
    
    #define  DEM_CR      *(__IO uint32_t *)0xE000EDFC
    
    
     
    
    #define  DEM_CR_TRCENA                   (1 << 24)
    
    #define  DWT_CR_CYCCNTENA                (1 <<  0)
    
    
     
    
    /**
    
      * @brief  初始化时间戳
    
      * @param  无
    
      * @retval 无
    
      * @note   使用延时函数前,必须调用本函数
    
      */
    
    HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
    
    {
    
        /* 使能DWT外设 */
    
        DEM_CR |= (uint32_t)DEM_CR_TRCENA;                
    
        /* DWT CYCCNT寄存器计数清0 */
    
        DWT_CYCCNT = (uint32_t)0u;
    
        /* 使能Cortex-M DWT CYCCNT寄存器 */
    
        DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
    
      
    
        return HAL_OK;
    
    }
    
    /**
    
      * @brief  读取当前时间戳
    
      * @param  无
    
      * @retval 当前时间戳,即DWT_CYCCNT寄存器的值
    
      */
    
    uint32_t CPU_TS_TmrRd(void)
    
    {        
    
      return ((uint32_t)DWT_CYCCNT);
    
    }
    
    /**
    
      * @brief  读取当前时间戳
    
      * @param  无
    
      * @retval 当前时间戳,即DWT_CYCCNT寄存器的值
    
      */
    
    uint32_t HAL_GetTick(void)
    
    {        
    
      return ((uint32_t)DWT_CYCCNT/SysClockFreq*1000);
    
    }
    
    
     
    
    /**
    
      * @brief  采用CPU的内部计数实现精确延时,32位计数器
    
      * @param  us : 延迟长度,单位1 us
    
      * @retval 无
    
      * @note   使用本函数前必须先调用CPU_TS_TmrInit函数使能计数器,
    
                或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION
    
                最大延时值为8秒,即8*1000*1000
    
      */
    
    void CPU_TS_Tmr_Delay_US(uint32_t us)
    
    {
    
      uint32_t ticks;
    
      uint32_t told,tnow,tcnt=0;
    
      /* 在函数内部初始化时间戳寄存器, */  
    
    #if (CPU_TS_INIT_IN_DELAY_FUNCTION)  
    
      /* 初始化时间戳并清零 */
    
      HAL_InitTick(5);
    
    #endif
    
      
    
      ticks = us * (GET_CPU_ClkFreq() / 1000000);  /* 需要的节拍数 */      
    
      tcnt = 0;
    
      told = (uint32_t)CPU_TS_TmrRd();         /* 刚进入时的计数器值 */
    
      while(1)
    
      {
    
        tnow = (uint32_t)CPU_TS_TmrRd();  
    
        if(tnow != told)
    
        { 
    
            /* 32位计数器是递增计数器 */    
    
          if(tnow > told)
    
          {
    
            tcnt += tnow - told;  
    
          }
    
          /* 重新装载 */
    
          else 
    
          {
    
            tcnt += UINT32_MAX - told + tnow; 
    
          } 
    
          
    
          told = tnow;
    
          /*时间超过/等于要延迟的时间,则退出 */
    
          if(tcnt >= ticks)break;
    
        }  
    
      }
    
    }
    
    /*********************************************END OF FILE**********************/
    
    

    core_delay.h代码如下:

    #ifndef __CORE_DELAY_H
    #define __CORE_DELAY_H
    
    #include "stm32f4xx.h"
    
    /* 获取内核时钟频率 */
    #define GET_CPU_ClkFreq()       HAL_RCC_GetSysClockFreq()
    #define SysClockFreq            (400000000)
    /* 为方便使用,在延时函数内部调用CPU_TS_TmrInit函数初始化时间戳寄存器,
      这样每次调用函数都会初始化一遍。
      把本宏值设置为0,然后在main函数刚运行时调用CPU_TS_TmrInit可避免每次都初始化 */  
    
    #define CPU_TS_INIT_IN_DELAY_FUNCTION   0  
    
    
    /*******************************************************************************
    * 函数声明
    ******************************************************************************/
    uint32_t CPU_TS_TmrRd(void);
    HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);
    
    //使用以下函数前必须先调用CPU_TS_TmrInit函数使能计数器,或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION
    //最大延时值为8秒
    void CPU_TS_Tmr_Delay_US(uint32_t us);
    #define HAL_Delay(ms)     CPU_TS_Tmr_Delay_US(ms*1000)
    #define CPU_TS_Tmr_Delay_S(s)       CPU_TS_Tmr_Delay_MS(s*1000)
    
    
    #endif /* __CORE_DELAY_H */
    
    

    参考:
        1.cubemx在使用freertos的时候为何推荐使用除systick以外的timebase

        2.野火《RT-Thread 内核实现与应用开发实战——基于 STM32》

    展开全文
  • 透明时钟源代码:必要的指针与刻度,其它都为透明,具有实用价值。
  • //-----------------设置表盘---------------------- lv_obj_t *arc = lv_arc_create(lv_scr_act(),NULL); lv_obj_set_size(arc,190,190); lv_obj_align(arc,NULL, LV_ALIGN_CENTER,0,0); lv_arc_set_angles(arc,...

    lv_obj_t *gauge_m;
    lv_obj_t *gauge_f;
    lv_obj_t *gauge_s;

    static const lv_color_t colors[] = {//指针颜色
                                 LV_COLOR_RED,//时针
                                 LV_COLOR_BLUE,//分针
                                 LV_COLOR_GREEN//秒针
                                 };

    //------------------设置时针 不要刻度线------------------
        gauge_s = lv_gauge_create(lv_scr_act(),NULL);
        lv_obj_set_size(gauge_s,100,100);
        lv_obj_align(gauge_s,NULL, LV_ALIGN_CENTER,0,0);

        static lv_style_t gauge_style;//
        lv_style_copy(&gauge_style,gauge_s->style_p);
        gauge_style.body.padding.left = 0;//不要表盘刻度线

        lv_gauge_set_range(gauge_s,0,60);
        lv_gauge_set_scale(gauge_s,360,61,0);
        lv_gauge_set_needle_count(gauge_s,1,&colors[0]);//时针
        lv_gauge_set_style(gauge_s,LV_GAUGE_STYLE_MAIN,&gauge_style);
        //lv_gauge_set_value(gauge_s,0,30);

        //------------------设置分针 不要刻度线------------------
        gauge_f = lv_gauge_create(lv_scr_act(),NULL);
        lv_obj_set_size(gauge_f,140,140);
        lv_obj_align(gauge_f,NULL, LV_ALIGN_CENTER,0,0);

        lv_gauge_set_range(gauge_f,0,60);
        lv_gauge_set_scale(gauge_f,360,61,0);
        lv_gauge_set_needle_count(gauge_f,1,&colors[1]);//分针
        lv_gauge_set_style(gauge_f,LV_GAUGE_STYLE_MAIN,&gauge_style);
        //lv_gauge_set_value(gauge_f,0,35);
        //------------------设置秒针 及60根刻度线------------------
        gauge_m = lv_gauge_create(lv_scr_act(),NULL);
        lv_obj_set_size(gauge_m,180,180);
        lv_obj_align(gauge_m,NULL, LV_ALIGN_CENTER,0,0);

        lv_gauge_set_range(gauge_m,0,60);
        lv_gauge_set_scale(gauge_m,360,61,0);
        lv_gauge_set_needle_count(gauge_m,1,&colors[2]);//秒针
        //lv_gauge_set_value(gauge_m,0,55);

        //-----------------设置外表盘----------------------
        lv_obj_t *arc = lv_arc_create(lv_scr_act(),NULL);
        lv_obj_set_size(arc,190,190);
        lv_obj_align(arc,NULL, LV_ALIGN_CENTER,0,0);
        lv_arc_set_angles(arc, 0, 360);
        //----------------设置宽刻度线-------------------------
        lv_obj_t *lmeter = lv_lmeter_create(lv_scr_act(),NULL);
        lv_obj_set_size(lmeter,180,180);
        lv_obj_align(lmeter,NULL, LV_ALIGN_CENTER,0,0);
        lv_lmeter_set_scale(lmeter,360,13);

        static lv_style_t lmeter_style;//
        lv_style_copy(&lmeter_style,gauge_s->style_p);
        lmeter_style.body.padding.left = 10;
        lmeter_style.line.width = 4;
        lv_lmeter_set_style(lmeter,LV_LMETER_STYLE_MAIN,&lmeter_style);

        set_tim(6,59,45);//设置时间 06:59:45

    //------------------------------------------------------------

    void set_tim(uint8_t hour,uint8_t min,uint8_t sec)//设置时间
    {
      uint8_t min_s = min;

      if(sec < 30) sec += 30;  //加减30是因为仪表盘的0起始线 为30秒钟刻度线
      else sec -= 30;
      lv_gauge_set_value(gauge_m,0,sec);//秒针
      //-----------------------
      if(min < 30) min += 30;
      else min -= 30;
      lv_gauge_set_value(gauge_f,0,min);//分针
      //----------------------
      hour *= 5;
      //分针每走12格 时针走一格
      hour += min_s/12; //分针参数不会等于60
      if(hour < 30) hour += 30;
      else hour -= 30;
      lv_gauge_set_value(gauge_s,0,hour);//时针

    }

    运行结果(见下图):与设置时间一致

     

     

    展开全文
  • Linux时钟源

    千次阅读 2019-06-18 12:04:47
    查看可用时钟源 cat /sys/devices/system/clocksource/clocksource0/available_clocksource 查看当前使用的时钟源 cat /sys/devices/system/clocksource/...修改时钟源 echo hpet > /sys/devices/syste...

    查看可用时钟源

    cat /sys/devices/system/clocksource/clocksource0/available_clocksource
    

    查看当前使用的时钟源

    cat /sys/devices/system/clocksource/clocksource0/current_clocksource
    

    修改时钟源

    echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource
    

    查看关于时钟源的dmesg日志

    dmesg | grep clock
    

    一般来说tsc时钟源是计算速度最快的选择项,其他都是次选,会导致cpu运行缓慢,导致切换的原因可能是程序bug。
    参考:
    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/reference_guide/chap-timestamping

    展开全文
  • 关于库时钟源支持有源和无源晶振的区别
  • 在一般应用场合(不使用USB,对精度要求不高)LPC17xx系列除了使用外部晶体,还可以使用内部的12MHZ晶体作为振荡源。其实在运行初始化程序,进入用户程序前(main函数),LPC17xx是使用了内部晶体,这样设计是为了让...
  • NTP时钟源(GPS时间源)介绍与分析

    千次阅读 2020-03-19 17:01:45
    随着信息技术和网络技术的高速发展,国内各高校、医院都严格按照国家相关部门的规定,配置了完整的时间同步校系统,为学校,为医院提供了统一标准的北京时间信息。悬挂在楼道大厅、教室、诊室的gps网络电子时钟...
  • 时钟源关系初解

    千次阅读 2017-09-25 09:52:01
    从名字上看出HSI和HSE是高速时钟源,HSI是高速内部时钟源,HSE是高速外部时钟源,同样的LSI是低速内部时钟源,LSE是低速内部时钟源。外部时钟源就是从外面接晶振获取的时钟源。然后就说说每个时钟源的大概频率和作用...
  • 1.时钟源 外部时钟 2.GPIO (实验:点亮LED灯,获取引脚的电平高低,将对应引脚置高置低)。 3.PWM-脉宽调制 主要是调节占空比(在小车中用来实现小车的加减速)。 4.TIMX定时器 5.红外遥控 主要运用了EXTI(外部中断/...
  • 其中IP是网同步专用IP,至于办公网,收费网,监控网等各公司的内网的话可以自行映射专用IP 运行情况如下,可以看到我当前的服务器与真正的时间差了0.025750秒,还是很准时的 [root@node01 ~]# /sbin/ntpdate -u...
  • linux 配置时钟服务器

    千次阅读 2017-03-25 11:31:46
    vi /etc/ntp.conf #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 去掉注释 改成自己内网网段 ...设置成网时间服务器 #server 127.127.1.0 # local clock #fudge 12
  • 系统可以在非常事件突发,及时地将叠加有时间、地点等信息内容的现场情况记录下来,以便重放分析调查,并作为具有法律效力的重要证据,这样既提高了安保人员处警的准确性,也可为公安人员迅速破案提供有力证据。...
  • 在编程LED,使用到了 HAL_Delay(500) 函数,此函数利用的就是SysTick系统滴答定时器。 SysTick用于提供时间基准,常用于对时间要求严格的情况,其意义十分重要。 Systick是一个24位的定时器,一次最多可以计数 2...
  • //给定时器时钟源 TCCR1C = 0X00; TCNT1 = 0X00; TIMSK1 = 0X00; //禁止定时器溢出中断 } void remote_deal(void)//执行译码结果函数 { switch(ir_code) { case 0xff00://停止 digitalWrite(LED_RED,LOW);//红灯不亮...
  • 它们的作用一般都是为单片机定时计数器提供时钟信号,还有看门狗上也有应用,对于使用条件没什么要求吧,接上就用吧(不过值得注意的是在焊板子晶振距离单片机不要太远了 ps 我当年就是没注意这个问题) ...
  • /* 单片机: ATMega16A 晶振: 外部11.0592MHz (熔丝位: 低E1 高99) ...数码管段选: PA 数码管位选: 从高到低PC0~7 LED灯: PB7~0 */ #include #include #include ...const uint8_t seg8[] PROGMEM = {0xc0, 0xf9, 0xa4
  • 说说单片机里的时钟源

    千次阅读 2017-03-17 00:29:57
    对于这样的晶体来说,如果需要纯净的50MHz的话,在使用就需要使用外接的谐振电路选择出这个50MHz的谐波。 对于时钟源这种东西来说,我们永远不会介意它的精度高,越高越好。但是即使是晶振这种有很长历史的...
  • 【stm32】时钟详解

    2019-10-17 18:19:26
    这个时钟可以用来给 部其他系统提供时钟源。 B 这里是 RTC 时钟源,从图上可以看出,RTC 的时钟源可以选择 LSI,LSE,以及 HSE 的 128 分频。 C 从图中可以看出 C 处 USB 的时钟是来自 PLL 时钟源。STM32 中有...
  • 【STM32】时钟

    2020-08-29 10:44:49
    SysTick 可使用此时钟作为时钟源,也可使用 HCLK 作为时钟源,具体可在 SysTick 控制和状态寄存器中配置。 STM32F405xx/07xx 和 STM32F415xx/17xx 的定时器时钟频率由硬件自动设置。分为两种情况: 如果 APB 预分频...
  • 精度优于 30ns(RMS)定位精度优于 3m(RMS)冷启动:<29s;热启动<1sl 北斗输入接收北斗二 B1 信号,1561.098MHz,16 通道授精度优于 30ns(RMS)定位精度优于 3m(RMS)冷启动:<35s;热启动<1sl GPS ...
  • STM32的SysTick时钟源来自哪里?

    千次阅读 2020-02-04 22:31:22
    的设置进行选择时钟源。 具体就是通过CLKSOURCE(时钟源)这一Bit位来选择: 再次看SysTick_Config函数源码: __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1UL) >...
  • System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码执行长等,在我们的印象中应该快如闪电。但实际上在并发调用或者特别频繁...
  • STM32时钟体系结构

    万次阅读 多人点赞 2017-06-20 08:36:51
    倍频器将HSE倍频之后提供给cpu,但是除了cpu之外,其他片内外设,如SPI控制模块、IIC控制模块等的工作同样需要时钟源,这些外设的时钟源肯定是低于cpu运行时钟的,例如USB通讯才需要48MHz,所以需要对倍频后的时钟源...
  • JAVA基础常见面试题

    2021-01-07 16:06:17
    在程序运行期间,Java 运行系统为所有对象维护一个运行类型标识,这个信息会跟踪每个对象所属的类,虚拟机利用运行类型信息选择要执行的正确方法,保存这些信息的类就是 Class,这是一个泛型类。 获取 Class ...
  • STM32 定时器输入捕获实现红外遥控数据接收

    万次阅读 多人点赞 2017-09-11 16:47:59
    之前已经写过了一个使用定时器普通计时功能来识别红外遥控数据的文章...定时器就是按照一个特定的频率对计数值进行加一或减一操作,当数值溢出则产生一个标志或中断。 定时器的输入捕获就是可以测量输入信号的脉冲宽
  • //给定时器时钟源 TCCR1C = 0X00; TCNT1 = 0X00; TIMSK1 = 0X00; //禁止定时器溢出中断 } void remote_deal(void)//执行译码结果函数 { if(adrL_code != 0x00) //如果没有检测到信号则不输出 { switch(adrL_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,621
精华内容 1,048
关键字:

外时钟源是