基础时钟模块应用举例
例1 设MCLK=XT2,SMCLK=DCOCLK,将MCLK 由5.4 输出程序如下: #include
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗 P5DIR |= 0X10; P5SEL |= 0X10;
BCSCTL1 &= ~XT2OFF; do{
IFG1 &= ~OFIFG; for(i = 0xFF;i>0;i--); }
while((IFG1 & OFIFG) != 0); BCSCTL2 |= SELM1; for(;;); }
例2 设ACLK=MCLK=LFXT1=LF #include
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗 P5DIR |= 0X10; P5SEL |= 0X10; BCSCTL1 &= XTS; do{
IFG1 &= ~OFIFG; for(i = 0xFF;i>0;i--); }
while((IFG1 & OFIFG) != 0); BCSCTL2 |= SELM1+SELM0; for(;;); }
例3 改变BCSCTL1 中Rsel0,Rsel1,Rsel2 的值测量DCO 频率(默认情况MCLK、 SMCLK 均为DCO 时钟,P1.4 输出ACLK,P2.0 输出SMCLK,P5.4 输出MCLK) #include
WDTCTL=WDTPW+WDTHOLD;//看门狗停止P1DIR=0x10;//p1.4 输出 P1SEL=0x10;//P1.4=SMCLk P2DIR=0x01;//p2.0 输出 P2SEL=0x01;//P2.0=ACLk
P5DIR=0x10;//p5.4 输出 P5SEL=0x10;//P5.4=SMCLk
BCSCTL1 =0x00 ;//xt2off,xts,diva.1,diva.0xt5v,,res3 //BCSCTL1 =0x01; //BCSCTL1 =0x02; //BCSCTL1 =0x03; //BCSCTL1 =0x04; //BCSCTL1 =0x05; //BCSCTL1 =0x06; //BCSCTL2=0x07; for(;;) {__NOP();
//_BIS_SR(CPUOFF);// } }
举例1 使用软件定时周期性取反P2.1 #include
WDTCTl = WDTPW + WDTHOLD; P2DIR |= 0x02; for(;;) {
unsigned int i; i = 50000; do (i--); while (i != 0); } }
举例2 单片机在P3.1 产生方波,并把P3.1 与P1.7 相连,P1.7 接收中断,在中断服 务程序中让P3.3 产生方波。 #include
WDTCTL=WDTPW+WDTHOLD; P3OUT =0x00;//P3 引脚低电平 P3DIR |=0xff;//P3 方向输出 P1OUT=0x00;
P1IES |=0x00;//上升沿触发
P1IFG= 0x00; //因为P1IES 设置会使中断标志置位,故清零。 P1IE |=0xff;// P1 模块中断允许 _EINT();//系统中断允许 int i; for(;;)
{
for(i=1;i<=32000;i++) _NOP();
P3OUT ^=0x02;//P3.1 每隔8000 个机器指令周期产生一次跳变 }}
#pragma vector = PORT1_VECTOR __interrupt void P1_Interrupt(void){ if (P1IFG==0x80) { P1IFG=0x00; P3OUT ^= 0x08; } else P1IFG=0x00; }
#include
WDTCTL = WDT_MDLY_32; IE1 |= WDTIE; P1DIR |=0x01; _EINT(); for(;;) {
_BIS_SR(CPUOff); _NOP(); } }
#pragma vector = WDT_VECTOR __interrupt void watchdog_timer(void) {
P1OUT ^= 0x01; }
例2: 看门狗模式
#include
P3DIR=0XFF; //P3 输出
WDTCTL=WDT_MRST_32; //WDTPW+WDTCNTCL 看门狗32 毫秒 int i;
for(i=0;i<5000;i++) _NOP();
P3OUT ^=0X02; // P3.1 灯亮或灭 for(;;) {
WDTCTL =WDT_MRST_32; //喂狗,看门狗计数器清零即 //WDTPW+WDTCNTCL;
for(i=0;i<=5000;i++) _NOP();
P3OUT ^=0x0c; // P3.2 p3.3 灯亮或灭 } }
例1:
//定时开关P3,即P3 输出取反;定时时间到,进入中断 //ACLK=32768HZ,MCLK=SMCLK=DCOCLK=1.048576M //周期性P3 取反,频率为1.048576M/65536/2=8Hz #include
WDTCTL=WDTPW+WDTHOLD;
TACTL =TASSEL1+TACLR+MC1+TAIE;//SMCL,CLEAR TAR, //TIMER_A 连续计数描 述//
//TA 定时器溢出中断允许 P3DIR=0xFF;
//TACTL |=MC1;//TIMER_A 连续计数描述 _EINT(); for(;;) {
_BIS_SR(CPUOFF); _NOP(); } }
#pragma vector=TIMERA1_VECTOR __interrupt void TIMER_A(void) {
switch(TAIV) {
case 2: break; case 4: break;
case 10: P3OUT^=0xFF; break; } }
例2:
//ACLK=32768HZ,MCLK=SMCLK=DCOCLK=1.048576M //周期性P3.1 取反,频率为1.048576M/65535(TA 中断响应)
//周期性P3.3 取反,频率为20000(捕获中断响应)可以看出:P3.1 闪亮的周期约是P3.3 的3 倍
#include
WDTCTL=WDTPW+WDTHOLD;
TACTL =TASSEL1+ID0+ID1+TACLR+TAIE;//MCLK,8 分频,CLEAR TAR,//TA 定时器溢
出中断允许
CCTL0=CCIE; // CCR0=20000;
TACTL |=MC1;//TIMER_A 增减计数描述 P3DIR=0xFF; P3OUT=0xFF; _EINT(); for(;;) {
_BIS_SR(CPUOFF); _NOP(); } }
#pragma vector=TIMERA1_VECTOR //定时器中断__interrupt void TIMER_A(void) {
switch(TAIV) {
case 2: break; case 4: break;
case 10: P3OUT^=0x02; break; } }
#pragma vector=TIMERA0_VECTOR //当TAR=CCR0 产生中断 __interrupt void TIMER_cc(void) {
P3OUT^=0x08; CCR0+=20000; }
举例: 例1:
//软循环产生方波,从p3.1 输出(闪) //CCI0、CCI1 设置为捕获模式,
//P3.1 与P1.1 和P1.2(即CCI0A、CCI1A)相连,当P3.1 产生沿变化,将产生捕获中 断
//CCI0 中断使得P3.3 闪,CCI1 中断使得P3.2 闪j,k 计算前后两次捕获的时间间隔(结 果K= j/2,why) int i,j,k;
#include
WDTCTL=WDTPW+WDTHOLD;
TACTL =TASSEL1+ID0+ID1+MC1+TACLR;//+TAIE;//MCLK,8 分频,CLEAR TAR,连续