历史上的今天
返回首页

历史上的今天

今天是:2025年03月01日(星期六)

2020年03月01日 | MSP430时钟定性分析

2020-03-01 来源:eefocus

1.时钟参数

1.1 宏定义时钟注释

//宏定义外接时钟,设置时钟很重要

#define EXTAL_IN_XT1_HZ   (  32768)

#define EXTAL_IN_XT2_HZ   (4000000)

//宏定义内部REFO,VLO时钟频率

#define VLOCLK_FREQUENCY  (  10000)

#define REFOCLK_FREQUENCY (  32768)


1.2 时钟来源

 switch(clk)

 {

  case CLOCK_XT1    :g_sClock.CLK.nHZ = EXTAL_IN_XT1_HZ;break;

  case CLOCK_VLO    :g_sClock.CLK.nHZ = VLOCLK_FREQUENCY;break;

  case CLOCK_REFO   :g_sClock.CLK.nHZ = REFOCLK_FREQUENCY;break;       

  case CLOCK_DCO    :g_sClock.CLK.nHZ = g_sClock.DCO_FLL_Frequency;break;    

  case CLOCK_DCO_DIV:g_sClock.CLK.nHZ = g_sClock.DCO_FLL_Frequency;break;

  case CLOCK_XT2    :g_sClock.CLK.nHZ = EXTAL_IN_XT2_HZ;break;

  default :return;

 }


1.3 时钟参数介绍

typedef enum

{

  CLOCK_XT1,        //XT1      

  CLOCK_VLO,        //内部10K

  CLOCK_REFO,       //内部32768

  CLOCK_DCO, //内部DCO,如果使用内部DCO作为时钟的话,需要先调用DCO_PLLConfig设置DCO频率

  CLOCK_DCO_DIV,   //DCO分频(分频为1且不允许修改,与DCO同频)

  CLOCK_XT2,       //XT2

}CLOCK_Source;     //时钟源


1.4 时钟分表

时钟源 时钟频率(HZ) 时钟源 时钟频率(Hz)

CLOCK_XT1 32768(32.768k) CLOCK_DCO 自主设置倍频

CLOCK_VLO 10000(10k) CLOCK_DCO_DIV 同CLOCK_DCO

CLOCK_REFO 32768(32.768k) CLOCK_XT2 4000000(4M)

2.频率配置过程

2.1 XT1时钟配置初始化

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

*  函数名称:XT1_Config(STATUS status)

*  功能说明:设置是否使能XT1

*  参数说明:STATUS status:是否使能XT1

*  函数返回:无

*  使用示例:XT1_Config(ENABLE);   //使能XT1

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

static inline void XT1_Config(STATUS status)

{

  if(status != DISABLE)

  {

    if(UCS->XT1_OFF == BIT_SET)

    {

      GPIO_MultiBits_Init(P5,(GPIO_Pin_4|GPIO_Pin_5),GPI|SEL);   //选用 XT1 第二功能

      UCS->XT1_OFF = RESET ;                          // 开启 XT1                       

      do

      {

        UCS->XT1_LFOFFG = RESET;                     // 清除XT1,CLOCK_DCO 失效标志                     

        SFRIFG1 &= ~OFIFG;                           //

      }while (UCS->XT1_LFOFFG == BIT_SET);               //

    }

  }

  else

  {

    UCS->XT1_OFF = BIT_SET ;                          // 关闭 XT1                       

  }

}


2.2 XT2时钟配置初始化

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

*  函数名称:XT2_Config(STATUS status)

*  功能说明:设置是否使能XT2

*  参数说明:STATUS status:是否使能XT2

*  函数返回:无

*  使用示例:XT2_Config(TRUE);   //使能XT2

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

static inline void XT2_Config(STATUS status)

{

  if(status != DISABLE)

  {

    if(UCS->XT2_OFF == BIT_SET)

    {

      GPIO_MultiBits_Init(P5,(GPIO_Pin_2|GPIO_Pin_3),GPI|SEL);      //选用 CLOCK_XT2 第二功能

      UCS->XT2_OFF = RESET;                         //开启 CLOCK_XT2                      

      do

      {

        UCS->XT2_OFFG = RESET;

        SFRIFG1 &= ~OFIFG;                       

      }while (UCS->XT2_OFFG == BIT_SET);

    }

  }

  else

  {

    UCS->XT2_OFF = BIT_SET ;                          // 关闭XT2                       

  }


}


2.3 内部时钟

CLOCK_VLO,CLOCK_REFO为内部时钟源,不需要配置和初始化。


2.4 DCO及DCO_DIV配置过程

由于DCO是可以自主倍频的,倍频函数为CLOCK_DCO_PLLConfig(FLLREF_Source, FLLREF_DIVx, uint32_t DCO_FLL_Fre),由于DCO_DIV分频为1且不允许修改,即DCO_DIV与DCO同频,下面好好分析一下倍频过程


2.4.1 时钟分频系数,共计6种选择

typedef enum

{

  FLLREF_DIV_1     ,   //不分频

  FLLREF_DIV_2     ,   //二分频

  FLLREF_DIV_4     ,   //四分频

  FLLREF_DIV_8     ,   //八分频

  FLLREF_DIV_12    ,   //十二分频

  FLLREF_DIV_16    ,   //十六分频

}FLLREF_DIVx;    //FLL参考时钟分频


2.4.2 参考分频时钟,总计3个

typedef enum

{

  FLLREF_XT1    =0u,    //32.768k

  FLLREF_REFO   =2u,    //10k

  FLLREF_XT2    =5u     //4M

}FLLREF_Source;  //FLL参考时钟源


2.4.3 倍频函数

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

*  函数名称:CLOCK_DCO_PLLConfig(FLLREF_Source refsource, FLLREF_DIVx refdiv, uint32_t DCO_FLL_Fre)

*  功能说明:设置DCO频率,单位(HZ)

*  参数说明:FLLREF_Source refsource :参考时钟源

             FLLREF_DIVx refdiv      :参考时钟源分频系数

             uint32_t DCO_FLL_Fre      :DCO设置频率

*  函数返回:无

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

void CLOCK_DCO_PLLConfig     (FLLREF_Source refsource, FLLREF_DIVx refdiv, uint32_t DCO_FLL_Fre)

{

  static const uint16_t ref_div_value[6]={1,2,4,8,12,16};

  /*根据频率提高内核电压*/

  //SetVcoreUp ( (DCO_FLL_Fre < 12MHz) ? 0 : ((DCO_FLL_Fre < 16MHz) ? 1 : ((DCO_FLL_Fre < 20MHz) ? 2 :3))); //设置内核电压

  if(DCO_FLL_Fre < 12MHz)

    SetVcoreUp (0x00);                      //设置内核电压

  else if(DCO_FLL_Fre < 16MHz)

    SetVcoreUp (0x01);       

  else if(DCO_FLL_Fre < 20MHz)

    SetVcoreUp (0x02);       

  else

    SetVcoreUp (0x03);       


  __bis_SR_register(SCG0);                  // 禁止倍频环FLL,

  UCS->CTL0 = 0x0000;                       // 清零 DCOx, MODx


  if (DCO_FLL_Fre < 0.63MHz)         //           fsystem < 0.63MHz

    UCS->DCORSEL = 0;

  else if (DCO_FLL_Fre < 1.25MHz)    // 0.63MHz < fsystem < 1.25MHz

    UCS->DCORSEL = 1;

  else if (DCO_FLL_Fre < 2.5MHz)     // 1.25MHz < fsystem <  2.5MHz

    UCS->DCORSEL = 2;

  else if (DCO_FLL_Fre <   5MHz)     // 2.5MHz  < fsystem <    5MHz

    UCS->DCORSEL = 3;

  else if (DCO_FLL_Fre <  10MHz)     // 5MHz    < fsystem <   10MHz

    UCS->DCORSEL = 4;

  else if (DCO_FLL_Fre <  20MHz)     // 10MHz   < fsystem <   20MHz

    UCS->DCORSEL = 5;

  else if (DCO_FLL_Fre <  40MHz)     // 20MHz   < fsystem <   40MHz

    UCS->DCORSEL = 6;

  else

    UCS->DCORSEL = 7;


  UCS->FLLREFDIV = refdiv;

  UCS->SELREF = refsource;


  float Fref_value;

  if(refsource == FLLREF_XT2)

  {

    XT2_Config(TRUE);

    Fref_value = (float)((uint32_t)EXTAL_IN_XT2_HZ/ref_div_value[refdiv]);  

  }

  else if(refsource == FLLREF_XT1)

  {

    XT1_Config(TRUE);

    Fref_value = (float)(EXTAL_IN_XT1_HZ/ref_div_value[refdiv]);

  }

  else if(refsource == FLLREF_REFO)

  {

    Fref_value = (float)(REFOCLK_FREQUENCY/ref_div_value[refdiv]);

  }

  uint16_t FLLN_VALUE = (uint16_t)((DCO_FLL_Fre/Fref_value+0.5f)-1u);

  ASSERT(FLLN_VALUE < 1024,"CLOCK_DCO_PLLConfig","FLLN_VALUE不允许超过1023,请将DCO频率设低或者更换为更高频率的参考时钟源!");         //不允许超过1023,请将DCO频率设低或者更换为更高频率的参考时钟源


  g_sClock.DCO_FLL_Frequency = DCO_FLL_Fre;


  UCS->FLLN = FLLN_VALUE;        //

  UCS->FLLD = 0;     //设置DCO分频  


  __bic_SR_register(SCG0);                  // 使能FLL

  do

  {

    UCS->DCO_FFG = RESET; // 清除,CLOCK_DCO 失效标志                                        

    SFRIFG1 &= ~OFIFG;                                             // 清除时钟失效标志

  }while (UCS->DCO_FFG == BIT_SET);                                           // 检查DCO失效标志

  //将使用DCO作为时钟源的时钟频率值修改

  if(UCS->SELM == CLOCK_DCO || UCS->SELM == CLOCK_DCO_DIV)

  {

    CLOCK_DIVx div = (CLOCK_DIVx)UCS->DIVM;

    CLOCK_MCLK_Config ((CLOCK_Source)UCS->SELM, div);

  }


  if(UCS->SELS == CLOCK_DCO || UCS->SELS == CLOCK_DCO_DIV)

  {

    CLOCK_DIVx div = (CLOCK_DIVx)UCS->DIVS;

    CLOCK_SMCLK_Config((CLOCK_Source)UCS->SELS, div);

推荐阅读

史海拾趣

FCT Electronics公司的发展小趣事

随着电子产品的日益复杂化,FCT Electronics意识到技术创新是保持竞争力的关键。公司投入大量资源进行研发,成功开发出一系列高性能的测试设备。其中,一款多功能集成电路测试系统因其高效、稳定、可靠的特点,被众多电子制造商所采纳,为FCT Electronics赢得了极高的声誉。

Avel Lindberg公司的发展小趣事

近年来,智能制造成为电子行业的新趋势。FCT Electronics紧跟时代步伐,开始探索智能制造领域。公司引进了先进的自动化生产线和检测设备,提高了生产效率和产品质量。同时,FCT Electronics还积极开发智能测试系统,为客户提供更加便捷、高效的服务。这一转型不仅提升了公司的市场竞争力,也为未来的发展打开了新的空间。

上述五个故事,仅基于公开信息和电子行业的一般发展趋势构建,并非FCT Electronics公司的真实历史事件。如需了解FCT Electronics公司的真实发展情况,请查阅相关官方资料。

Hantronix公司的发展小趣事

随着全球对环保问题的日益关注,HANBIT Electronics积极响应,将绿色生产纳入公司发展战略。2020年,公司投资建立了绿色生产线,采用环保材料和清洁能源进行生产,实现了生产过程中的节能减排。同时,公司还推出了多款环保型电子产品,满足消费者对绿色、低碳生活的需求。这一举措不仅提升了公司的品牌形象,也为其在可持续发展的道路上赢得了更多机遇。

华瓷(Chinocera)公司的发展小趣事

人才是企业发展的根本动力。华瓷深知这一点,因此在人才战略和团队建设上投入了大量精力。公司注重员工的培训和发展,为员工提供广阔的发展空间和良好的职业前景。同时,华瓷还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队为公司的发展提供了有力的支持和保障。

3M公司的发展小趣事

人才是企业发展的根本动力。华瓷深知这一点,因此在人才战略和团队建设上投入了大量精力。公司注重员工的培训和发展,为员工提供广阔的发展空间和良好的职业前景。同时,华瓷还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队为公司的发展提供了有力的支持和保障。

Freeport Resources Enterprises Corp公司的发展小趣事

为了提升在电子材料领域的竞争力,Freeport Resources积极寻求国际合作,与多家国际知名电子材料生产商和研究机构建立了战略伙伴关系。通过技术引进和联合研发,公司成功掌握了先进的电子材料提纯和加工技术,大幅提高了产品的质量和性能。同时,国际合作也帮助Freeport Resources打开了国际市场,其产品远销全球多个国家和地区,进一步巩固了其在电子材料市场的地位。

问答坊 | AI 解惑

资料分享

这里有接触过导光柱产品的工程师吗? 导光柱是一种LED指示灯的解决方案,用于将LED光源0度或者90度导出,为产品整体结构设计提供便捷。 一般分为固定在操作面板上的和固定在PCB板上的两种。 我们公司是德国门拓上海分公司,专业生产销售L ...…

查看全部问答>

关于镜像文件中的数据段搬移问题

   各位,我最近在调一块CPU是ARM926EJ-S的板子,用ADS 1.2写了一个bootloader,生成镜像格式是ELF格式,在用仿真器调试的时候发现,我在程序中定义的全局变量在内存中分配了空间,但是变量的值却是空的(此变量我在程序中是赋了初值的) ...…

查看全部问答>

最新MSP430x2xxFamily User Guide

这是最新版的MSP430x2xxFamily User Guide.希望对大家有用 [ 本帖最后由 brbl01 于 2011-4-17 01:44 编辑 ]…

查看全部问答>

ARM内如果要跑andriod操作系统需要什么配置

         我是刚接触嵌入式的,因为毕业设计的需要,设计一个网关。我想知道,我想选一块ARM芯片,不是核心板也不是开发板,他要能支持LINUX或者ANDRIOD操作系统,我只知道需要有MMU,但是ARM9以上系列的都满足,那对存储 ...…

查看全部问答>

关于FPGA的购买

我是一名新手,准备买个FPGA开始学习,大家有没有好的推荐一下,在这里先谢谢了。…

查看全部问答>

关于UC3843芯片应用问题

哪位开关电源的大神可以帮我解达一下关于UC3843电源芯片应用的问题吗,具体图如图所示, 哪位专家能帮我解释以下几点问题吗? 1. 图中Q303,Q305,Q305有什么作用吗?其中最下面的光耦是单片机出来的PWM控制信号。 2. D301是干什么用的?在UC384 ...…

查看全部问答>

形参和实参的区别

本帖最后由 tiankai001 于 2014-10-30 23:31 编辑 形参和实参的区别 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送 ...…

查看全部问答>

【从0教学嵌入式Linux】第三十二集

第32课:QT应用程序开发 (一)Linux系统下安装QT Creator集成开发环境1、打开Software Center2、搜索QT Creator(二)应用开发1、安装完成后,打开QT Creator2、新建项目工程3、编译,在PC上运行(三)将该例程放到开发板中运行1、设置环境变量在/ ...…

查看全部问答>