单片机外接时钟_单片机外部时钟与内部时钟 - CSDN
  •  首先,单片机能正常工作的必要条件之一就是时钟电路,时钟单片机的脉搏,是单片机的驱动源,单片机工作是在统一的时钟脉冲控制下一拍一拍进行工作的。这个脉冲由单片机控制器中的时序电路发出的。所以单片机就很...

    1、晶振

            首先,单片机能正常工作的必要条件之一就是时钟电路,时钟是单片机的脉搏,是单片机的驱动源,单片机工作是在统一的时钟脉冲控制下一拍一拍进行工作的。这个脉冲由单片机控制器中的时序电路发出的。所以单片机就很需要晶振。

           晶振,全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。

           单片机工作时,是一条一条地从ROM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周期包括12个时钟周期。如果一个单片机选择了12兆赫兹晶振,它的时钟周期是1/12us,它的一个机器周期是12×(1/12)us,也就是1us。

    2、概述

           任何外设都需要时钟,51单片机,stm32等等,我们知道寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。
           51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个闸,这些闸默认是开启的,因此每个闸都会出水,任意一个闸可以直接用,但存在一个问题,没用到的闸也在出水,即也在耗能。那么水库是能源,闸可认为每个外设的使用状态,时钟可认为是闸的开关。

           stm32之所以是低功耗,它将所有的门都默认设置为disable,需要用哪个开哪个闸,即你用什么外设,打开相应的外设的时钟就可以,其它还是disable,即耗能就会减少。
           51单片机中一个时钟把所有的都包了,而stm32的时钟是有分工的,并且每类时钟的频率不一样,因为没必要所有的时钟都是最高频率,够用即可,好比一个闸水流大小,我就洗个水,出来洗澡的水,没必要,消耗能源也多,所以不同的时钟也会有频率差别,或者在配置的时候可以配置时钟分频。

    3、内部时钟和外部时钟

          单片机的时钟信号由外部振荡和内部振荡两种方式得到

          内部时钟:一般采用使用11.0592MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容(C1、C2)即可,电容容量一般在15pF至50pF之间,对频率有微调作用。即构成了自激振荡器,发出的脉冲直接送入内部时钟电路。

          注意:晶振和电容尽可能安装的与单片机引脚XTAL1和XTAL2靠近。为了减少寄生电容,更好的保证振荡器稳定。

          外部时钟:将外部振荡脉冲接入XTAL1和XTAL2,即把已有的时钟信号引入单片机内,外部时钟方式适宜用来使单片机的时钟与外部信号一致。对于HMOS的单片机,外部时钟信号由XTAL2引入,对于CHMOS的单片机,外部时钟由XTAL1引入。

    部分内容转载: http://zhidao.baidu.com/question/96722533.html

                              http://m.elecfans.com/article/567385.html

                              http://m.elecfans.com/article/771350.html

                              https://zhidao.baidu.com/question/96722533.html

    供学习内容:    http://www.elecfans.com/d/718515.html

                              http://www.elecfans.com/d/663853.html

     

     

     

     

     

    展开全文
  • 时钟电路就是一个振荡器,给... 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机时钟方式。根据硬件电路的...

     

    时钟电路就是一个振荡器,给单片机提供一个节拍,单片机执行各种操作必须在这个节拍的控制下才能进行。因此单片机没有时钟电路是不会正常工作的。时钟电路本身是不会控制什么东西,而是你通过程序让单片机根据时钟来做相应的工作。 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如图1所示。

    内部时钟原理图 (就是一个自激振荡电路) 在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常C1和C2一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。对于外接时钟电路,要求XTAL1接地,XTAL2脚接外部时钟,对于外部时钟信号并无特殊要求,只要保证一定的脉冲宽度,时钟频率低于12MHz即可。 晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。

     

    展开全文
  • 简单的说,时钟单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个...

    1.概述

    简单的说,时钟是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个时钟tick,系统都会处理一步数据,这样才能让工作不出现紊乱。

    2.原理

    首先,任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。
    51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个门,这些门默认是开启的,所以每个门都会出水,我们需要哪个门的水的时候可以直接用,但是也存在一个问题,其他没用到的门也在出水,即也在耗能。这里水库可以认为是能源,门可以认为是每个外设的使用状态,时钟可以认为是门的开关。stm32之所以是低功耗,他将所有的门都默认设置为disable,在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable,这样耗能就会减少。
    在51单片机中一个时钟把所有的都包了,而stm32的时钟是有分工的,并且每类时钟的频率不一样,因为没必要所有的时钟都是最高频率,只要够用就行,好比一个门出来水流大小,我只要洗脸,但是出来的是和洪水一样涌出来的水,那就gg了,消耗能源也多,所以不同的时钟也会有频率差别,或者在配置的时候可以配置时钟分频。

    拓展:为何要先配置时钟,再配置GPIO(功能模块)

    所有寄存器都需要时钟才能配置,寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。
    任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。
    51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。
    例如,某个功能不需要,但是它还是一直运行。
    stm32需要配置时钟,就可以把不需要那些功能的功耗去掉。
    当你想关闭某个IO的时候,关闭它相对应的时钟使能就是了,不过在51里面,在使用IO的时候是没有设置IO的时钟的,还有在STM32中,有外部和内部时钟之分,关于时钟等好好研究
    ARM的芯片都是这样,外设通常都是给了时钟后,才能设置它的寄存器(即才能使用这个外设)。STM32、LPC1XXX等等都是这样。
    这么做的目的是为了省电,使用了所谓时钟门控的技术。
    这也属于电路里同步电路的范畴:同步电路总是需要1个时钟。

    3.分类

    时钟发生器用于产生时钟,并提供给CPU和外部硬件设备。

    有如下三种系统时钟。

    (1)主系统时钟

    ①通过连接一个振荡器到X1和X2,该振荡电路产生fx=1到20MHZ的时钟;

    ②使用内部高速振荡器产生fRH=8MHZ的时钟。

    (2)副系统时钟

    ①通过在XT1和XT2之间连接一个fXT=32.768KHZ的振荡器;

    ②通过XT2引脚提供一个外部副系统时钟fexclks=32.768KHZ。

    (3)内部低速振荡时钟(看门狗定时器时钟)

    ①内部低速振荡器,以fRL=240KHZ的时钟振荡。该时钟不能作为CPU时钟。

    4.配置

    一、在STM32中,有五个时钟源,为HSIHSELSILSEPLL

    HSI是高速内部时钟,RC振荡器,频率为8MHz。

    HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

    LSI是低速内部时钟,RC振荡器,频率为40kHz。

    LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

    PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

    二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:

    ①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
    ②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面)节省2个外部电阻。

    三、用HSE时钟,程序设置时钟参数流程
    01、将RCC寄存器重新设置为默认值   RCC_DeInit;
    02、打开外部高速时钟晶振HSE    RCC_HSEConfig(RCC_HSE_ON);
    03、等待外部高速时钟晶振工作    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    04、设置AHB时钟         RCC_HCLKConfig;
    05、设置高速AHB时钟     RCC_PCLK2Config;
    06、设置低速速AHB时钟   RCC_PCLK1Config;
    07、设置PLL              RCC_PLLConfig;
    08、打开PLL              RCC_PLLCmd(ENABLE);
    09、等待PLL工作   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    10、设置系统时钟        RCC_SYSCLKConfig;
    11、判断是否PLL是系统时钟     while(RCC_GetSYSCLKSource() != 0x08)
    12、打开要使用的外设时钟    RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

    四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)

    /*******************************************************************************

    * Function Name  : RCC_Configuration 

    * Description    :  RCC配置(使用外部8MHz晶振)

    * Input            : 无

    * Output         : 无

    * Return         : 无

    *******************************************************************************/

    void RCC_Configuration(void)

    {

      /*将外设RCC寄存器重设为缺省值*/

      RCC_DeInit();

      /*设置外部高速晶振(HSE)*/

      RCC_HSEConfig(RCC_HSE_ON);   //RCC_HSE_ON——HSE晶振打开(ON)

      /*等待HSE起振*/

      HSEStartUpStatus = RCC_WaitForHSEStartUp();

      if(HSEStartUpStatus == SUCCESS)        //SUCCESS:HSE晶振稳定且就绪

      {

        /*设置AHB时钟(HCLK)*/ 

        RCC_HCLKConfig(RCC_SYSCLK_Div1);  //RCC_SYSCLK_Div1——AHB时钟= 系统时钟

        /* 设置高速AHB时钟(PCLK2)*/ 

        RCC_PCLK2Config(RCC_HCLK_Div1);   //RCC_HCLK_Div1——APB2时钟= HCLK

        /*设置低速AHB时钟(PCLK1)*/    

    RCC_PCLK1Config(RCC_HCLK_Div2);   //RCC_HCLK_Div2——APB1时钟= HCLK / 2

        /*设置FLASH存储器延时时钟周期数*/

        FLASH_SetLatency(FLASH_Latency_2);    //FLASH_Latency_2  2延时周期

     /*选择FLASH预取指缓存的模式*/  

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       // 预取指缓存使能

        /*设置PLL时钟源及倍频系数*/ 

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     

    // PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9

      /*使能PLL */

        RCC_PLLCmd(ENABLE);

        /*检查指定的RCC标志位(PLL准备好标志)设置与否*/   

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)      

           {

           }

     

        /*设置系统时钟(SYSCLK)*/ 

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 

    //RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟

     

        /* PLL返回用作系统时钟的时钟源*/

        while(RCC_GetSYSCLKSource() != 0x08)        //0x08:PLL作为系统时钟

           { 

           }

     /*使能或者失能APB2外设时钟*/    

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | 

    RCC_APB2Periph_GPIOC , ENABLE); 

    //RCC_APB2Periph_GPIOA    GPIOA时钟

    //RCC_APB2Periph_GPIOB    GPIOB时钟

    //RCC_APB2Periph_GPIOC    GPIOC时钟

    //RCC_APB2Periph_GPIOD    GPIOD时钟

    }

    五、时钟频率

    STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。目前TI的M3系列芯片最高频率可以达到80M。

    在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。

    文件开头就有一个这样的定义: 
    //#define SYSCLK_FREQ_HSE    HSE_Value 
    //#define SYSCLK_FREQ_20MHz 20000000 
    //#define SYSCLK_FREQ_36MHz 36000000 
    //#define SYSCLK_FREQ_48MHz 48000000 
    //#define SYSCLK_FREQ_56MHz 56000000 
    #define SYSCLK_FREQ_72MHz 72000000

    ST 官方推荐的外接晶振是 8M,所以库函数的设置都是假定你的硬件已经接了 8M 晶振来运算的.以上东西就是默认晶振 8M 的时候,推荐的 CPU 频率选择.在这里选择了:
    #define SYSCLK_FREQ_72MHz 72000000 
    也就是103系列能跑到的最大值72M

    然后这个 C文件继续往下看 
    #elif defined SYSCLK_FREQ_72MHz 
    const uint32_t SystemFrequency         = SYSCLK_FREQ_72MHz;    
    const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz;    
    const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;    
    const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);
    const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;

    这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了: 
    #elif defined SYSCLK_FREQ_72MHz 
    static void SetSysClockTo72(void);

    这就是定义 72M 的时候,设置时钟的函数.这个函数被 SetSysClock ()函数调用,而
    SetSysClock ()函数则是被 SystemInit()函数调用.最后 SystemInit()函数,就是被你调用的了

    所以设置系统时钟的流程就是: 
    首先用户程序调用 SystemInit()函数,这是一个库函数,然后 SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用 SetSysClock()函数. SetSysClock()函数根据那个#define SYSCLK_FREQ_72MHz 72000000 的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置
    ~!@#$%^然后,CPU跑起来了,而且速度是 72M. 虽然说的有点累赘,但大家只需要知道,用户要设置频率,程序中就做的就两个事情:

    第一个: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000 

    第二个:调用SystemInit()

    展开全文
  • 时钟周期: 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。 机器周期: 在计算机...

    最近一直在想怎么测单片机的总线时钟,于是想出了一个方法,也不知是否正确,权且估算一下吧。

    先说明一下时钟周期,机器周期,总线周期的区别吧:

    时钟周期: 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。

    机器周期:    在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。    8051系列单片机的一个机器周期同6个 S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个 状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。 (例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒)

    指令周期:    执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。       对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。    通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。

     

    总线周期: 由于存贮器和I/O端口是挂接在总线上的,CPU对存贮器和I/O接口的访问,是通过总线实现的。通常把CPU通过总线对微处理器外部(存贮器或 I/O接口)进行一次访问所需时间称为一个总线周期。

    总结:时钟周期是最小单位,机器周期需要1个或多个时钟周期,指令周期需要1个或多个机器周期;机器周期指的是完成一个基本操作的时间,这个基本操作有时可能包含总线读写,因而包含总线周期,但是有时可能与总线读写无关,所以,并无明确的相互包含的关系。指令周期:是CPU的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。现在的处理器的大部分指令(ARM、DSP)均采用单指令执行周期。机器周期:完成一个基本操作的时间单元,如取指周期、取数周期。时钟周期:CPU的晶振的工作频率的倒数。

     

    一个nop所占的时间为一个机器指令的时间,8051中为1us。

     

    单片机型号为飞思卡尔MC9s12xep100,在main函数里放置时钟初始化函数,同时初始化一个引脚,并设置为输出,然后主函数放置该引脚电平的翻转函数。大致如下;

    逻辑分析仪版:

    void main()
    {
      MCUInit();
      DDRP_DDRP4=1;//PTP4设置为输出
      while(1)
      {
        PTP_PTP4=0;
        PTP_PTP4=1; 
        PTP_PTP4=0;
      }
    }

    在16MHZ总线情况下,该引脚从0-->1-->0的时间,也就是高电平的保持时间为480ns

    当加入nop后,如下图所示,在同等情况下,高电平时间为540ns,也就是说一个nop占了60ns。

    void main()
    {
      MCUInit();
      DDRP_DDRP4=1;//PTP4设置为输出
      while(1)
      {
        PTP_PTP4=0;
        PTP_PTP4=1; 
        asm("nop");
        PTP_PTP4=0;
      }
    }

    这个60ns就和(1/总线频率)=62.5ns很相似了,如果放置10个nop会怎样呢?大约耗时1.105us,减掉480ns,还有625ns,那么一个nop占62.5ns。如果继续增加呢,100个nop会怎样呢?大约耗时6.725us,减掉480ns,还有6245ns,平均下来一个nop占62.45ns。事实上,在采集波形时也会有6.73us(正好一个nop62.5ns)的情况,但出现的频率没有6.725us的多,所以写了6.725us。

    uint16_t ADS[16];
    void main()
    {
      MCUInit();
      DDRP_DDRP4=1;//PTP4设置为输出
      while(1)
      {
        PTP_PTP4=0;
        PTP_PTP4=1; 
        ADS[0]=1;
        ADS[1]=2;
        ADS[2]=3;
        ADS[3]=4;
        ADS[4]=5;
        ADS[5]=6;
        ADS[6]=7;
        ADS[7]=8;
        ADS[8]=9;
        ADS[9]=0;
        ADS[10]=10;
        ADS[11]=11;
        ADS[12]=12;
        ADS[13]=13;
        ADS[14]=14;
        ADS[15]=15;
        PTP_PTP4=0;
      }
    }

    总共有16句话,unsigned int类型,测得的时间为4.54us,减掉480ns,再进行平均,一条语句占用253.75ns,再除以62.5 ≈4.

    如果将类型改为unsigned char类型,测得的时间为2.98us,减掉480ns,再进行平均,一条语句占用156.25ns,再除以62.5 ≈2.5.

    下面是同等情况下的数据,仅供参考

    类型 时间 与62.5ns倍数关系
    总线频率 16MHZ(62.5ns)  
    引脚从0-->1-->0时间 480ns  
    char 156.25ns 2.5
    unsigned char 156.25ns 2.5
    int 253.75ns 4
    unsigned int 253.75ns 4
    float 519.375ns 8.31
    double 519.375ns 8.31

    除了变量类型有影响外,发现被赋值的值如果是0~255,与0~65535也是不同的,后者花费的时间比前者要长一些。

    示波器版:

    void main()
    {
      MCUInit();
      DDRP_DDRP4=1;//PTP4设置为输出
      while(1)
      {
        PTP_PTP4=~PTP_PTP4; 
      }
    }

    然后用示波器测量该引脚翻转电平所用的时间,以下是部分数据:(示波器精度有限)

     

    总线频率—>耗时    ≈ (1/总线频率)*10

    16MHZ  —>620ns ≈ 625ns

    20MHZ  —>500ns ≈ 500ns

    32MHZ  —>312ns ≈ 312ns

    40MHZ  —>252ns ≈ 250ns

    48MHZ  —>208ns ≈ 208ns

    60MHZ  —>168ns ≈ 166ns
     

    通过上面的数据,发现耗时与 (1/总线频率)*10基本相等,至于为何乘10,不知何因。权且当做粗略估算吧。

     

     

    ----------------------------------------------------------------单片机9s08dz60------------------------------------------------------------------------------

    顺便记录下对dz60的测试

     

    总线频率—>翻转电平耗时    ≈ (1/总线频率)*10   asm("nop")耗时

    16MHZ  —>680ns               ≈ 625ns                 370ns

    8MHZ  —>1.36us               ≈ 1.25us                 740ns

    4MHZ  —>2.76us               ≈ 2.50us                 1.5us

    其中asm("nop")耗时的计算方法如下:

     

    void main()
    {
      MCUInit();
      DDRP_DDRP4=1;//PTP4设置为输出
      while(1)
      {
        PTP_PTP4=1; 
        asm("nop");
        PTP_PTP4=0; 
      }
    }

    下面附dz60时钟初始化函数(晶振8MHZ,总线8MHZ)

     

     

    void MCUInit(void)
    { 
            SOPT1 = 0x20;						//取消看门狗,使能停止模式
    	SOPT2 = 0X00;						//写入一次SOPT2
    	/* 初始化时钟,使用PEE模式,晶振为8Mhz,总线频率为8mhz(datasheet P151) */  
    	/*----------------------------FEI -> FBE----------------------------------*/
    	MCGC2 = 0x36;						//总线分频为1.P133.
    	while (!MCGSC_OSCINIT);				//EREFS位选择的晶体是否完成初始化.P134.
    	MCGC1 = 0xB8;						//选择使用外部晶振.P131.
    	while (MCGSC_IREFST);       		//等待外部参考成为参考时钟的当前源
    	while(MCGSC_CLKST != 2);			//等待外部参考 时钟成为 MCGOUT
    	
    	/*----------------------------FBE -> BLPE---------------------------------*/ 
    	MCGC2 = 0x3E;						//设置LP位为1(此时已经进入BLPE模式)
    	MCGC1 = 0x98;//0x98->RDIV=8;0x90->RDIV=4;		//更改RDIV
    	MCGC3 = 0x44;//0x44->VDIV=16;0x48->VDIV=32		//选择PLL,VDIV为4
    	while(!MCGSC_PLLST);				//PLLS时钟的当前源是否PLL
    
    	/*----------------------------BLPE -> PBE---------------------------------*/ 
    	MCGC2 = 0x36;						//设置LP位为0(此时已经进入BLPE模式)	
    	while (!MCGSC_LOCK);				//等待PLL获得锁定
    
    	/*----------------------------PBE -> PEE----------------------------------*/
    	MCGC1 = 0x18;						//选择PLL为系统时钟
    	while(MCGSC_CLKST != 3);			//等待时钟稳定
    }

    MCGOUT=(8MHZ/8)*16/1=16MHZ,总线时钟为8MHZ

     

     



     

     

     

     

     

     

     

    展开全文
  • 单片机时钟的解析

    2018-11-17 12:02:34
     时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。  在一个时钟周期内,CPU仅完成一个最...

    时钟周期

           时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。

           在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟频率越高,工作速度就越快。

           8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

    机器周期

           计算机中,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。每一项工作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期。8051系列单片机的一个机器周期由6个S周期(状态周期)组成。 一个S周期=2个节拍(P),所以8051单片机的一个机器周期=6个状态周期=12个时钟周期。

           例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒;

    指令周期

        执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。

    CPU 周期信号、节拍周期信号、节拍脉冲信号三者之间的关系是什么?

          一小块石英晶体加电后产生压电反应,在固定频率振动,产生出电压按照固定周期变化的脉冲信号。这个高频率的信号通向分频器(frequency divider),转化为比较低频的信号。

     以上图为例,分频器分出来的信号有四个频率。题目中所说 CPU周期信号、节拍周期信号、节拍脉冲信号本质上都是时钟脉冲的不同分频,主要区别在于用途上。

         通常来说,CPU 周期信号最“慢”,它决定 CPU 所处的状态。CPU 执行一条指令的周期叫做指令周期(instruction cycle),指令周期可以划分为 fetch、decode、和 execute 三个部分,所以也叫 fetch-decode-execute cycle。假设上图与 QD 频率相同的信号有三个,QD1、QD2、QD3,它们分别依次处于高电位,那么就可以用它们来控制 CPU 处于 fetch、decode、还是 execute 状态,这就是 CPU 周期信号。

         节拍周期信号是控制信号,调整电路的功能。比如,现在 CPU 处于 fetch 状态,仍旧以上图为例,假设 QC 这个比 QD “快”的信号有 QC1、QC2、QC3……QCi 个,分别对应电路的不同功能(比如,应该将从内存中取来的数字作为指令解释,还是送给寄存器存起来),谁处于高电位,CPU 就能执行谁决定的功能。

          节拍脉冲信号则是触发信号,决定电路的实际工作起点。以上图的 QB 为例,假设 QD1 决定 CPU 处于 fetch 阶段,QC1 决定 CPU 的功能是去内存取一个数字,那么 QB 的上升沿会触发整个电路切实地执行这个功能。

          可以这样类比:

          某诊所周一二三门诊,周四五看复诊病人,周六日不办公

    ——对应三个 CPU 周期

          诊所星期一二三 8:00 开始门诊,12:00 午休,13:00 继续门诊,17:00 关门

    ——对应节拍周期

          某个病人星期二 9:00 去看了病

    ——对应脉冲信号

        (注意上面的说法极度简化,实际的实现要复杂很多,比如振动源不一定是石英,每个 CPU 周期未必等长,CPU 也并不是在某一时刻只能处于单独一种周期状态里(详见 pipelining),乃至周期层级也未必就是三层等等。)

     

     

     

     

     

     

     

    展开全文
  • 一、时钟周期   时钟周期,一般也称振荡周期。定义为时钟频率的倒数,如果晶振的输出没有经过分频或倍频就直接作为CPU的工作时钟,则时钟周期就等于晶振...  比如,一个8051单片机外接一个8MHz的晶振,晶振不分...
  • 单片机时钟电路

    2019-08-21 21:37:40
    首先,单片机能正常工作的必要条件之一就是时钟电路,所以单片机就很需要晶振。  晶振,全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机...
  • 单片机时钟及复位

    2007-06-25 09:35:00
    51单片机时钟及复位 单片机时钟信号用来提供单片机片内各种微操作的时间基准,复位操作则使单片机的片内电路初始化,使单片机从一种确定的初态开始运行。 时钟电路:8031单片机时钟信号通常用两种电路形式得到...
  • 一、时钟周期 **时钟周期**,一般也称**振荡周期**。如果晶振的输出没有经过分频或倍频就直接作为cpu的工作时钟,则时钟周期就等于晶振的振荡...对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周...
  • 01 在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,...时钟电路:(a)内部方式时钟电路,(b)外接时钟电路 在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调...
  • 导读:本文针对用单片机制作电子钟或要求根据时钟启控的控制系统时,出现的校准了的电子时钟的时间竟然变快或是变慢了的情况而提出的一种解决方案。 单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求...
  • 实现实时时钟,电源拔插时间不重置(内置电池供电维持时间变化)。功能有查看日期,查看星期,查看闹钟和分别的调整时间,调整日期,调整闹钟,调整星期。且默认情况下不可以调整,当按下可调控键之后才可以调整、...
  • 说到51单片机时钟首先想到51时怎么工作的呢?微型控制器要想工作必须要有一个“动力”,对于51单片机来说,这个“动力”就是时钟源。一般应用上会外接一个12MHz的晶振作为时钟源。 一般第一种接法用的比较多。...
  •  时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。  在一个时钟周期内,...
  • 无论是小型单片机还是像STM32这样高级单片机,它们工作的核心都是大规模的时序逻辑电路,而驱动时序逻辑电路的关键则是准确而又稳定的时钟源。它的作用就像小学在操场上做广播体操时候播放的背景音乐,用于协调和...
  • 时钟电路就是一个振荡器,给单片机提供一个节拍,单片机执行各种操作必须在这个节拍的控制下才能进行。因此单片机没有时钟电路是不会正常工作的。时钟电路本身是不会控制什么东西,而是你通过程序让单片机根据时钟来...
  • 0101在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机时钟方式...
  • 导读: 无论是单片机还是微处理器,它们的核心都是大规模的时序逻辑电路,而驱动时序逻辑电路的动力则是准确而稳定的时钟源——不要小看定语“准确而稳定”哦,实际上人类的科技之所以能如此稳定、高速的发展,就是...
  • 时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us,是计算机中最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。由于时钟脉冲是计算机的基本工作脉冲,它控制着...
  • 百度空间居然倒闭了STC15单片机学习日记-时钟与复位" TITLE="2015.07.25 STC15单片机学习日记-时钟与复位" />,去年暑假写的VB日记全都没了,怪可惜的。今天看了了STC15单片机时钟与复位部分。   STC15出厂时内...
1 2 3 4 5 ... 20
收藏数 2,484
精华内容 993
关键字:

单片机外接时钟