系统时钟_时钟同步系统 - CSDN
精华内容
参与话题
  • 1.Q:什么是系统时钟?什么是时钟系统? A:通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。 2.Q:时钟系统有什么作用? A:时钟是...

    1.Q:什么是系统时钟?什么是时钟系统?

    A:通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。

    2.Q:时钟系统有什么作用?

    A:时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作.外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。

    如下图1所示,ARM的时钟系统包括4部分,分为晶体振荡器、唤醒定时器、锁相环(PLL)和VPB分频器。其中晶体振荡器为系统提供基本的时钟信号(频率为Fosc)。当复位或者处理器从掉电模式唤醒时,“唤醒定时器”要对输入的时钟信号做计数延时,使芯片内部的部件有时间进行初始化。然后Fosc被PLL提高到一个符合用户需要的频率Fcclk,Fcclk用于CPU内核。因为CPU内核通常比外设部件的工作速度要快,用户可以通过设置VPB分频器,把Fcclk信号降低到一个合适的值Fpclk,该信号用于外设部件。以下是对各个部件和常见概念的介绍。


    展开全文
  • 系统时钟

    2019-06-01 21:09:00
    SysTick叫做系统滴答时钟系统定时器,属于Cortex-M4内核中的一个外设,它24bit向下递减的计数器 二、系统定时器的中断使用方法 1.代码的初始化 //初始化系统定时器,1S内核触发1000次中断,...

    一、系统定时器

    SysTick叫做系统滴答时钟、系统定时器属于Cortex-M4内核中的一个外设24bit向下递减的计数器

     

     

     

    二、系统定时器的中断使用方法

    1.代码的初始化

     

    //初始化系统定时器,1S内核触发1000次中断,说白了定时1ms
        SysTick_Config(SystemCoreClock/1000);

    2. 中断服务函数的编写

    void SysTick_Handler(void)
    {
        static uint32_t cnt=0;
    
        cnt++;
        
        //到达500ms的定时
        if(cnt >= 500)
        {
            cnt=0;
            
            PFout(9)^=1;
        
        }
    }

     

    #include <stdio.h>
    #include "stm32f4xx.h"
    #include "sys.h"
    
    GPIO_InitTypeDef   GPIO_InitStructure;
    
    int main(void)
    {
    
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
        /* 配置PF9引脚为输出模式 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                    //第9根引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //设置输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽模式,增加驱动电流
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;            //设置IO的速度为100MHz,频率越高性能越好,频率越低,功耗越低
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //不需要上拉电阻
        GPIO_Init(GPIOF, &GPIO_InitStructure);
    
        //初始化系统定时器,1S内核触发1000次中断,说白了定时1ms
        //SysTick_Config(SystemCoreClock/1000);// 168000000
        
        //初始化系统定时器,1S内核触发10次中断,说白了定时100ms,现象失败
        SysTick_Config(SystemCoreClock/10);    
        
        //初始化系统定时器,1S内核触发11次中断,说白了定时90.90ms,能够成功
        SysTick_Config(SystemCoreClock/11);    
        
        PFout(9)=1;
        
        while(1)
        {
    
    
        }
    
    }
    
    
    void SysTick_Handler(void)
    {
        static uint32_t cnt=0;
        
        cnt++;
        
        //到达500ms的定时
        if(cnt >= 5)
        {
            cnt=0;
            
            PFout(9)^=1;
        
        }
    }

     

     

    3.  定时时间的计算

    SysTick_Config(SystemCoreClock/频率);

     

     

    让系统定时器触发1秒中断是否可以?如果不可以,最大的定时时间又是什么?

    不能触发1秒中断

     

    在额定频率情况下,最大定时时间 = 2^24 /168000000 ≈ 99.86ms

    超频的频率(216MHz)下,最大定时时间 = 2^24 /216000000≈77.67ms

     

    测试结果:

             //初始化系统定时器,1S内核触发1000次中断,说白了定时1ms,能够成功
             //SysTick_Config(SystemCoreClock/1000);
             
             //初始化系统定时器,1S内核触发10次中断,说白了定时100ms,现象失败 最大只能99.86ms
             SysTick_Config(SystemCoreClock/10);     
             
             //初始化系统定时器,1S内核触发11次中断,说白了定时90.90ms,能够成功
             SysTick_Config(SystemCoreClock/11);     

     

    三、系统定时器的用途

    两个方面:

     

    没有操作系统:只用于延时 

    有操作系统(ucos2 ucos3 freertos....):为操作系统提供精准的定时中断(1ms~50ms)

     

    四、使用系统定时器用于延时的用途

    If you want to use the SysTick timer in polling mode, you can use the count flag in the SysTick Control and

    Status Register (SysTick->CTRL) to determine when the timer reaches zero.

    For example, you can create a timed delay by setting the SysTick timer to a certain value and waiting until it reaches zero:

     

    SysTick->CTRL = 0; // Disable SysTick
    SysTick->LOAD = 0xFF; // Count from 255 to 0 (256 cycles)
    SysTick->VAL = 0; // Clear current value as well as count flag
    SysTick->CTRL = 5; // Enable SysTick timer with processor clock
    while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
    SysTick->CTRL = 0; // Disable SysTick

     

    1.  配置系统定时器的时钟源

     SysTick_Config初始化定时器会触发中断,不需要中断时,用SysTick_CLKSourceConfig来配置

    /**
      * @brief  Configures the SysTick clock source.
      * @param  SysTick_CLKSource: specifies the SysTick clock source.
      *   This parameter can be one of the following values:
      *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
      *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
      * @retval None
      */
    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;
      }
      else
      {
        SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
      }
    }

     

     

    2,系统定时器寄存器

     

    1.  当SysTick使用168MHz系统时钟频率时,代码编写如下:

    void delay_us(uint32_t nus)
    {
     
        SysTick->CTRL = 0;                      // Disable SysTick
        SysTick->LOAD = (SystemCoreClock/1000000)*nus; // 计数值
        SysTick->VAL = 0;                       // Clear current value as well as count flag
        SysTick->CTRL = 5;                      // Enable SysTick timer with processor clock
        while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                      // Disable SysTick
    }
     
    void delay_ms(uint32_t nms)
    {
        SysTick->CTRL = 0;                      // Disable SysTick
        SysTick->LOAD = (SystemCoreClock/1000)*nms; // 计数值
        SysTick->VAL = 0;                       // Clear current value as well as count flag
        SysTick->CTRL = 5;                      // Enable SysTick timer with processor clock
        while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                      // Disable SysTick
    }
     
    最大的延时为99.86ms

     

    2.  当SysTick使用168MHz系统时钟频率并进行8分频时,代码编写如下:

     

    void delay_us(uint32_t nus)
    {
        SysTick->CTRL = 0;                      // Disable SysTick
        SysTick->LOAD = (SystemCoreClock/8/1000000)*nus; // 计数值
        SysTick->VAL = 0;                       // Clear current value as well as count flag
        SysTick->CTRL = 1;                   // Enable SysTick timer with processor clock
        while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                      // Disable SysTick
    }
     
     
    void delay_ms(uint32_t nms)
    {
        SysTick->CTRL = 0;                      // Disable SysTick
        SysTick->LOAD = (SystemCoreClock/8/1000)*nms; // 计数值
        SysTick->VAL = 0;                       // Clear current value as well as count flag
        SysTick->CTRL = 1;                   // Enable SysTick timer with processor clock
        while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                      // Disable SysTick
    }
     
    思考,当前最大的延时时间是多少?如何优化代码,支持秒级别或更长时间的延时?
     
    最大的延时时间 = 2^24 / 21000000 ≈ 798.91ms
     
     
    void delay_ms(uint32_t nms)
    {
        uint32_t m,n;
        
        m = nms/500;
        
        n = nms %500;
        
        //m个500ms的延时
        while(m--)
        {
            SysTick->CTRL = 0;                      // Disable SysTick
            SysTick->LOAD = (SystemCoreClock/8/1000)*500; // 计数值
            SysTick->VAL = 0;                       // Clear current value as well as count flag
            SysTick->CTRL = 1;                      // Enable SysTick timer with processor clock,当使用21MHz的时候,1;当使用168MHz的时候,5;
            while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
            SysTick->CTRL = 0;                      // Disable SysTick  
        }
     
        //不足500ms的延时
        if(n)
        {
            SysTick->CTRL = 0;                      // Disable SysTick
            SysTick->LOAD = (SystemCoreClock/8/1000)*n; // 计数值
            SysTick->VAL = 0;                       // Clear current value as well as count flag
            SysTick->CTRL = 1;                      // Enable SysTick timer with processor clock,当使用21MHz的时候,1;当使用168MHz的时候,5;
            while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
            SysTick->CTRL = 0;                      // Disable SysTick      
        
        }
    }

     

     

     

    #include <stdio.h>
    #include "stm32f4xx.h"
    #include "sys.h"
    
    GPIO_InitTypeDef   GPIO_InitStructure;
    
    
    void delay_us(uint32_t nus)
    {
        SysTick->CTRL = 0;                         // Disable SysTick
        SysTick->LOAD = (SystemCoreClock/8/1000000)*nus; // 计数值
        SysTick->VAL = 0;                         // Clear current value as well as count flag
        SysTick->CTRL = 1;                         // Enable SysTick timer with processor clock,当使用21MHz的时候,1;当使用168MHz的时候,5;
        while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
        SysTick->CTRL = 0;                         // Disable SysTick
    }
    
    
    void delay_ms(uint32_t nms)
    {
        uint32_t m,n;
        
        m = nms/500;
        
        n = nms %500;
        
        //m个500ms的延时
        while(m--)
        {
            SysTick->CTRL = 0;                         // Disable SysTick
            SysTick->LOAD = (SystemCoreClock/8/1000)*500; // 计数值
            SysTick->VAL = 0;                         // Clear current value as well as count flag
            SysTick->CTRL = 1;                         // Enable SysTick timer with processor clock,当使用21MHz的时候,1;当使用168MHz的时候,5;
            while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
            SysTick->CTRL = 0;                         // Disable SysTick    
        }
    
        //不足500ms的延时
        if(n)
        {
            SysTick->CTRL = 0;                         // Disable SysTick
            SysTick->LOAD = (SystemCoreClock/8/1000)*n; // 计数值
            SysTick->VAL = 0;                         // Clear current value as well as count flag
            SysTick->CTRL = 1;                         // Enable SysTick timer with processor clock,当使用21MHz的时候,1;当使用168MHz的时候,5;
            while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set
            SysTick->CTRL = 0;                         // Disable SysTick        
        
        }
    }
    
    
    
    int main(void)
    {
        //配置系统定时器时钟源,当前是使用168MHz
        //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
        
        //配置系统定时器时钟源,当前是使用168MHz/8=21MHz
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    
    
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
        /* 配置PF9引脚为输出模式 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                    //第9根引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //设置输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽模式,增加驱动电流
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;            //设置IO的速度为100MHz,频率越高性能越好,频率越低,功耗越低
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //不需要上拉电阻
        GPIO_Init(GPIOF, &GPIO_InitStructure);
    
        
        while(1)
        {
    #if 0        
            delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);
            
            PFout(9)=0;
            
            delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);delay_ms(90);
            
            PFout(9)=1;        
    #else
            delay_ms(1000);
            
            PFout(9)=0;        
            
            delay_ms(1000);
            
            PFout(9)=1;            
    #endif
        }
    
    }

     

     

     

     

     

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/xiangtingshen/p/10961014.html

    展开全文
  • 硬件时钟和系统时钟

    千次阅读 2017-03-23 16:51:48
    硬件时钟和系统时钟  1、硬件时钟:硬件时钟是存储在主板上CMOS里的时钟,关机后该时钟依然运行,主板的电池为它供电。对应于嵌入式设备有一个RTC模块。硬件时钟即RTC时钟。  2、系统时钟:是软件系统的时钟。软件...

     
     
    硬件时钟和系统时钟 
    1、硬件时钟:硬件时钟是存储在主板上CMOS里的时钟,关机后该时钟依然运行,主板的电池为它供电。对应于嵌入式设备有一个RTC模块。硬件时钟即RTC时钟。 

    2、系统时钟:是软件系统的时钟。软件启动时会去读取硬件时钟,之后则独立运行。 

    3、系统时钟频率:即cpu产生中断供软件系统执行调度的时间间隔。一般一次中断我们叫一个tick。比如我们将系统时钟频率设置为100(sysClkRate函数可设置),即意味着1秒钟会产生100次中断供系统软件调度。 

    4、cpu执行速度:比如cpu主频为800MHz,则1s内理论上可以处理800M个“位”的数据。而我们的cpu有8位、16位、32位直到目前的64位。指令每8位~64位送到cpu处理。由此可知cpu的速度是非常快的。
    展开全文
  • Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。 系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard ...

    Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种

    系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard BIOS Feture"项中进行设置。

    既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作

    从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。

    在Linux中,用于时钟查看和设置的命令主要有date、hwclock。

        1.在虚拟终端中使用date命令来查看和设置系统时间
        查看系统时钟的操作:
        # date

        设置系统时钟的操作:
        # date 091713272003.30

        通用的设置格式:
        # date 月日时分年.秒

        2.使用hwclock或clock命令查看和设置硬件时钟
        查看硬件时钟的操作:
        # hwclock --show 或
        2003年09月17日 星期三 13时24分11秒 -0.482735 seconds

        设置硬件时钟的操作:
        # hwclock --set --date="09/17/2003 13:26:00"

        或者
        # clock --set --date="09/17/2003 13:26:00"

        通用的设置格式:hwclock/clock --set --date=“月/日/年时:分:秒”。

        3.同步系统时钟和硬件时钟

        Linux系统使用hwclock命令来同步系统时钟和硬件时钟。

        硬件时钟与系统时钟同步:
        # hwclock --hctosys

        上面命令中,--hctosys表示Hardware Clock to SYStem clock。

        系统时钟和硬件时钟同步:
        # hwclock --systohc

     

    展开全文
  • [操作系统] 时钟

    千次阅读 2018-01-24 08:27:18
    时钟 时钟 时钟硬件 时钟软件 1 维护日时间 2 防止进程超时运行 3 CPU记账 4 处理报警 5 为各部分提供监视定时器 软定时器 时钟又称为定时器,负责维护时间,防止进程垄断CPU。 1. 时钟硬件 时钟...
  • 时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。 为什么 STM32 ...
  • 系统时钟是什么?时钟系统的作用 1.Q:什么是系统时钟?什么是时钟系统? A:通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。 2.Q:...
  • TMS320F28335之系统时钟

    万次阅读 2016-07-12 14:05:37
    TMS320F28335时钟(1) PLL作用就是对外部时钟进行倍频,降低产生高频时钟信号的成本。但是倍频配置的时候,需要在特定的条件下更改,因此需要检测PLL工作的各种状态信号,因此PLL有两个配置相关寄存器,PLL状态...
  • STM32开发 -- 时钟系统详解

    万次阅读 多人点赞 2018-08-10 10:24:34
    上一篇文章讲了RTC,里面其实已经包含了时钟系统的介绍了。这篇文章将再详细的讲一下。 一、时钟系统框图 二、时钟系统 STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部...
  • 系统时钟,硬件时钟(后备时钟,实时时钟),网络时钟 辨析 1. 系统时钟 系统时钟即为我们看到的操作系统上显示的时间。 系统时钟在电脑开机的时候进行初始化,通过对硬件时钟的“拷贝”完成初始化 注意:这里...
  • 由于Linux时钟和视窗系统时钟从概念的分类、使用到设置都有非常大的不同,所以,搞清晰Linux时钟的工作方式和设置操作,不仅对于Linux初学者有着重大意义,而且对于使用Linux服务器的用户来说尤为重要。   Linux...
  • STM32F407系统时钟配置

    万次阅读 2016-12-25 20:05:04
    STM32F407系统时钟配置时钟树方法一,采用官方库提供的配置(这里外部晶振25MHz,系统配置为168MHz) STM32F4启动与STM32F10X不同,时钟已经默认配置好 启动代码,文件:startup_stm32f4xx.s Reset handler Reset_...
  • 系统时钟和硬件时钟同步

    千次阅读 2015-01-22 16:34:29
    硬件时钟调整与系统时钟一致://system("hwclock -w")int SyncSystemClockToHw(void) { struct timeval tv; struct tm tm_time; int fd; int ret = 0; ret = access("/dev/rtc1",F_OK); if(0 == ret) { fd...
  • STM32系统时钟的配置

    千次阅读 2013-04-12 22:35:44
    在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是...
  • S3C2440系统时钟

    万次阅读 热门讨论 2011-06-20 10:45:00
    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: ... ++++++++++++++++++++++++++++++++++++++++++   ...系统时钟 MINI2440开发板在没有开启时钟前,整
  • STM32F4如何设置系统时钟,非常重要

    万次阅读 多人点赞 2017-05-15 14:58:12
    STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。 方法一,采用官方库提供的...
  • 时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这...
  • STM32系统时钟默认设置

    万次阅读 多人点赞 2017-08-15 16:21:04
    “我们一直都说STM32有一个非常复杂的时钟系统,然而在原子或者野火的例程中,只要涉及到时钟,我们却只能看到类似的库函数调用,如RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);...
  • STM32系统时钟设置详解

    千次阅读 2016-10-10 00:14:57
    本文主要详细介绍了STM32系统时钟的设置,主要是采用控制寄存器来进行操作的,介绍的较为详细,可以作为参考。
  • linux系统时钟和硬件时钟

    千次阅读 2013-01-03 09:31:28
    1、电池驱动 在PC机上,一般都会有由... a) 硬件时钟可以在BIOS启动时设置,重装过系统的朋友一般都会接触过BIOS设置界面,其中可以设置CMOS时间,在此不再赘述。  b) 也可以在操作系统启动后设置,要根据具体的
1 2 3 4 5 ... 20
收藏数 203,704
精华内容 81,481
关键字:

系统时钟