MSP430F5529火箭板-控制时钟系统输出频率实验(含时钟系统分析)
2021-01-11 来源:eefocus
实验内容:上电控制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.768Khz的RTC实时时钟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推荐的时钟配置:
系统时钟 | 时钟源 | 频率 | 描述 |
---|---|---|---|
MCLK | DCO、FLL | 8Mhz | MCLK是MSP430 CPU时钟。它在所有低功耗模式下被禁用。USB通信没有预定义的MCLK下限,但通常为8Mhz。 |
SMCLK | DCO、FLL | 8Mhz | SMCLK驱动高速外设。它在LPM0期间保持活动,但在LPM3、LPM4和LPM5中禁用。LPM0是在USB连接期间允许的最低功率模式。 |
ACLK | REFO | 32Khz | ACLK是一个低速时钟,驱动计时器和较慢的外围设备。在低功耗模式下,这是一种非常低功耗的方法来保持单片机的活力。它在LPM3期间保持活动,但在LPM4和LPM5中禁用。 |
USBCLK | XT2 | 4Mhz | MSP430F5529上的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 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); //测试振荡器故障中断是否发生,如果发生就卡在此处循环 }
- MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)
- MSP430F5529火箭板 ----> 关于核心电压提升实验(含电源管理模块和供电监控系统介绍)
- MSP430F5529火箭板 ---> 控制时钟系统输出频率实验(含时钟系统分析)
- MSP430F5529火箭板 --> 按键中断控制LED实验
- MSP430F5529火箭板 ----> 关于核心电压提升实验
- MSP430F5529火箭板 ---> 控制时钟系统输出频率实验
- MSP430F5529 火箭板 --->点亮一盏LED实验
- MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验
- RCC时钟控制系统组成及时钟原程序分析
- 基于单片机DS1302电子时钟闹钟控制系统