zoukankan      html  css  js  c++  java
  • 系统源TinyOS之Blink(三) 默认系统主时钟初始化分析

    最近研究系统源,稍微总结一下,以后继续补充:

        

    对于tmote平台,基础时钟模块有3个时钟输入源:

        

     

        

    • LFXT1CLK:低速时钟源(32.768k低速晶振)
    • XT2CLK:高速时钟源(8M高速晶振)
    • DCOCLK:数字控制RC振荡器

        基础时钟模块可提供3种时钟信号:

        

     

        

     

        

    • ACLK(辅助时钟):ACLK是LFXT1CLK信号经1、2、4、8分频后得到的。ACLK可由软件选作各个外围模块的时钟信号,一般用于低速外设。
    • MCLK(系统主时钟):MCLK可由软件选择来自LFXT1CLK、TX2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到。MCLK重要用于CPU和系统。
    • SMCLK(子系统时钟):可由软件选择来自LFXT1CLK和DCOCLK,或者XT2CLK和DCOCLK(由详细器件决定),然后经1、2、4、8分频得到。SMCLK重要用于高速外围模块。

        在本篇文章中我们重要存眷MCLK(系统主时钟)的初始化过程,因为该时钟决定程序的执行效率。

        

     

        

    硬件平台时钟初始化是在tinyos2.1/tos/platform/telosa/PlatformP.nc完成的:

        

    command error_t Init.init() {
        call MoteClockInit.init();
        call MoteInit.init();
        call LedsInit.init();
        return SUCCESS;
      }

        

    MoteClockInit接口在tinyos2.1/tos/platform/telosa/PlatformC.nc中进行绑定:

        

    PlatformP.MoteClockInit -> MoteClockC;

        每日一道理
    成熟是一种明亮而不刺眼的光辉,一种圆润而不腻耳的音响,一种不需要对别人察颜观色的从容,一种终于停止了向周围申诉求告的大气,一种不理会哄闹的微笑,一种洗刷了偏激的淡漠,一种无须声张的厚实,一种并不陡峭的高度。

        

    组件MoteClockC位于tinyos2.1/tos/platform/telosb/MoteClockC.nc。在一层层的剥离以后,我们终究找到位于tinyos2.1/tos/chips/msp430/timer/msp430ClockP.nc中的系统时钟初始化的详细实现-

        

      command error_t Init.init()
      {
        // Reset timers and clear interrupt vectors
        TACTL = TACLR;
        TAIV = 0;
        TBCTL = TBCLR;
        TBIV = 0;

        atomic
        {
          signal Msp430ClockInit.setupDcoCalibrate();
          busyCalibrateDco();
          signal Msp430ClockInit.initClocks();
          signal Msp430ClockInit.initTimerA();
          signal Msp430ClockInit.initTimerB();
          startTimerA();
          startTimerB();
        }

        return SUCCESS;
      }
    }

        

    在这里我们重要存眷Msp430ClockInit.initClocks(),其详细实现如下:

        

    command void Msp430ClockInit.defaultInitClocks()
      {
        // BCSCTL1
        // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK
        // .XTS = 0; set low frequency mode for LXFT1
        // .DIVA = 0; set the divisor on ACLK to 1
        // .RSEL, do not modify
        BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0));

        // BCSCTL2
        // .SELM = 0; select DCOCLK as source for MCLK
        // .DIVM = 0; set the divisor of MCLK to 1
        // .SELS = 0; select DCOCLK as source for SCLK
        // .DIVS = 2; set the divisor of SCLK to 4
        // .DCOR = 0; select internal resistor for DCO
        BCSCTL2 = DIVS1;

        // IE1.OFIE = 0; no interrupt for oscillator fault
        CLR_FLAG( IE1, OFIE );
      }

        

    从上面的程序中可以清晰的懂得到,系统主时钟的时钟源来自数字DCO,频率在1M-10M。

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

  • 相关阅读:
    Xshell学习第九课:数组与字符串
    Xshell学习第八课:函数
    Xshell学习第七课:sed语句
    Xshell学习第六课:read与for语句循环
    Xshell学习第五课:if判断语句
    Xshell学习第四课:grep与正则表达式
    Xshell学习第三课:编程原理
    Xshell学习第二课:重定向和管道符
    iOS中坐标转换
    iOS工作笔记(十五)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3080568.html
Copyright © 2011-2022 走看看