MSP430学习笔记(2)

摘要:本文是对学习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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容