美文网首页EmbLinux
MSP430学习笔记(2)

MSP430学习笔记(2)

作者: 别着急我来了 | 来源:发表于2015-11-07 22:05 被阅读633次

    摘要:本文是对学习MSP430的准备工作的记录与总结,涉及到MSP-EXP430F5529开发板和MSP430F5529LaunchPad的外部参数与特点分析、TI公司的IDE Code Composer Studio的使用、MSP430F5529的初步上手以及与ARM系列单片机(主要是Freescales公司的MK60系列)的比较。


    MSP430

    本文以「 配置时钟 与 TimerA输出PWM 」 为主线。

    MSP430是TI公司出品的一款主打ULP(Ultra Low Power)单片机,由于可以芯片可以工作在极低的功耗下,所以非常适用于一些对便携性设备上。MSP是指Mixed Signal Process(混合信号处理),因为常见的MCU对大量浮点数运算能力较差,所以MSP430自带的硬件乘法器(MPY)可以对大量的数字信号进行快速运算(比如FFT等),较之其他RISC单片机或CISC单片机来说,会非常的有优势。总结起来就是,MSP是一款16位RISC架构的超低功耗单片机,并且片上外设较为丰富,适用于对便携性和续航性有要求的开发者。

    MSP430经过数次迭代已经到第六代了,但之前几代我没有上手过,所以下文全部讲的是第五代产品MSP430F5529,有些功能或许之前的单片机没有,所以建议请尽量更新到比较新的版本MSP430:)。不过坊间传言新的MSP432要出了,那算是后话了……

    一 时钟配置

    .
    在各种论坛上和各种MSP430开发手册与书籍上肯定要讲如何配置MSP430的时钟,当然我认为要使用一款单片机的首要工作之一也是要了解他的时钟系统,因为作为CPU的节拍器,起码要知道你的单片机工作在什么样的节奏上,也就是当前的工作频率,这对软件的设计、外设的配置都是非常重要而且必不可少的。好了,下面开始干货,也就是我在配置F5529的时钟的配置程序编写、遇到的一些问题和我给出的解决方案。

    1.1 MSP430F5529的时钟

    1.1.1 前言

    MSP430单片机之所以能够工作在极低的功耗下,是因为我们可以人工选择启停时钟,不过如果像51单片机那样只有一个时钟的话,关掉时钟意味着单片机的停摆,虽然功耗足够低,但是也无法正常使用了。所以MSP430的系统时钟分为了3个,分别为MCLK、SMCLK和ACLK,可以根据需要关掉一个几个甚至全部,这样的话,功耗自然而然的就降下来了。
    贴一张图来简单的说一下这三个时钟的功能与区别吧:

    时钟简介-1 一个有趣的比喻: 时钟简介-2
    1.1.2 时钟的选择

    在F5529中,被称作UCS(Unified Clock System),更详细的介绍建议去官方网站下载User's Guide或者曾经提到过的RM仔细阅读,虽然是英文的,不过我相信你在阅读的时候肯定会收获很多东西,对430的了解会更加透彻。

    UCS介绍
    在这张图中我们可以看到UCS有5种时钟来源,分别是XT1、XT2、VLO、REFO、DCO。我的理解是XT1、REFO、VLO是在低功耗的时候使用比较多,要求用稳定的高频的时候,最好用稳定的外接晶振XT2,而不是调制出来的,在后面的实验结果中我们也会发现这个问题。
    通过这几个时钟来源,那么MCLK、SMCLK和ACLK就可以根据需要来选择不同的时钟来源,做到知己知彼随心所欲了。
    1.1.3 时钟的配置
    时钟的配置-1

    在这张图里我们可以看到可以用什么寄存器来选择和配置时钟,以及相应的关系也可以一眼明了。
    在这里介绍几个关键的寄存器与概念:

    1.1.3.1 Key Registers

    UCSCTLn(n = 0~9):这10个寄存器关系到时钟的选择,与时钟的输出,不过其中有几个寄存器是高频使用的,建议拿个小本本记下来。
    UCSCTL2 、UCSCTL3、UCSCTL4我个人认为这几个较重要。
    SFRIFG1:这个寄存器里有一个位是比较重要的,在图中可见

    时钟的配置-2 ,这个寄存器重要在有时候你会发现你配置好时钟后却无法按照你预想的工作,并且当你查看寄存器时,你发现这个位置位时,或许说明在哪个地方出现了问题了。与之对应的是下面寄存器中的三个位 时钟的配置-3 这三个位任何一位置位,都会导致OFIFG的置位,当你要排查问题时,这不妨是一个好的方法。
    1.1.3.2 Key Concept

    FLL:即Frequency Lock Loop锁频环。之前曾经在有篇文章里曾经提到过,锁频环是一种非常巧妙的电路,它的核心是数控振荡器和一个频率积分器,数控振荡器可以产生DCO时钟,通过FLL,可以使较低的晶振不断倍频,得到较高的主频(这个问题原来也困扰了我很久,就是关于CPU的主频为什么可以越做越高,但是外部晶振频率在10MHz似乎就是一个较高频率的问题,可以通过OC,即增高倍频或者是外频来解决)。
    PUC:即Power-Up Clear上电清除信号。在PUC信号后,MCLK和SMCLK的默认时钟源并不是DCOCLK,而是DCOCLKDIV!频率是DCOCLK的二分之一!在手册上也有写!

    时钟的配置-3 即复位后:

    (1)XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。
    (2)MCLK选通为DCOCLKDIV
    (3)SMCLK选通为DCOCLKDIV
    (4)FLL使能,且将XT1CLK作为FLL参考时钟。
    (5)XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。
    (6)如果可用的话,XT2IN和XT2OUT被设置为通用IO且保持禁止状态。

    POR:即Power-On Reset开机复位。

    时钟的配置-4

    1.2 实战

    1.2.1 程序的编写

    我使用的是MSP430F5529LP,板上自带低频XT1晶振32768Hz和高频XT2晶振4MHz,请读者注意。

    1.2.1.1 配置XT1:
    P5SEL |= BIT4|BIT5; //将IO配置为XT1功能 
    UCSCTL6 |= XCAP_3;  //配置电容为12pF 电容的选择请查阅手册
    UCSCTL6 &= ~XT1OFF; //使能XT1
    
    1.2.1.2 配置XT2:
    P5SEL |= BIT2 + BIT3; //XT2配置  //配置XT2 4MHz
    UCSCTL6 &= ~(XT2OFF);//使能XT2
    
    1.2.1.3 FLL时钟源的配置:
    __bis_SR_register(SCG0); //SCG0置位 关闭FLL
    UCSCTL3 |= SELREF_2 + FLLREFDIV_0; //配置为REFO 32768Hz FLL参考时钟不分频
    UCSCTL2 |= FLLD_0 ;//FLLD 分频系数
    UCSCTL2 |= 245; //FLLN 倍频系数
    __bic_SR_register(SCG0); //SCG1置位 打开FLL
    
    时钟的配置-5 说明:
    ·D为DCOCLK分频为DCOCLKDIV的分频数,由FFLD确定,可取1,2,4,8,16,32,默认值为2。
    
    ·N由FLLN确定,值取1-1023,最小值为1,如果写0会被置位1,默认值为31。
    
    ·n为FLLREFCLK的分频值,由FLLREFDIV确定,可取1,2,4,8,12,16.默认值为1。
    
    ·fFLLREFCLK默认由REFOCLK提供,除非打开了XT1,但值都为32768Hz。
    
    1.2.1.4 DCO的配置:
    UCSCTL1 = DCORSEL_4;//DCORSEL的值请看下图,但我觉得选择比较多,也请看实验结果。
    
    时钟的配置-6 关于DCORSEL的值,请根据FLL要到的频率,来选择相应的值,这里很重要
    1.2.2 融合

    当明白了上面每一段程序的含义,那么相信马上就能根据需要来配置出需要的时钟频率了。
    那么核心的程序段就是:

    UCSCTL4 = SELS_3 +SELM_3;//这里SMCLK和MCLK用的都是DCOCLK
    

    不过在启动之前,还是建议加入如下程序段,也已注释用途。

      __delay_cycles(250000); //稳定时钟 刚上电时钟并不稳定
      while (SFRIFG1 & OFIFG)
    {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位
        SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位
      }
    

    还有一点比较重要,POR之后,OFIFG是被置位的。
    要测试也很简单,在程序中加入程序段:

    P2SEL |= BIT2;
    P2DIR |= BIT2;//测量SMCLK用
    P7SEL |= BIT7;
    P7DIR |= BIT7;//测量MCLK用
    

    然后用示波器观察对应引脚的波形即可!

    1.2.3 关于DCO的一些问题

    在1.2.1.3里提到了关于DCO的配置,也提到了里面一些相关系数的问题,不过在设置时还是会出现问题,比如,与预设值出现了偏差,比如好像不是正常工作,或者这样那样的问题,我在这根据我遇到的情况给出我的一些看法,并结合在网上查到的资料综合说一下,可能很多地方也不是那么对,请多多谅解。

    1.2.3.1 DCO配置后工作不正常

    如果出现这样的情况,请看一下在配置DCO时是否禁止了FLL功能,否则会出现一些莫名奇妙的问题。

    1.2.3.2 无法通过DCO精确输出

    DCO或者说FLL本来就是通过调制或者说是计算来倍频的,我个人认为肯定不如有源/无源晶振那样准确,所以有些误差是正常的,在对于频率不是那么敏感的地方,8.014MHz与7.965MHz每个周期只差不到1us,我觉得还是可以接受的。

    1.2.3.3 FLL调试后频率出现阶梯状输出

    我一开始好像也发现了这个问题,并且在EE论坛上提问了这个问题。不过很奇怪的是,今天在调试时似乎这个问题不是那么严重了,那我就来通过实验来观察一下吧。在下面的实验中使用的都是FLL+REFO(32768Hz)+ DCORSEL_4 ,更改了FLLN来观察SMCLK的输出波形。


    FLLN=100 FLLN=110 FLLN=120 FLLN=130 FLLN=160 FLLN=180 FLLN=200

    通过示波器来看,还是可以精确调节的,比如我们拿FLLN=180与FLLN=200来比较,FLLN=180时,通过公式计算f=181*32768Hz=5931008Hz=5.93MHz,实验结果为5.92MHz,FLLN=200时,计算f=6586368Hz=6.59Mhz,试验结果为6.62MHz,当然了,这个结果在测试的时候是在小范围内不断变化的,使用XT1外接晶振可能会稍微稳定一些,但这并不会影响结果。我们可以得出这样一个结论,我们可以通过DCO来获得一个预期的时钟频率,并且配置在我们的MSP430三个时钟上。

    1.2.3.4 关于DCORSEL的选择。

    个人觉得这个选择正确还是比较重要的,因为在测试时发现,有时候明明其他的地方都配置的没问题,但是得不出想要的结果,很有可能问题就出在这里,还是通过实验来发现问题吧。


    DCORSEL=5 FLLD=100
    DCORSEL=5 FLLD=200

    在FLLD=100时频率明显不是预期的频率,DCORSEL改为4时,结果正确。

    DCORSEL = 0的调节范围约为0.20~0.70MHZ;
    DCORSEL= 1的调节范围约为0.36~1.47MHZ;
    DCORSEL = 2的调节范围约为0.75~3.17MHZ;
    DCORSEL = 3的调节范围约为1.51~6.07MHZ;
    DCORSEL = 4的调节范围约为3.2~12.3MHZ;
    DCORSEL = 5的调节范围约为6.0~23.7MHZ;
    DCORSEL = 6的调节范围约为10.7~39.7MHZ;
    DCORSEL = 7的调节范围约为19.6~60MHZ。
    
    if (fsystem <= 630)            //           fsystem < 0.63MHz
      UCSCTL1 = DCORSEL_0;
    else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz
      UCSCTL1 = DCORSEL_1;
    else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz
      UCSCTL1 = DCORSEL_2;
    else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz
      UCSCTL1 = DCORSEL_3;
    else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz
      UCSCTL1 = DCORSEL_4;
    else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz
      UCSCTL1 = DCORSEL_5;
    else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz
      UCSCTL1 = DCORSEL_6;
    else
      UCSCTL1 = DCORSEL_7;
    

    以上是TI工程师在例程中所给的,相信他们也经过大量的实验才得出结果。

    好了,这次就写到这,有些多,编辑器都有点受不了了。后面还会更新完一些这次的测试结果和Debug过程,敬请期待!

    非常感谢您的阅读,若有疑问或错误,请留言指出,感激不尽!

    参考书籍与参考帖子:
    《MSP430x5xx and MSP430x5xx Family User's Guide》
    《MSP430单片机原理与应用 -MSP430F5xx/6xx系列单片机入门提高与开发》(任保宏 徐科军 编著)
    《LaunchPad口袋实验平台 MSP-EXP430G2篇》(傅强 杨艳 编著)
    http://bbs.eeworld.com.cn/thread-458079-1-1.html
    http://www.aiuxian.com/article/p-1863585.html
    http://blog.csdn.net/girlkoo/article/details/9047191

    相关文章

      网友评论

        本文标题:MSP430学习笔记(2)

        本文链接:https://www.haomeiwen.com/subject/bnfqhttx.html