void init_clock(void) { UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO UCSCTL4 |= SELA_2; // Set ACLK = REFO UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags } while (SFRIFG1 & OFIFG); // Test oscillator fault flag __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation UCSCTL2 |= 249; // Set DCO Multiplier for 8MHz // (N + 1) * FLLRef = Fdco // (249 + 1) * 32768 = 8MHz __bic_SR_register(SCG0); // Enable the FLL control loop // Worst-case settling time for the DCO when the DCO range bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx // UG for optimization. // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle __delay_cycles(250000); }
时间: 2024-02-10 18:33:40 浏览: 153
这段代码定义了一个函数`init_clock`,用于初始化MSP430芯片的时钟系统,使其工作在8MHz的频率下。
函数实现的过程如下:
首先,设置UCSCTL3寄存器的SELREF位为2,表示使用REFO作为DCO FLL的参考时钟;设置UCSCTL4寄存器的SELA位为2,表示使用REFO作为ACLK的时钟源。
然后,将UCSCTL0寄存器清零,将DCOx和MODx的值设为最小值,以便在启动时能够正常工作。
接下来,进入一个do-while循环,不断检测XT2OFFG、XT1LFOFFG和DCOFFG位,如果有任何一个标志位被置位,则表示XT2、XT1或DCO出现问题,需要清除标志位,等待时钟系统稳定。
在循环结束后,关闭FLL控制循环,将UCSCTL1寄存器的DCORSEL位设置为5,表示选择16MHz的DCO范围;将UCSCTL2寄存器设置为249,表示将DCO的倍频器设置为249,将DCO频率设置为8MHz。
最后,启动FLL控制循环,等待DCO稳定,至少需要250000个MCLK周期的时间。
函数执行完毕后,MSP430芯片的时钟系统将工作在8MHz的频率下。
相关问题
详细解释下面代码//使用内部振荡器时钟源REFO,配置ACLK为32kHz,SMCLK和MCLK为16MHz void Clock_Init() { P5SEL |= BIT2 + BIT3; // P5.2和P5.3选择XT2晶振功能 UCSCTL6 &= ~XT2OFF; // 使能XT2 UCSCTL3 |= SELREF_2; // FLL模块的参考时钟源选择REFO UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO // 测试晶振是否产生故障失效,并清除故障失效标志位 do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除XT2,XT1,DCO故障失效标志位 SFRIFG1 &= ~OFIFG; // 清除晶振故障失效中断标志位 }while(SFRIFG1 &OFIFG); // 测试晶振故障失效中断标志位 __bis_SR_register(SCG0); //禁止FLL UCSCTL1 = DCORSEL_6; //选择DCO频率范围 UCSCTL2 |= 499; // 设置DCP频率为16MHz // 计算公式:(499 + 1) * 32768 = 16MHz __bic_SR_register(SCG0); //启用FLL __delay_cycles(250000); //// 延时,待DCO工作稳定 } */
这段代码是 MSP430 单片机的时钟初始化函数。主要的功能是配置时钟源和时钟频率,使得单片机能够正常工作。
具体解释如下:
1. P5SEL |= BIT2 + BIT3; // P5.2和P5.3选择XT2晶振功能
这句代码的作用是将 P5.2 和 P5.3 的功能设置为 XT2 晶振。XT2 是一种外部晶振,用于提供高精度的时钟信号。
2. UCSCTL6 &= ~XT2OFF; // 使能XT2
这句代码的作用是使能 XT2 晶振。
3. UCSCTL3 |= SELREF_2; // FLL模块的参考时钟源选择REFO
这句代码的作用是将 FLL 模块的参考时钟源选择为 REFO。REFO 是 MSP430 单片机内部的振荡器时钟源。
4. UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK和MCLK为DCO
这句代码的作用是将 ACLK 设置为 REFO,SMCLK 和 MCLK 设置为 DCO。DCO 是 MSP430 单片机内部的数字控制振荡器,可以通过软件控制其频率。
5. do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); SFRIFG1 &= ~OFIFG; }while(SFRIFG1 &OFIFG);
这段代码的作用是测试晶振是否产生故障失效,并清除故障失效标志位。如果检测到晶振失效,则需要重新初始化时钟。
6. __bis_SR_register(SCG0); //禁止FLL
这句代码的作用是禁止 FLL。FLL 是一个数字锁相环,用于调节 DCO 的频率。
7. UCSCTL1 = DCORSEL_6; //选择DCO频率范围
这句代码的作用是选择 DCO 的频率范围。DCO 有多种频率范围可供选择,这里选择的是最高频率范围。
8. UCSCTL2 |= 499; // 设置DCO频率为16MHz
这句代码的作用是设置 DCO 的频率为 16MHz。具体的计算公式为:(499 + 1) * 32768 = 16MHz。其中,32768 是 REFO 的频率,499 是用于调节 DCO 频率的参数。
9. __bic_SR_register(SCG0); //启用FLL
这句代码的作用是启用 FLL。经过上述设置后,FLL 会根据参考时钟源 REFO 和 DCO 的频率范围,自动调节 DCO 的频率,使得其稳定在 16MHz。
10. __delay_cycles(250000); // 延时,待DCO工作稳定
这句代码的作用是延时一段时间,等待 DCO 的频率稳定。在 DCO 频率改变后,需要一定的时间才能稳定下来。
#include <msp430f6638.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT while(BAKCTL & LOCKIO) // Unlock XT1 pins for operation BAKCTL &= ~(LOCKIO); UCSCTL6 &= ~(XT1OFF); // XT1 On UCSCTL6 |= XCAP_3; // Internal load cap // Loop until XT1 fault flag is cleared do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag P1DIR |= BIT2+BIT3; // P1.2 and P1.3 output P1SEL |= BIT2+BIT3; // P1.2 and P1.3 options select TA0CCR0 = 512-1; // PWM Period TA0CCTL1 = OUTMOD_7; // CCR1 reset/set TA0CCR1 = 384; // CCR1 PWM duty cycle TA0CCTL2 = OUTMOD_7; // CCR2 reset/set TA0CCR2 = 128; // CCR2 PWM duty cycle TA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, up mode, clear TAR __bis_SR_register(LPM3_bits); // Enter LPM3 __no_operation(); // For debugger }
这段代码是 MSP430 微控制器的代码,用于控制 P1.2 和 P1.3 两个引脚产生 PWM 信号。其中使用了 ACLK 作为计时器时钟源,TA0CCR0 设置了 PWM 信号的周期,TA0CCTL1 和 TA0CCTL2 分别设置了 P1.2 和 P1.3 引脚产生的 PWM 信号的占空比。代码中还包括了解锁 XT1 引脚,以及处理 XT1 振荡器故障标志的部分。
阅读全文