#pragma vector=PORT1_VECTOR __interrupt void port_int(void) { unsigned int i; for(i=0;i<3;i++) { delay(); } if ( (P1IFG&BIT2)!=0 ) { number++; P2OUT=~number; } P1IFG &=~BIT2; }
实验名称:实验7:基本时钟和低功耗模式 姓名:袁鹏 学号:2013011780 实验班号:33 机器号:42
一.实验目的
1. 了解MSP430Gxxx 基本时钟模块的工作原理,掌握其控制方法; 2. 掌握利用时钟信号和中断技术实现定时功能的方法; 3.掌握低功耗模式控制方法 二. 实验任务
1. 数字示波器的使用
(1).用示波器测得信号源的周期T=20us、频率f=1.000KHZ、峰峰值V=3.12V。 (2).测得实验板上Vcc信号正常,Vccmax=3.76V,Vccmin=3.52V,Vccavg=3.66V。 2. 测试上电复位系统的 ACLK、和SMCLK 时钟频率
输出的ACLK频率为F(ACLK)=32.79KHZ,SMCLK的频率为F(SMCLK)=1.031MHZ。 代码如下: #include \int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL|=BIT0; //P1.0输出ACLK P1SEL2&=~BIT0; P1DIR|=BIT0; P1SEL|=BIT4; //P1.4输出SMCLK P1SEL2&=~BIT4; P1DIR|=BIT4; while(1); } 思考:上电复位后,CPU 工作的时钟信号MCLK 频率值是多少?
上电复位后,通过查看基本时钟模块相关寄存器,可知MCLK的时钟源为DCO,SMCLK的时钟源也为DCO,因此通过测量上面复位后的SMCLK频率可知MCLK的频率,由上述可知F(MCLK)=1.031.MHZ。
3. 掌握基本时钟模块的编程控制
参看附录A 实验板原理图,用跳线将JP8 中的插针信号接到晶振32.768Khz 侧,使晶振 与单片机的P2.6 和P2.7 相连。编程控制基本时钟模块,设置ACLK 分别为下面时钟频 率,并通过P1.0 输出ACLK,用示波器观察:
(1). ACLK=4096Hz;(时钟源外部晶振,32768Hz/8) 观察的F(ACLK)= 4.098KHZ。 具体代码如下:
#include \int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL|=BIT0; //设置P1.0输出ACLK P1SEL2&=~BIT0; P1DIR|=BIT0; P2SEL|=BIT6; //设置P2.6、P2.7连接外部晶振引脚 P2SEL2&=~BIT6; P2DIR&=~BIT6; //P2.6 XIN输入 P2SEL|=BIT7; P2SEL2&=~BIT7; P2DIR|=BIT7; //P2.7 XOU输出 BCSCTL1|=DIVA_3; //设置ACLK为8分频 while(1); } (2). ACLK=3KHz;(时钟源VLOCLK, 12KHz/4) 观察的F(ACLK)= 3.165KHZ。 具体代码如下:
#include \int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL|=BIT0; //设置P1.0输出ACLK P1SEL2&=~BIT0; P1DIR|=BIT0; BCSCTL1|=DIVA_2; //设置ACLK时钟源为VLOCLK,并为4分频 BCSCTL3|=LFXT1S_2; while(1); } 思考:可否编程在引脚P2.0 上输出ACLK? 为什么? 不可以,因为根据说明指导书MSP430G2553的辅助时钟ACLK是由P1.0输出的,内部硬件电路设计结构决定了不能用P2.0输出ACLK。
反思:LFXT1CLK是由32.768KHZ低频振荡器控制的,因此比较精确,示波器测量的精确值和理论值相差不大。而VLOCLK是由片内低功耗低频振荡器控制的,受环境温度和工作电压影响较大,因此测量值和理论值相差较大。 4. DCO 出厂校验值的频率检测
(1)利用出厂校验值,编程使DCO 分别为1MHz、8MHz、12MHz、16MHz,通过P1.4 输出,用示波器测量实际值。
出厂校验值为1MHZ时,F实际= 0.992MHZ。出厂校验值为8MHZ时,F实际= 8.197MHZ。 出厂校验值为12MHZ时,F实际= 12.05MHZ。出厂校验值为16MHZ时,F实际= 16.39MHZ。 具体代码如下: #include \int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL|=BIT4; //设置P1.4输出SMCLK P1SEL2&=~BIT4; P1DIR|=BIT4; BCSCTL1=CALBC1_1MHZ; //利用出厂校验值设置DCO的振荡频率为1MHZ DCOCTL=CALDCO_1MHZ; /*BCSCTL1=CALBC1_8MHZ; //利用出厂校验值设置DCO的振荡频率为8MHZ DCOCTL=CALDCO_8MHZ; BCSCTL1=CALBC1_12MHZ; //利用出厂校验值设置DCO的振荡频率为12MHZ DCOCTL=CALDCO_12MHZ; BCSCTL1=CALBC1_16MHZ; //利用出厂校验值设置DCO的振荡频率为16MHZ DCOCTL=CALDCO_16MHZ;*/ while(1); } 思考:DCOCLK是由片内数字可控RC振荡器控制的,受环境温度和工作电压的影响较大,因此出厂校验值和实际测量值也存在不小的误差。
(2)(选做)控制发光二级管通过延时闪亮,编程分别使主系统时钟工作在 (1) MCLK=复位频率/8 约100KHz; (2) MCLK=DCO=16MHz;
两种不同频率下,观察灯的亮灭速度有何不同,掌握主系统时钟的变化对程序执行速度的影响:
经实验观察可知,MCLK设置为100KHZ时LED1灯的闪烁频率比设置为16MHZ慢了非常多,由此可知主系统时钟是主要提供给CPU工作的时钟,MCLK频率越高,CPU工作速度越快。 代码(1):
#include \void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P2SEL&=~BIT0; //设置P2.0控制LED1闪烁 P2SEL2&=~BIT0; P2DIR|=BIT0; BCSCTL2|=DIVM_3; //设置MCLK=复位频率/8 约100KHz; unsigned int i; while(1) { for (i=0;i<5;i++) { P2OUT &= ~BIT0; delay(); P2OUT |=BIT0; delay(); }; } } 代码(2): #include \void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P2SEL&=~BIT0; //设置P2.0控制LED1闪烁 P2SEL2&=~BIT0; P2DIR|=BIT0; BCSCTL1=CALBC1_16MHZ; //利用出厂校验值设置DCO的振荡频率为16MHZ DCOCTL=CALDCO_16MHZ; unsigned int i; while(1) { for (i=0;i<5;i++) { P2OUT &= ~BIT0; delay(); P2OUT |=BIT0; delay(); }; } } 5. 低功耗模式学习
(1). 运行程序,观察现象,并记录进入低功耗前、进入低功耗后、响应中断后、退出中 断后的时钟、发光二极管和蜂鸣器状态,并做分析。 现象:程序开始运行时,P2.3控制的LED4先闪烁,然后蜂鸣器鸣叫,接着进入低功耗模式,实验板无现象产生,若此时按下K2键向P1.1发出中断信号后蜂鸣器开始鸣叫,接着LED4又开始闪烁,然后进入低功耗模式,实验板无现象产生。 进入低功耗LPM4前F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,进入后F(ACLK)=0,F(SMCLK)=0,响应中断后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,退出中断后刚开始F(ACLK)= 32.89KHZ,