【MSP430】MSP430F5529火箭板 ---> 控制时钟系统输出频率实验(含时钟系统分析)

实验内容:上电控制MSP430F5529 Launch Pad上的主时钟系统达到25Mhz

实验准备:
1、硬件:MSP430F5529 Launch Pad
2、软件:Code Composer Studio集成开发工具(CCS)
3、提升MSP430F5529核心电压的办法及介绍请参考《MSP430F5529火箭板 ----> 关于核心电压提升实验(含电源管理模块和供电监控系统介绍)》文章链接link

一、时钟系统

1、MSP430F5529 Lanuch Pad晶振的物理层分析
  在进入时钟系统之前我们先对MSP430F5529的时钟晶振做一个介绍。
   MSP430F5529 Launch Pad 板载了1个32.768KhzRTC实时时钟XTAL1和1个4Mhz外部晶振XTAL2
  默认情况下,MSP430F5529的系统时钟为1Mhz
   XT2的4Mhz晶振与MCU连接引脚如下图所示:
在这里插入图片描述

2、MSP430F5529 Launch Pad时钟的介绍
  MSP430应用程序通常使用一个快时钟和一个慢时钟。在某些情况下,快时钟(称为MCLK)用于驱动CPU和外围设备,而慢时钟保持计时器和外围设备在低功耗模式下运行。这种方法降低了功耗:慢时钟消耗的电量更少,因此,禁用快时钟的次数越多,应用程序消耗的电量就越少。
  这种快速时钟通常是集成在单片机中的数字控制振荡器(DCO)。DCO本身是一个重要的低功耗工具,因为与晶振不同,它有非常快的启动时间,因此可以快速关闭和重新启用。DCO可以被中断激活,并且稳定得足够快来响应它。MCU的低功耗模式只有在经常使用的情况下才有用。
  许多MSP430设备,包括F5529,将DCO与频率锁定环(FLL)模块耦合,使DCO锁定在精确的慢频参考上。这可以很好地控制DCO频率。

MSP430F5529有三个可用的慢时钟:
1、REFO:内部低频修整基准源,是一种不需要晶振起振的高精度、低功率芯片上振荡器,典型值为32.768Khz,常被用作锁相环FLL的基准频率,其设置往往要参考LPM模式的设置。
2、LEFXT1:外部低频振荡源,经典值为32.768Khz,它和REFO一样可以作为锁相环FLL的基准频率,但是它比REFO精度更高、功率更低且更稳定。
3、VLO:(Internal very low)内部低耗低频振荡源,精确度低,范围在12Khz~20Khz之间

下表为F5529推荐的时钟配置:

系统时钟 时钟源频率描述
MCLKDCO、FLL8MhzMCLK是MSP430 CPU时钟。它在所有低功耗模式下被禁用。USB通信没有预定义的MCLK下限,但通常为8Mhz。
SMCLKDCO、FLL8MhzSMCLK驱动高速外设。它在LPM0期间保持活动,但在LPM3、LPM4和LPM5中禁用。LPM0是在USB连接期间允许的最低功率模式。
ACLKREFO32KhzACLK是一个低速时钟,驱动计时器和较慢的外围设备。在低功耗模式下,这是一种非常低功耗的方法来保持单片机的活力。它在LPM3期间保持活动,但在LPM4和LPM5中禁用。
USBCLKXT24MhzMSP430F5529上的USB操作需要在XT2上有一个±2500 ppm的时钟源。这个应用程序使用了一个精确的晶体谐振器。USB模块直接从XT2接收这个时钟。

UCS模块默认配置:
  在F5529上电完成PUC后,UCS模块默认配置为:
    1、XT1默认选择LF模式,作为XT1CLK的振源。ACLK默认振源为XT1CLK
    2、MCLK默认振源为DCOCLKDIV
    3、SMCLK默认振源为DCOCLKDIV
    4、当启用FLL锁相环时,默认选择XY1CLK作为FLLREFCLK参考时钟源
    5、在具有XIN和XOUT与通用I/O共享的设备上,XIN和XOUT pin被设置为通用I/Os,并且XT1一直处于禁用状态,直到为XT1操作配置了复用I/O端口。如果XIN和XOUT不与通用I/Os共享,则默认启用XT1。
    6、上电时,XT2IN和XT2OUT引脚被设置为通用I/O,而XT2处于禁用状态

对于MSP430F5529来说,上电后,默认情况下FLL选择XT1,如果晶振引脚(XIN, XOUT)与通用I/O共享,XT1将保持禁用状态,直到与晶振引脚关联的PxSEL位和XT1BYPASS位决定被设置,如果XIN和XOUT不与通用I/O共享,则XT1启用。当XT1CLK使用32.768Khz晶体时,故障控制逻辑立即导致ACLK由REFOCLK提供,因为XT1不是立即稳定的。当晶体启动得到并稳定后,FLL稳定在MCLK和SMCLK到1.048576 MHz,fDCO = 2.097152 MHz

UCS模块故障安全操作:
  UCS模块包含振荡故障故障安全功能,该特性检测XT1、DCO和XT2的振荡器故障,存在的故障类型为:
  1、低频模式下XT1低频振荡器故障(XT1LFOFFG)
  2、高频模式下XT1高频振荡器故障(XT1HFOFFG)
  3、XT2高频振荡器故障(XT2OFFG)
  4、DCO故障标志(DCOFFG)

  对应的晶体振荡器打开后不能正常工作时,设置晶体振荡器故障位XT1LFOFFG、XT1HFOFFG、XT2OFFG。在故障位被设置之后,即使故障条件不再存在,它们仍然保持设置直到在软件中重置。如果故障一直存在,而用户却清除了故障标志位,则故障标志位在清除后再次自动置位。所以,在编写程序时,一定要判断故障标志位是否置位,如果置位,将其软件清除。

3、MSP430F5529 Launch Pad时钟树
  有如下图:
在这里插入图片描述

二、源代码

  下面我们先看一个让F5529输出8Mhz主频时钟的源代码:

#include <msp430.h>

void SysClock_Init();				//申明系统时钟初始化函数
void SetVcoreUp(unsigned int level);		//申明核心电压调整函数

void main()
{
    WDTCTL = WDTPW + WDTHOLD;
    SetVcoreUp(0x01);   //核心电压等级必须逐级提升,不能直接跳跃提升
    SetVcoreUp(0x02);
    SetVcoreUp(0x03);
    SysClock_Init();

    while(1);
}

void SetVcoreUp(unsigned int level)
{
    //Open PMM register for write
    PMMCTL0_H = PMMPW_H;        //PMMCTL0_H是电源管理寄存器PMMCTL0的高8位,PMMPW_H解锁PMM所有的寄存器
    
    //Set SVS/SVM high side new level
     SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // SVLE --> 此位控制SVSL使能      SVMHE  --> 此位控制SVMHE使能
                                                                      //SVSHRVL --> SVSH 复位电平电压
    //Set SVM low side to new level
     SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *level;  
   
    //Wait till SVM is settle
     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;

   //Lock PMM registers for write access
   PMMCTL0_H = 0x00;           //锁存所有寄存器
}

void SysClock_Init()
{
    UCSCTL3 = SELREF_2;         //设置DCO锁相环的时钟源为REFOCLK
    UCSCTL4 |= SELA_2;          //Set ACLK = REFO
    __bis_SR_register(SCG0);    //失能锁相环时钟,系统时钟切换到备用时钟,此时可以对时钟进行设置
    UCSCTL0 = 0X0000;           //将DCOx,MODx设置成最低
    UCSCTL1 = DCORSEL_4;        //设置DCO的频率范围   2~20Mhz
    UCSCTL2 = FLLD_0 + 762;     //FLLD_0  --->  32768Hz为基准时钟的分频  ,FFLN  ---> 是后面的数字
    				//(N+1) * FLLRef = Fdco
                                //(243+1) * (32768/1) = 8Mhz
    __bic_SR_register(SCG0);    //使能锁相环时钟
    //最坏的情况下,DCO恢复的解决时间是(32 * 32 * n)/f_MCLK  =  Num MCLK cycles for DCO to settle
    // (32 *32 * 8Mhz)/32768Hz = 250K       ---->  n为我们要设置的频率
    __delay_cycles(250000);

    //进入循环直到XT1、XT2、DCO稳定为止,本例中只需循环到DCO稳定下来即可
    do
    {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
        //清除XT2、XT1、DCO 默认标志
        SFRIFG1 &= ~OFIFG;      //清除默认标志,SFRIFG1 --> 中断标志寄存器
        //OFIFG --> 振荡器故障中断标志   0:没有中断发生  1:有中断即将发生
    }while(SFRIFG1 & OFIFG);    //测试振荡器故障中断是否发生,如果发生就卡在此处循环
}
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值