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且保持禁止状态。
#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);
}
我手头上的开发板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);
}
#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系列时钟切换的基本操作了,讲的并不详细,有其他疑问请仔细阅读芯片手册或者留言讨论。
DCOCLK = D*(N+1)*(REFCLK/n)
DCOCLKDIV = (N+1)*(REFCLK/n)
可以见,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。
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;
#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;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
void main(void) {
WDTCTL = WDTPW+WDTHOLD;
P1SEL &= ~BIT1;
P1DIR |= BIT1;
P1SEL |= BIT0; //ACLK
P1DIR |= BIT0;
P2SEL |= BIT2; //SMCLK
P2DIR |= BIT2;
P7SEL |= BIT7; //MCLK
P7DIR |= BIT7;
P5SEL |= BIT4|BIT5;
UCSCTL6 |= XCAP_3;
UCSCTL6 &= ~XT1OFF;
SetVcoreUp(1); //一次提高Vcore电压等级,具体请参考手册
SetVcoreUp(2);
SetVcoreUp(3);
__bis_SR_register(SCG0);
UCSCTL0 = 0;
UCSCTL1 = DCORSEL_6;
UCSCTL2 = FLLD_1 | 380;
__bic_SR_register(SCG0);
__delay_cycles(782000);
/*
* 默认状态下:ACLK=FLLREFCLK=XT1 SMCLK=MCLK=DCOCLKDIV XT2关闭
* 为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK
* 并打开XT2OFF,否则XT2将处于无法使用状态
* */
//UCSCTL6 &= ~(XT2DRIVE0|XT2DRIVE1|XT2OFF);
while (SFRIFG1 & OFIFG) { // Check OFIFG fault flag
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear OSC flaut Flags
SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
while(1){
P1OUT ^= BIT1;
delay();
}
}
本文作者:girlkoo
本文链接:http://blog.csdn.net/girlkoo/article/details/9047191