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

2020-01-15来源: 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呢?呵呵,因为它说错了,SMCLK并没有使用DCOCLK,它还是默认地使用

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

上一篇:如何使用Keil5开发MSP430及Tiva系列开发板
下一篇:最后一页

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

推荐阅读

msp430f149的低功耗模式
430的低功耗确实很强啊,虽然和VR单片机比起来速度慢了好多。在CPU进行工作时,如果没有什么事情干,就得进入低功耗模式啦,LMPX(0~4)这几种模式的具体事项就是如下的,得记住了。一,运行模式MSP430具有一种活动模式和五种软件可选的低功耗运行模式。一个中断事件可以将芯片从五种低功耗模式中的任何一种唤醒,为请求服务并在从中断程序返回时恢复低功耗模式。下面6种运算模式由软件配置。● 活动模式AM:-所有时钟活动● 低功耗模式0(LPM0)-CPU关闭ACLK和SMCLK保持活动,MCLK关闭● 低功耗模式1(LPM1)-CPU关闭ACLK和SMCLK保持活动,MCLK关闭如果DCO在活动模式中没有使用,DCO的直流发生器将关闭
发表于 2020-01-09
MSP430F149单片机能输出多少路PWM波?
在使用430的PWM波的时候,我一直有一个困惑,那就是它到底能输出几路PWM波?我想别的朋友可能也有相同的困惑,在我查找了好多资料之后最终搞懂了,下面分享一下学习经验。首先,MSP430F149有两个16位的定时器Timer_A和Timer_B,其中TA有3个捕获比较单元,TB有7个捕获比较单元,产生PWM波需要将定时器配置在比较模式下,刚开始我以为既然TA有三个捕获比较模块,那么就应该有三个PWM波,结果怎么配置都无法产生TA1,后来在我仔细查看User's Guide才弄懂了,下面先上图:上图说道:每个捕获、比较模块的输出可以产生PWM信号,每个输出根据EQU0和EQUX可以配置为8种模式。我们知道每个捕获比较模块对应
发表于 2020-01-08
MSP430F149单片机能输出多少路PWM波?
MSP430F5438A单片机低功耗设置
MSP430F5438A单片机低功耗设置,以进入LPM3为例:1、MSP430F5438A外部时钟分别为8M和32.768,程序正常运行时选择8M主时钟,当程序需要进入低功耗时,需要将主时钟切换为32.768,代码如下(自己试着改的。。)void InitClock(){  WDTCTL = WDTPW + WDTHOLD;   // Stop WDT  //P11DIR |= 0x07;        // ACLK, MCLK, SMCLK set out to pins   //P11SEL |= 0x07; 
发表于 2020-01-07
MSP430F149的ADC12模块
1 概述MSP430F149的ADC12为SAR型12位AD,共有16路输入通道,其中8路独立的外部输入通道,2路接外部Vref+,Vref-,3路内部通道可分别测内部温度传感器、AVCC、和外部参考源。P6口第二功能为AD输入端。MSP430F149的10、11分别接外部电压参考源正负极,7脚可将内部电压参考源输出。ADC12共有18个中断源,公用一个中断向量ADC12_VECTOR。AD的参考源可选择内部电压参考源或外部电压参考源。内部电压参考源有1.5V,2.5V可选,使用时向ADC12CTL0写入REFON+ REF2_5V就打开了2.5V。外部电压参考源由REF+接入。上电时若不设置参考源,则参考源为系统供电电压3.3V
发表于 2020-01-06
MSP430F5438 ADC12学习笔记
1.前言这几天实践了MSP430的ADC12功能,虽然片内AD功能比较简单但是还学出了点“门道”来,这个“门道”便是MSP430F5438A和MSP430F5438的区别。这里通过一个例子说明片内ADC的使用,首先实现UART和定时器1S溢出的功能,在上述功能的基础上每1S打印一次AD转换结果,转换通道定向到通道11,该通道对应AVCC和AVSS插值的一半,由于AVCC和LDO的输出之间只有一个电感连接,可以理解转换的结果为LDO输出电压的一般,若扩大两倍便是LDO的实际输出结果,在本文所用的开发板LDO输出为3.3V,所有打印的结果越接近3.3V越好。2.代码实现和输出结果代码实现// 时钟默认情况// FLL时钟 
发表于 2020-01-06
MSP430F5438 ADC12学习笔记
MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
参考电压稳定  __bis_SR_register(LPM4_bits); // 进入LPM4}4.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用提醒电阻电路产生#include /* *比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用提醒电阻电路产生 *Vcc*3/4和Vcc/4的参考电压,通过CBOUT输出进行控制引至比较器-输入端,最终当CB0输入模拟信号电压高于Vcc*3/4时,CBOUT输出高电平,当CB0输入模拟信号低于Vcc/4时,CBOUT输出低电平 *该程序在MSP430F5336当中跑
发表于 2019-11-06
小广播
何立民专栏 单片机及嵌入式宝典

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

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