MSP430(F5529)学习笔记——UCS配置详解

2019-10-10来源: eefocus关键字:MSP430(F5529)  UCS  配置

MSP430(F5529)相比MSP430(F149)来讲,功能更加强大。


UCS简介

MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源,依次是:XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册,其中XT1CLK、VLOCLK、REFOCLK和XT2CLK跟MSP430F1XX系列没有太大区别,学习配置起来也比较简单。


UCS上电默认状态


PUC后,UCS模块的默认状态如下:


(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且保持禁止状态。


清楚UCS上电默认状态是非常重要的,这对于理解后面的配置逻辑来说非常重要。


UCS时钟源切换


由于REFOCLK、VLOCLK、DCOCLK(这里暂时这么认为)默认状态下是可用的,所以,切换的时候只需要通过UCSCTL4来配置ACLK、SMCLK和MCLK的时钟源即可,而XT1CLK和XT2CLK需要根据硬件的具体配置情况确定,所以,这两者的配置比起前三者来讲,就有些不同了。下面,我们做三个实验:


(1)将MCLK和SMCLK配置REFOCLK、VLOCLK

REFOCLK和VLOCLK是芯片默认提供的,只要芯片正常工作,这两个时钟就会正常工作,因此,该时钟配置非常简单,只需要修改UCSCTL4,将SELS和SELM配置为对应的选项VLOCLK或者REFOCLK即可,具体代码如下:

#include

 

 

void main(void) {

  WDTCTL = WDTPW+WDTHOLD;

  

  P1SEL |= BIT0;

  P1DIR |= BIT0;//测量ACLK用

  P2SEL |= BIT2;

  P2DIR |= BIT2;//测量SMCLK用

  P7SEL |= BIT7;

  P7DIR |= BIT7;//测量MCLK用

 

 

  //UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //将SMCLK和MCLK配置为VLOCLK

  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLK

 

 

  while(1);

}


上面的代码就实现了将SMCLK和MCLK切换为VLOCLK和REFOCLK,ACLK的操作也是同样的,不作过多解释。

(2)将MCLK和SMCLK配置XT1CLK

我手头上的开发板XT1外接的是32.768K的手表时钟晶振,XT1CLK的配置要分为以下几步:


1.配置IO口5.4和5.5为XT1功能。

2.配置XCAP为XCAP_3,即12PF的电容。

3.清除XT1OFF标志位。

4.等待XT1起振。


具体的代码如下:

#include

 

void main(void) {

  WDTCTL = WDTPW+WDTHOLD;

  

  P1SEL |= BIT0;

  P1DIR |= BIT0;//测量ACLK用

  P2SEL |= BIT2;

  P2DIR |= BIT2;//测量SMCLK用

  P7SEL |= BIT7;

  P7DIR |= BIT7;//测量MCLK用

 

  P5SEL |= BIT4|BIT5; //将IO配置为XT1功能

  UCSCTL6 |= XCAP_3;  //配置电容为12pF

  UCSCTL6 &= ~XT1OFF; //使能XT1

 

  while (SFRIFG1 & OFIFG){

    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位

                              // 这里需要清除三种标志位,因为任何一种

                              // 标志位都会将OFIFG置位

    SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位

  }

  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_0|SELM_0;     //将SMCLK和MCLK时钟源配置为XT1

  while(1);

}


(3)将SMCLK和MCLK配置XT2

将SMCLK和MCLK配置为XT2跟配置为XT1的过程基本相同,唯一不同的是,在配置SMCLK和MCLK为XT2之前,需要将ACLK和REFCLK的时钟源,因为ACLK和REFCLK的默认时钟源是XT1,而我们这里并没有配置启动XT1CLK,所以会产生XT1时钟错误,即XT1LFFG,因此,我们先将ACLK和REFCLK配置为芯片自带的时钟(REFOCLK或VLOCLK)或者即将启动的时钟(XT2),此外,XT2配置时不需要配置电容,故将SMCLK和MCLK配置为XT2的代码如下:

#include

 

void main(void) {

  WDTCTL = WDTPW+WDTHOLD;

  

  P1SEL |= BIT0;

  P1DIR |= BIT0;//测量ACLK用

  P2SEL |= BIT2;

  P2DIR |= BIT2;//测量SMCLK用

  P7SEL |= BIT7;

  P7DIR |= BIT7;//测量MCLK用

 

  P5SEL |= BIT2|BIT3; //将IO配置为XT2功能

  UCSCTL6 &= ~XT2OFF; //使能XT2

 

  UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK

  UCSCTL3 |= SELREF_2;                  //将REFCLK配置为REFCLK

 

  while (SFRIFG1 & OFIFG){

    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位

                              // 这里需要清除三种标志位,因为任何一种

                              // 标志位都会将OFIFG置位

    SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位

  }

  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;     //将SMCLK和MCLK时钟源配置为XT2

  while(1);

}

做完前面三个实验,我们就能掌握MSP430F5XX系列时钟切换的基本操作了,讲的并不详细,有其他疑问请仔细阅读芯片手册或者留言讨论。


DCO模块详解

DCO模块在MSP430F5XX系列芯片中非常重要,因为从MSP430F4XX开始,MSP430引用了FLL模块,FLL即锁相环,可以通过倍频的方式提高系统时钟频率,进而提高系统的运行速度。

DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。

DCO模块有两个输出时钟信号,级DCOCLK和DCOCLKDIV,其中,倍频计算公式如下:

DCOCLK = D*(N+1)*(REFCLK/n)

DCOCLKDIV = (N+1)*(REFCLK/n)


其中:

n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为0,也就是不分频;

D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;

N可以通过UCSCTL2中的FLLN来设定,默认值为32。

所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152,DCOCLKDIV的实际值为1048576。

另外,配置芯片工作频率还需要配置DCORSEL和DCOx,DCORSEL和DCOx的具体作用如下:

DCORSEL位于UCSCTL1控制寄存器中的4到6位,共3位,将DCO分为8个频率段。

DCOx位于UCSCTL0中的8到12位,共5位,将DCORSEL选择的频率段分为32个频率阶,每阶比前一阶高出约8%,该寄存器系统可以自动调整,通常配置为0。

DCORSEL和DCOx值的具体作用可以参考MSP430F5529的数据手册,阅读该手册相关部分可以找到如下表格:

可以见,DCORESL的频率调节范围大致如下:


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。


理解了上面这些,可以理解TI官方例子中的代码了,官方代码中的相关部分如下:

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的工程师根据上面这些参数选取的比较合理的值。

到这里,我相信大家配合芯片手册和本文,都能明白DCO配置相关部分的原理了,下面是将DCO参考时钟选为XT1,并将DCOCLK倍频到25M的详细代码:

#include

 

void delay(){

  volatile unsigned int i;

  for(i = 0; i != 5000; ++i){

    _NOP();

  }

}

 

void SetVcoreUp (unsigned int level)

{

  // Open PMM registers for write

  PMMCTL0_H = PMMPW_H;

  // Set SVS/SVM high side new level

  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;

  // Set SVM low side to new level

  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;

  // Wait till SVM is settled

  while ((PMMIFG & SVSMLDLYIFG) == 0);

  // Clear already set flags

  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);

  // Set VCore to new level

  PMMCTL0_L = PMMCOREV0 * level;

  // Wait till new level reached

  if ((PMMIFG & SVMLIFG))

    while ((PMMIFG & SVMLVLRIFG) == 0);

  // Set SVS/SVM low side to new level

  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;

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

上一篇:MSP430学习笔记2-ADC12
下一篇:MSP430F6638单片机复习笔记

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

推荐阅读

MSP430F6638单片机复习笔记
第一章 绪论1.1 单片机基础全称:单片微型计算机(Single Chip MicroComputer)它是把MPU、存储器、I/O口、定时器/计数器、中断系统、时钟电路、A/D-D/A等集成在一个芯片上构成的微型计算机系统。单片机又称:单片微控制器、嵌入式微控制器1.2 MSP430F663x片内资源MSP430F663x 系列配置有一个高性能12 位ADC、比较器、两个USCI、USB2.0、硬件乘法器、DMA、四个16 位定时器、带有报警功能的RTC、LCD 驱动器和多达74 个I/O 。1.3 进制转换【注意】小数的进制转换1.4 原码、反码、补码的书写【注意】一般是8位补码,有时也有16位补码1.5 位操作P
发表于 2019-10-10
MSP430F6638单片机复习笔记
基于MSP430F413水果电池供电的低功耗时钟
  我最早接触MSP430时候,看到书的第一页就是一张水果电池的图片,一直以来想做一个低功耗的可以水果电池供电的系统,毕业之后的下半年选择MSP430F413单片机来画了一个低功耗的板子,一直没有调试成功,液晶显示太暗几乎看不到,最近又拿出来调试,更换偏压电阻,最终更换液晶后才可以正常显示,先看下最终效果:最终效果 电路图:调试过程  最初调试时,先准备好苹果一个,电池正负极(铜锌),程序是显示一个数字,效果如下:  突发奇想,用自来水试了一下,效果也是杠杠的(程序中间修改过,这是显示较多的液晶段):  时钟调试效果(这里电池没有接入电路,调试时所用,当时没有拿下来,用跳线帽接到水果供电的电路上):  刚刚调试时
发表于 2019-10-10
基于MSP430F413水果电池供电的低功耗时钟
adc12单通道单次转换例程(msp460f5529)
#include "msp430f55529.h"int main( void ){  // Stop watchdog timer to prevent time out reset  WDTCTL = WDTPW + WDTHOLD;  ADC12CTL0 = ASC12SHT02 + ADC12ON;       ASC12CTL1 = ADC12SHP;  ADC12IE = 0x01;  ADC12CTL0 |= ADC12ENC;  P6SEL |= 0x01;  P1DIR |=BIT0
发表于 2019-10-09
MSP430F149串口收发程序详解
;默认的是7bit数据位,因此将CHAR位置1就是8位数据位。  UCTL0 |= CHAR; 4、选择波特率发生源,MSP430F149的波特率发生源有四种波特率的分频系数要求大于3,要选择合适的时钟源,可以遵循以下规则:当波特较低时(<9600),可以选择ACLK,辅助时钟一般情况下使用是32768Hz的Watch Oscilliater,当波特率较高时要使用SMCLK子系统时钟。在IAR的头文件中有如下定义:#define SSEL0  (0x10) /* Clock Source Select 0 */因此要选用ACLK,可以使用:UTCTL0 |= SSEL0;5、配置波特率,这个需要
发表于 2019-09-11
MSP430F149按键检测程序
该程序由IAR编译运行,使用单片机的P1.0~P1.3口作为四个独立按键。由外部中断的下降沿触发。/***********************************************程序描述:单片机的P1.0~P1.3连接四个独立按键,外部中断下触发*作者    :huasir*时间    :2017.10.28   22:10***********************************************/#include<msp430x14x.h>#define keyin (P1IN & 0X0F)uns
发表于 2019-09-06
UCSD:锂金属电池失效的主要原因在于非活性锂
(图源:UCSD官网)据外媒报道,加州大学圣地亚哥分校(UCSD)领导的研究小组发现,锂金属电池失效的根本原因在于:在电池放电过程中,少量的金属锂沉积物在从负极表面脱落并被困住,变成无法再使用的“死”或非活性锂。这一发现挑战传统观点,即锂金属电池失效是因为锂负极和电解质之间形成的固态电解质界面膜(SEI)。研究人员开发一种技术,测量负极上非活性锂的数量,并研究其微纳米结构,从而得出这一结论。这在电池研究领域尚属首次。这些发现或将为实现可充电锂金属电池商业化铺平道路。锂金属电池(由锂金属制成负极)是下一代电池技术的重要组成部分,其能量密度是目前锂离子电池(通常采用石墨负极)的两倍。因此,使用寿命更长,重量更轻,可能使电动汽车
发表于 2019-09-04
UCSD:锂金属电池失效的主要原因在于非活性锂
小广播
何立民专栏 单片机及嵌入式宝典

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

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