过错更正阐明:
在第三章讲UCS时钟体系的时分,试验二是将MCLK和ACLK装备为XT1(F5529的XT1为32.768KHZ)
其时的程序如下:
/*1.装备IO口5.4和5.5为XT1功用。*/
/*2.装备XCAP为XCAP_3,即12PF的
电容。*/
/*3.铲除XT1OFF标志位。*/
/*4.等候XT1起振。*/
#include<msp430.h>
void main(void){
P1SEL |= BIT0;
P1DIR |= BIT0;//丈量ACLK用
P2SEL |= BIT2;
P2DIR |= BIT2;//丈量SMCLK用
P7SEL |= BIT7;
P7DIR |= BIT7;//丈量MCLK用
P5SEL |= BIT4|BIT5; //装备为XT1功用,电路板上晶振接于这两脚
UCSCTL6 |= XCAP_3;//装备
电容为12pF
UCSCTL6 &= ~XT1OFF; //使能XT1
/*下面是很重要的一步:*/
/* XT1刚刚起振的时分可能有过错,导致时钟过错标志方位位,必须先清零*/
/*OFIFG即Osc Fault Flag,坐落SFRIFG1中*/
while(SFRIFG1 & OFIFG) //如果有时钟过错{
UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//铲除3种时钟过错标志
SFRIFG1&=~(OFIFG);//铲除时钟过错标志位}
UCSCTL4&=(UCSCTL4&(~(SELA_7|SELM_7)))|SELA_0|SELM_0;
//将SMCLK和MCLK时钟源装备为XT1
}
其时由于手里没有频率计,并没有测输出。
昨日实践测了一下,发现该程序存在问题:实践丈量MCLK为876KHZ左右,ACLK虽然是32.768KHZ,但我感觉仍是内部的REFO。
回答如下:这是官方的例程
ACLK = SMCLK = MCLK =XT1 =32768
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; // ACLK set out to pins
P1SEL |= BIT0;
P2DIR |= BIT2; // SMCLK set out to pins
P2SEL |= BIT2;
P7DIR |= BIT7; // MCLK set out to pins
P7SEL |= BIT7;
P5SEL |= BIT4+BIT5; // Select XT1
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap
UCSCTL3 = 0; // FLL Reference Clock = XT1
// Loop until XT1,XT2 & DCO stabilizes – In this case loop until XT1 and DCo settle
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 + SELS_0 + SELM_0; // SMCLK = MCLK =ACLK = LFTX1
}
留意划红线的句子,要用等号赋值。由于默许 SELS 和SELM的值是不为0的,所以用或赋值的话会犯错。
默许值请看下表:
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/256173.html