浅谈msp430f5529入门(2)——时钟配置、例程分析

2019-10-18来源: eefocus关键字:msp430f5529  时钟配置  例程分析

前天写了关于DCO,FLL的一些问题,而其他的如XT1,XT2和1xx系列几乎没有区别,而且相比比较简单,就不另外讨论了。现在总结一下55系列的时钟配置,我以TI官网提供的例程为例子进行分析,只要肯折腾,收获是不会少的。而且我发现了例程里的注释有错误,可能会给大家带来学习时的困扰,我在下文会指出。


有人可能会问TI的例程怎么找,我在这里也说一下。在TI官网搜索需要的芯片,在结果的右边会有该芯片的资料,点进去后找到“工具和软件”,点它之后再软件的培训内容里可以找到例程下载,就是名字里有examples的zip。


呵呵,可能已经有人这么尝试过了,但F5529的这里并没有例程。不过这并不表明TI没有提供5529的例程。另辟蹊径吧骚年,我估摸着一个系列的例程都是通用的,于是就再搜了一遍5526,结果就在那里找到了55xx的例程,也就是我下面要分析的例程。


例程下载链接


-----------------------------------可以开宰了------------------------------------


包里有关时钟配置的例程一共有9个,其实弄好前面几个,后面只是大同小异而已。


(1)首先,第一个,最简单的一个,因为它根本就没有配置时钟......不过,它还是很有用,因为它给我们呈现了单片机上电后的时钟状况。


//   ACLK = REFO = 32.768kHz, MCLK = SMCLK = Default 1MHz

#include

 

int main(void)

{

  volatile unsigned int i;

 

  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

  P1DIR |= BIT1;                            // P1.1 output

 

  P1DIR |= BIT0;                            // ACLK set out to pins

  P1SEL |= BIT0;                            

  P2DIR |= BIT2;                            // SMCLK set out to pins

  P2SEL |= BIT2;                            

  P7DIR |= BIT7;                            // MCLK set out to pins

  P7SEL |= BIT7;                              

 

  while(1)

  {

    P1OUT ^= BIT1;

    __delay_cycles(60000);                  // Delay

  }

}

        博主我刚开始学时就很纠结这PUC后的默认时钟状况:


After a PUC, the UCS module default configuration is:

• XT1 in LF mode is selected as the oscillator source for XT1CLK. XT1CLK is selected for ACLK.

• DCOCLKDIV is selected for MCLK.

• DCOCLKDIV is selected for SMCLK.

• FLL operation is enabled and XT1CLK is selected as the FLL reference clock, FLLREFCLK.

• On devices that have XIN and XOUT shared with general-purpose I/O, XIN and XOUT pins are set to

general-purpose I/Os and XT1 remains disabled until the I/O ports are configured for XT1 operation. If

XIN and XOUT are not shared with general-purpose I/O, XT1 is enabled.

• When available, XT2IN and XT2OUT pins are set to general-purpose I/Os and XT2 is disabled.


刚上电后,说是ACLK和FLL默认以XT1为源,但你又不打开XT1,那问题纠结了我很久,用示波器测试测得ACLK是大约327668Hz,但使用手册后面有说这两个时钟在XT1LF失效后会转向REFOCLK,它是内部的32768Hz的时钟(那时我还没看- -||)。


真相就是这么一回事:

这是我用CCS仿真调试时暂停截的图,图示程序已经执行到while(1)里了,打开寄存器窗口看到XT1LFOFFG和DCOFFG置1了。前者被置位就是因为ACLK和FLL处于默认状态一直在向XT1取源,而XT1被禁止失效所以XT1LFOFFG被置位了,而程序还能跑就是因为XT1LF失效时它们两个时钟暂时向REFOCLK取源。后者为什么也置1了呢?它没有向XT1取源啊。呵呵,上一章说过,默认状态的DCO由FLL稳定,而FLL的时钟源XT1出问题所以DCOFFG就置1了。


因此,即使大家不需要调整单片机的时钟,在程序的开头也请先配置一下时钟,养成这个习惯,至少把XT1打开,因为XT1比REFOCLK稳定多了。


(2)第二个例程,很值得去折腾,它设置了FLL来稳定DCO到8MHz。噢不!是16MHz.


//   ACLK = REFO = 32kHz, MCLK = SMCLK = 8MHz

#include

 

int main(void)

{

  volatile unsigned int i;

 

  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

  P1DIR |= BIT1;                            // P1.1 output

 

  P1DIR |= BIT0;                            // ACLK set out to pins

  P1SEL |= BIT0;                            

  P2DIR |= BIT2;                            // SMCLK set out to pins

  P2SEL |= BIT2;                            

  P7DIR |= BIT7;                            // MCLK set out to pins

  P7SEL |= BIT7;           

 

  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO

  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx

 

  // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize

  do

  {

    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);

                                            // Clear XT2,XT1,DCO fault flags

    SFRIFG1 &= ~OFIFG;                      // Clear fault flags

  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  __bis_SR_register(SCG0);                  // Disable the FLL control loop

  UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation

  UCSCTL2 |= 249;                           // Set DCO Multiplier for 8MHz

                                            // (N + 1) * FLLRef = Fdco

                                            // (249 + 1) * 32768 = 8MHz

  __bic_SR_register(SCG0);                  // Enable the FLL control loop

 

  // Worst-case settling time for the DCO when the DCO range bits have been

  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx

  // UG for optimization.

  // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle

  __delay_cycles(250000);

  while(1)

  {

    P1OUT ^= BIT0;                          // Toggle P1.0

    __delay_cycles(600000);                 // Delay

  }

}


18和19行,将这两个时钟的时钟源取为了REFO,这样,就没有任何时钟在向XT1请求时钟源,DCO也没有问题,故而下面的do{}while语句能通过。这个语句就是检测时钟有没有问题,如果晶体正在起振,还没有达到工作状态,会在这个循环里等待晶体起振完毕。XT2OFFG,XT1LFOFFG,DCOFFG,OFIFG都必须由软件清零。另外,POR后,OFIFG是被置位了的。


比如我把UCSCTL4 |= SELA_2;注释掉,这样,ACLK也会向REFO申请时钟源,但程序运行下来就并不一样了。


它会卡在这个循环里出不去,和上面(1)的情况一样,ACLK的寄存器里的默认值还是在向XT1申请时钟源,XT1不干活,XT1LFOFFG就置位了。


20行那里其实可以不配置,因为默认就已经是0x0000,而FLL会自动调整UCSCTL0。


这个程序的精髓就在于30-35这4行(啊咧?4行?),这是配置FLL的标准流程,在调整有关FLL的寄存器前,无比要先禁止FLL,不然可能会产生不可预料的结果。


上一章说到,用FLL稳定DCO,只要设置好FLL的时钟,再就是配置DCORSEL和FLLN就好了。利用公式:


      ·fDCOCLK= D × (N + 1) × (fFLLREFCLK÷ n)

        ·fDCOCLKDIV= (N + 1) × (fFLLREFCLK÷ n)

就可以计算出所需的值,纳尼?这和注释里的不一样?呵呵,是的,真的是注释错了。程序里(249 + 1) * 32768 = 8MHz计算的是fDCOCLKDIV!而不是注释里写的fDCOCLK!而注释里的那条看起来像公式的根本就不是个东西!


那为什么我测出来的真的是它说的大约8MHz呢?呵呵,因

[1] [2]
关键字:msp430f5529  时钟配置  例程分析 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477594.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430杂谈--时钟资源UCS的配置
下一篇:MSP430单片机各种寄存器总结(2)——UCS

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
比较器B是什么,顾名思义,它其实就是用来比较模拟电压+输入端和-输入端的电压大小,然后设置输出信号CBOUT的值的,如果 + 端电压高于 - 端电压,则CBOUT置高,否则置低。主要的控制寄存器有CBCTL0,CBCTL1,CBCTL2,CBCTL3,CBINT,CBIV,在MSP430G2553中没有比较器B,但是F5336中有,所以接下来的代码全都是F5336的比较器B使用程序:1.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用共享电压源产生2.0V参考电压。最后当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平,当CB0输入模拟信号电压低于2.0V时,输出低电平
发表于 2019-11-06
MSP430F5529 时钟 25MHz 设置方法
MSP430F5529的launchpad是 TI送的比较多的一款开发套件,至少我们实验室就是人手一块,很多人都嫌他慢,确实相比较于STM32F103(72MHz) 和STM32F407(168MHz)的速度而言  默认状态下主频只有1MHz的 MSP430F5529就是个弟弟,而且处理位宽也是只有16位,,, 还不支持位带操作  ,但是就超低功耗这一点就足以让他在单片机界立足 ,废话少说,来正题。这次跟大家分享的是标题所说的  MSP430F5529的升频方案。要升频,首先我们得能‘看见’系统的频率,TI的工程师们充分考虑到了这个问题,他们有得引脚可以直接输出时钟信号!!!在芯片datesheet中
发表于 2019-10-29
MSP430F5529 时钟 25MHz 设置方法
win10下使用Energia开发MSP430F5529LP 基本流程及遇到的问题
energia.nu上下载energia安装驱动,部分电脑可能要禁用数字签名,常规操作不多说,官网上也有禁用数字签名的方法。都装好后打开energia,页面几乎和arduino一样,就是红得晃眼睛。什么东西都不写,先编译一下,就报错 大概意思是一个文件中的浮点数常量超出double范围 从来没见过这种错误,检查了一下自己安装的64位也没啥问题,到处找方法,论坛贴吧资料都很少,最后看到energia.exe附近有个arduino-builder.exe点击运行一下,再回去编译,就ok了,blink烧写进去也完全正常。后来发现还是有点问题,直接把报错的那个文件删除就好,不会有任何问题,亲测。当然最好留个备份,后面有关于这个函数的问题了再
发表于 2019-10-28
win10下使用Energia开发MSP430F5529LP 基本流程及遇到的问题
MSP430F149学习笔记——时钟
由于近期的需要,开始学习TI的MSP430 MCU。脑子不好使记不下来,只能辛苦一一敲在这里,便于大脑短路时随时查阅。首先学习了F149的时钟系统。F149拥有一个名为DCOCLK的内部数控振荡器,可外接两个晶振,通常一个晶振提供32768Hz实时时钟(LFXT1CLK),另一个晶振提供最大8MHz的系统主时钟(XT2CLK)。以上3个时钟源可以产生三个时钟信号:ACLK:辅助时钟。可由LFXT1CLK经1/2/4/8分频得到,可软件配置作为各种外设提供时钟信号。MCLK:主时钟。可由DCOCLK/LFXT1CLK/XT2CLK经1/2/4/8分频得到,作为CPU和系统时钟。SMCLK:副时钟。可由DCOCLK/LFXT1CLK
发表于 2019-10-25
基于MSP430F5529的μc/os嵌入式实时操作系统移植
()    //OS启动时调用,加载用户最高优先级的任务 OSCtxSw()       //任务级调度 OSIntCtxSw()      //中断级调度 OSTickISR()       //时钟中断响应,将检测到延时结束的任务加入就绪队列,    .cdecls C, LIST, "msp430.h";用户钩子,对应os_cpu_c.c中的HOOK函数    .ref     OSIntExit    .ref     OSIntNesting 
发表于 2019-10-25
MSP430F149;一、基本时钟
//  ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2//  //* XTAL's REQUIRED - NOT INSTALLED ON FET *////  //* Min Vcc required varies with MCLK frequency - refer to datasheet *// ////                MSP430F149//           
发表于 2019-10-25
MSP430F149;一、基本时钟
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved