请教msp430f5438外接晶振不起振
INT16U i,iq0;P7SEL|=BIT0+BIT1; //Port select XT1
//P5SEL |= BIT2+BIT3;
UCSCTL6 &= ~XT1OFF;
//UCSCTL6 &= ~XT2OFF;
UCSCTL6 |= XTS;
//UCSCTL6 |= XCAP_3;
UCSCTL6|=XT1DRIVE_1;
UCSCTL6 &= ~XT1BYPASS;
UCSCTL4=SELM__XT1CLK+SELS__XT1CLK;//SMCLK Source Select XT1CLK , MCLK Source Select XT1CLK
do
{
SFRIFG1 &= ~OFIFG;
for (iq0=0xfff;iq0>0;iq0--) P6OUT ^= BIT4;//延时,等待XT1起振
}
while (SFRIFG1&OFIFG);
外接12m晶振,示波器能观察到波形,但是波形很小。请教这是什么原因。 回复【楼主位】alading
-----------------------------------------------------------------------
看看外接的晶振电容 找一下TI写的晶振电路的注意事项把。估计是硬件问题。我也遇到过类似问题,换了块板子就好了。。。 电容接了15p的 电容调大一些试试,连线的话看看能不能缩短些 学习下了 遇到同样问题,
msp430f169 两个外部 晶振,一个7.3728Mhz,一个32.768khz
一共做了 4块板子,
我的晶振初始化程序如下:
//--------------------------
void TimerA_Init(void)
{
TACTL = TASSEL_1 + ID0 + TACLR ; //ACLK=32768Hz ,清除tar ,2分频
CCTL0 = CCIE; //
CCR0 = 16384;//32768*2// (1/32768)*819 =20 ms ??
TACTL |= MC0+MC1; //Up/Down mode
}
// * 定时器B 初使化 ****
void TimerB_Init (void)
{
TBCTL = TBSSEL_1+ TBCLR ; //ID_2 + ID1 +
TBCCTL0 = CCIE; // INTERRUPT ENABLE
TBCCR0 = 8192; //250ms
TBCTL |= MC0;
}
/****** 定时器 A 中断 处理 ***********/
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
timer_aflg = 1;
}
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_B (void)
{
timer_bflg = 2;
}
//--------------------------
void InitClock(void)
{
unsigned int oscdly;
BCSCTL1=RSEL2+RSEL1+RSEL0; //X2T Enable ; LFXT1 operation at 32768Hz; Highest nominal DCO
DCOCTL=DCO2+DCO1+DCO0; //Definition the Highest frequency for DCO
do
{
IFG1 &=~OFIFG;
oscdly=255;
while(oscdly--);
}while(IFG1 & OFIFG); ////////////////////////////////不能跳出
BCSCTL2=SELM_2+SELS; //SMCLK and MCLK uses XT2
}
void main(void)
{
uintmeteraddr = 1;
uchar metertype = 0;
uinti= 0;
uchar getflag =0;
//uint temp;
uint mi = 0;
//-----------------------------------
//uchar cmd8cnt;
uint cntdelay =0;
uchar *pointer;
//------------------------------------
//uint heat_time = 0;
uint m_time = 0;
uint am_time = 0;
uint heart_time=26;
// cmd8cnt =0;
//uchar gstate = 0x41;
uchargstate =0x01;
uchar data=0xbb;
uchar hbflg = 3;
volatile uchar heartstate = 0x22;
//------------------------------
uchar front = {0xaa,0xaa,0xaa,0x7E,'\0'};
uchar maflag = 0;
volatile uchar vaflag = 0;
WDTCTL=WDTPW+WDTHOLD;
InitClock();
TimerA_Init();
//======================= 串口初始化 =======================//
uart0Init();
uart1Init();
DRE_out
RE
//------------------
init_ad();
//启动
P2DIR |=0x20;
P2OUT&=~0x20;
//-----------------------------------------------------p5.2置位
P5DIR |=0x04;
P5OUT |=0x04;
_EINT();
//======================= 主循环 =======================//
//定时器中断
while(1)
{
WDTCTL = WDT_ARST_1000;
if(1 == timer_aflg )
{
timer_aflg = 0;
... ...
}
... ...
}
看到 我程序什么意思了吗 ?每隔2s我 去 if(1 == timer_aflg ){ } 处理一些事情;
几块板子 都能运行到 if(1 == timer_aflg )处;
板子1:两个晶振正常工作 两天,
今天 忽然发现 timer_aflg 永远等于0,即没有进入 定时中断里去 进行 timer_aflg = 1;的操作;
板子2 3 4 焊接完后 就出现上述情况,是什么原因? 用TI的example 测试一下你的晶振是否启振了 我拿示波器看了下,
7.3728mhz的起振了, 管脚上有波形;
32.768khz的有一块 刚才起振了(程序可以正常运行了)
我用示波器看了下该板子,32。768khz 管脚上有波形
另外3块 32。768khz管脚上没有波形, 如果这样的话 ,也太难搞了,
我用普通电烙铁+ 助焊剂 焊接的 最奇怪的是有问题的板子,有时候 32。768能起振,有时候 不能起振? 程序中 对32.768khz 低频晶振的 程序设定有问题吗?
我在外部 又加了两个 20pF的电容,此电容 去掉也不行啊? 如果用外部震荡 32768是必须要有的所以 他的好坏影响了整个板 我加了这两句就好了
UCSCTL3 |= SELREF_3;
UCSCTL4 |= SELA_2; 问题解决了。
首先,XT1HFOFFG在有的版本的F5525.H头文件中,没有这一项(REVERSED)。其次,有的晶体不需要外接稳定电容---跟我的板子布线有关?。。。。
是不是晶振有问题还不能确定吧 你用仪器测下晶振 看看有没有起振。有起振的话那是软件有问题了。 芯片晶振的引线不要太长。尽量短些。。注意下两个电容。。
页:
[1]