四川省建设安全协会网站,大连零基础网站建设教学哪里有,html编辑器的功能介绍,网站建设安全协议书MSP430(F5529)相比MSP430(F149)来讲#xff0c;功能更加强大。
UCS简介 MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源#xff0c;依次是#xff1a;XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册#xff0c;其中XT1C…MSP430(F5529)相比MSP430(F149)来讲功能更加强大。
UCS简介 MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源依次是XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册其中XT1CLK、VLOCLK、REFOCLK和XT2CLK跟MSP430F1XX系列没有太大区别学习配置起来也比较简单。
UCS上电默认状态
PUC后UCS模块的默认状态如下
XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。 MCLK选通为DCOCLKDIV SMCLK选通为DCOCLKDIV FLL使能且将XT1CLK作为FLL参考时钟。 XIN和XOUT脚设置为通用IOXIN和XOUT配置为XT1功能前XT1保持禁用。 如果可用的话XT2IN和XT2OUT被设置为通用IO且保持禁止状态。 UCS时钟源切换
由于REFOCLK、VLOCLK、DCOCLK这里暂时这么认为默认状态下是可用的所以切换的时候只需要通过UCSCTL4来配置ACLK、SMCLK和MCLK的时钟源即可而XT1CLK和XT2CLK需要根据硬件的具体配置情况确定所以这两者的配置比起前三者来讲就有些不同了。下面我们做三个实验
1将MCLK和SMCLK配置REFOCLK、VLOCLK REFOCLK和VLOCLK是芯片默认提供的只要芯片正常工作这两个时钟就会正常工作因此该时钟配置非常简单只需要修改UCSCTL4将SELS和SELM配置为对应的选项VLOCLK或者REFOCLK即可具体代码如下
#include msp430f5529.hvoid main(void) {WDTCTL WDTPWWDTHOLD;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配置为VLOCLKUCSCTL4 UCSCTL4(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLKwhile(1);}
上面的代码就实现了将SMCLK和MCLK切换为VLOCLK和REFOCLKACLK的操作也是同样的不作过多解释。 2将MCLK和SMCLK配置XT1CLK
XT1CLK的配置要分为以下几步
配置IO口5.4和5.5为XT1功能。 配置XCAP为XCAP_3即12PF的电容。 清除XT1OFF标志位。 等待XT1起振。 具体的代码如下
#include msp430f5529.h void main(void) { WDTCTL WDTPWWDTHOLD; 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 msp430f5529.h void main(void) { WDTCTL WDTPWWDTHOLD; 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);
} DCO模块详解 DCO模块在MSP430F5XX系列芯片中非常重要因为从MSP430F4XX开始MSP430引用了FLL模块FLL即锁相环可以通过倍频的方式提高系统时钟频率进而提高系统的运行速度。 DCO模块运行需要参考时钟REFCLKREFCLK可以来自REFOCLK、XT1CLK和XT2CLK通过UCSCTL3的SELREF选择默认使用的XT1CLK但如果XT1CLK不可用则使用REFOCLK。 DCO模块有两个输出时钟信号级DCOCLK和DCOCLKDIV其中倍频计算公式如下
DCOCLK D*(N1)*(REFCLK/n) DCOCLKDIV (N1)*(REFCLK/n) 其中 n即REFCLK输入时钟分频可以通过UCSCTL3中的FLLCLKDIV设定默认为0也就是不分频 D可以通过UCSCTL2中的FLLD来设定默认为1也就是2分频 N可以通过UCSCTL2中的FLLN来设定默认值为32。 所以系统上电后如果不做任何设置DCOCLK的实际值为2097152DCOCLKDIV的实际值为1048576。 另外配置芯片工作频率还需要配置DCORSEL和DCOxDCORSEL和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 msp430f5529.h 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 WDTPWWDTHOLD; 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); /* * 默认状态下ACLKFLLREFCLKXT1 SMCLKMCLKDCOCLKDIV 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(); }
} ———————————————— 版权声明本文为CSDN博主「wzxseu」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/wzx104104104/article/details/109105687