
1. 系统时钟--ACLK,SMCLK,MCLK的产生
1.1 实验目标
(1) 了解MSP430F6638 的时钟系统
(2) 掌握配置MSP430F6638 时钟的方法
(3) 了解MSP430F6638 的时钟系统与低功耗之间的关系
1.2 实验原理
MSP430F6638 具有灵活的时钟系统:
(1) 外部时钟XT1,XT2;
(2) 内置时钟DCO(锁相环FLL+);
(3) 内置时钟VLO,12KHz 典型频率,内置REFO,典型频率32.768KHz;
(4) 时钟检测系统,时钟不稳定或失效检测,可触发中断;
(5) MCLK ----CPU 运行时钟
(6) SMCLK---子系统运行时钟
(7) ACLK -----辅助时钟
本实验演示了基础的时钟配置。
UCS 模块包括5 个时钟源
(1) XTICLK:低频/高频振荡器,可以使用32768Hz 外部晶振;
(2) VLOCLK:内部低功耗、低频率振荡器,典型频率为10KHz;
(3) REFOCLK:进过调整的内部振荡器,典型值为32768hz,可以用作FLL 的参考时钟;
(4) DCOCLK:内部数字时钟,可以通过FLL 得到稳定的时钟信号;
(5) XT2CLK:可选的高频振荡器。可以用作FLL 的参考时钟。
UCS 模块提供的3 个可利用的时钟信号:
(1) ACLK:辅助时钟。可以通过软件选择XT1CLK, REFOCLK, VLOCLK, DCOCLK,
DCOCLKDIV 或(在有可用的XT2CLK 的情况下)XT2CLK 作为辅助时钟。
DCOCLKDIV 是DCOCLK 通过FLL 模块经过1,2,4,8,16,32 分频获得的。ACLK 可
以为某些外围模块提供时钟。ACLK 可以被1,2,4,8,16,32 分频。ACLK/n 就是
ACLK 经过1,2,4,8,16,32 分频获得的,同时也可以通过外部引脚输出;
(2) MCLK:主时钟。MCLK 可以被1,2,4,8,16,32 分频后为CPU 和系统提供时钟。
MCLK 的获得和来源ACLK 的相同;
(3) SMCLK:子系统时钟。SMCLK 被1,2,4,8,16,32 分频后为个别外围模块提供时钟。
其来源和ACLK 相同。
1.3 实验步骤
(1) 将PC 和板载仿真器通过USB 线相连;
(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入
MSP430F6638_DemoV2.0\\5.CLK_system\\XT1 sources ACLK 或者
MSP430F6638_DemoV2.0\\5.CLK_system\\XT2 sources SMCLK 文件夹中的工程;
(3) 选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载
到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。
1.4 实验现象
通过示波器实际测量,MSP430 可以通过软件配置,选择不同的时钟源,工作在不同的时钟频率下。
1.5 关键代码
实验一:
#include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR |= BIT0; // ACLK set out to pin P1SEL |= BIT0; // P5SEL |= BIT4+BIT5; // Select XT1 // 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 UCSCTL6 &= ~(XT1DRIVE_3); // Xtal is now stable, reduce drive strength UCSCTL4 |= SELA_0; // ACLK = LFTX1 (by default) UCSCTL5 |= DIVA_0; /* ACLK Divider Bit: 0 */ __bis_SR_register(LPM3_bits); // Enter LPM3 __no_operation(); // For debugger } 实验二: #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR |= BIT0; // ACLK set out to pin P1SEL |= BIT0; P3DIR |= BIT4; // SMCLK set out to pins P3SEL |= BIT4; P7SEL |= BIT2+BIT3; // Port select XT2 UCSCTL6 &= ~XT2OFF; // Enable XT2 UCSCTL3 |= SELREF_2; // FLLref = REFO // Since LFXT1 is not used, // sourcing FLL with LFXT1 can cause // XT1OFFG flag to set UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to // expected frequency UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2 UCSCTL5 |= DIVS_0; /* SMCLK Source Divider 0 */ __no_operation(); //while(1); // Loop in place __bis_SR_register(LPM0_bits); // Enter LPM3 __no_operation(); // For debugger } 1.6 思考题 (1) MSP430 系列单片机有哪些时钟输入信号? 答:ACLK,MCLK,SMCLK (2) MSP430 系列单片机的DCO 振荡器有什么重要用途? 答:DCOCLK是内部数字时钟,可以通过FLL 模块经过1,2,4,8,16,32 分频得到稳定的时钟信号 。可以作为ACLK,MCLK,SMCLK的信号源。DCO振荡器是一个可数字控制的RC振荡器, 它的频率随供电电压、环境温度变化而具有一定的不稳定性。DCO频率可以通过选择FLL的频率(FLLRENCLK/n)来增强振荡频率的稳定性。 (3) MSP430 系列单片机不接任何振荡器是否可以正常工作? 答:不可以。Msp430单片机的时钟既要有高频率以对系统硬件需求和外部事件有较快的反应速度,又要有低频率来降低电流消耗,还要有多个时钟源产生多个时钟输出信号,所以需要外接振荡器。 2. 系统时钟--FLL与时钟校正 2.1 实验目标 (1) 熟悉CCSV5 集成开发环境的使用 (2) 了解MSP430 的时钟系统 (3) 掌握配置MSP430 时钟系统的方法 2.2 实验原理 本实验详细的介绍了MSP430F6638 的FLL 锁频环电路与时钟的校正。这个实验室通过 FLL 锁频环电路自动校正使内部DCO 振荡器稳定的运行在2.45MHz,相互关系式有:ACLK=XT1=32768Hz,MCLK=SMCLK=DCO=(74+1)*REFO=2457600Hz,这里XTICLK 被选为ACLK,REFO 是内部调整过的32768Hz 参考时钟,提供一个稳定的参考时钟用作FLLREFCLK。 运行主程序之前关闭看门狗时钟,进行复位,防止改变时钟源时产生可能的错误时间 间隔。用引脚P1.0 与辅助时钟ACLK 连接,引脚P3.4 与子系统时钟SMCLK 连接,通过 软件选择频率为32768Hz 的XT1CLK 时钟源作为辅助时钟,ACLK=XT1=32768Hz,设置 FLL 的相关参数,包括分频器(N+1)FLLN 和分频值FLLD 以及FLL 的参考时钟,通过 f(DCOCLK)=D*(N+1)*f(FLLREFCLK)得到稳定的DCOCLK 频率。 2.3 实验步骤 (1) 将PC 和板载仿真器通过USB 线相连; (2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入 MSP430F6638_DemoV2.0\\6.CLK_fll\\DCO at 2.45MHz 文件夹中的工程; (3) 选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载 到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。 2.4 实验现象 程序运行之后,将示波器探头连接到MCU 的P3.4 管脚,调整好示波器参数,可以检 测出该管脚有2.45MHz 左右的频率输出。 2.5 关键代码 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR |= BIT0; // ACLK set out to pins P1SEL |= BIT0; P3DIR |= BIT4; // SMCLK set out to pins P3SEL |= BIT4; 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 // Initialize DCO to 2.45MHz __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_3; // Set RSELx for DCO = 4.9 MHz UCSCTL2 = FLLD_1 + 74; // Set DCO Multiplier for 2.45MHz // (N + 1) * FLLRef = Fdco // (74 + 1) * 32768 = 2.45MHz // Set FLL Div = fDCOCLK/2 __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 2.45 MHz / 32,768 Hz = 76563 = MCLK cycles for DCO to settle __delay_cycles(76563); // Loop until XT1,XT2 & DCO fault flag is cleared do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag while(1); // Loop in place } 2.6 思考题 (1) MSP430 系列单片机有哪些时钟输入源? 答:XT1CLK 低频或高频时钟源,XT2CLK 高频时钟源,VLOCLK 低功耗低频内部时钟源,REFOCLK 低频修整内部参考时钟源,DCOCLK 片内数字控制时钟源。 (2) MSP430 系列单片机提供几种时钟信号?每种时钟信号的通常用途是什么? 答: ACLK 辅助时钟:ACLK可由软件选择来自XT1CLK、REFOCLK、VLOCLK、DCOCLK、 DCOCLKDIV、XT2CLK(由具体器件决定)这几个时钟源之一。然后经1、2、4、8、16、32分频得到。ACLK可由软件选作各个外设模块的时钟信号,一般用于低速外设模块。 MCLK 系统主时钟: MCLK可由软件选择来自上述5种时钟源,同样可经过分频得到。MCLK主要用于CPU和系统。 SMCLK 子系统时钟:可由软件选择来自上述5种时钟源,同样可经过分频得到。SMCLK可由软件选作各个外设模块的时钟信号,主要用于高速外设模块。 (3) MSP430 系列单片机的DCO 振荡器有什么重要用途? 答:DCOCLK是内部数字时钟,可以通过FLL 模块经过1,2,4,8,16,32 分频得到稳定的时钟信号 。可以作为ACLK,MCLK,SMCLK的信号源。DCO振荡器是一个可数字控制的RC振荡器, 它的频率随供电电压、环境温度变化而具有一定的不稳定性。DCO频率可以通过选择FLL的频率(FLLRENCLK/n)来增强振荡频率的稳定性。 3. 系统时钟--时钟配置和输入选择 3.1 实验目的 (1) 了解MSP430F6638 的时钟系统 (2) 掌握配置MSP430F6638 时钟的方法 (3) 了解MSP430F6638 的时钟系统与低功耗之间的关系 3.2 实验原理 本实验演示了使用一个外部的32KHz 晶振作为ACLK 的时钟输入源,使用一个更高频 率的晶振作为SMCLK 的时钟输入源。供CPU 使用的MCLK 由内部的DCO 产生。32kHz 的晶振连接到CPU 的XIN 和XOUT 管脚。高频率的晶振连接到CPU 的XT2IN 和XT2OUT。ACLK 通过P1.0 输出,SMCLK 通过P3.4 输出。 3.3 实验步骤 (1) 将PC 和板载仿真器通过USB 线相连; (2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入 MSP430F6638_DemoV2.0\\7.CLK_select\\select clock source 文件夹中的工程; (3) 选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载 到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。 3.4 实验现象 程序运行之后,将示波器探头连接到MCU 的P3.4 和P1.0 管脚,调整好示波器参数, 可以检测出该管脚有2.45MHz 左右的频率输出。 3.5 关键代码 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= BIT0; // ACLK set out to pins P1SEL |= BIT0; P3DIR |= BIT4; // SMCLK set out to pins P3SEL |= BIT4; // while(BAKCTL & LOCKIO) // Unlock XT1 pins for operation // BAKCTL &= ~(LOCKIO); P7SEL |= BIT2+BIT3; // Port select XT2 UCSCTL6 &= ~XT2OFF; // Set XT2 On 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 UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to // expected frequency UCSCTL4 |= SELA_0 + SELS_5; // Select SMCLK, ACLK source and DCO source while(1); // Loop in place }
