1、标准起振程序。
BCSCTL1 &= ~XT2OFF;
do
{
IFG1 &= ~OFIFG;
for (i=255; i>0; i--);
}while ((IFG1 & OFIFG) !=0);
BCSCTL2 |= SELM_2 + SELS; //选择XT2作为MCLK,SMCLK的时钟,16MHZ
BCSCTL3 |= XT2S_2; //选择正确的频率范围 16M
2、测试使用UART,和用定时器 选择 SMCLK 16M,发现是正常的。现象为定时器定时示波器观察波形正确;UART
38400,串口正确。
3、但是使用
while(1)
{
Delay0_9ms(); // for(int i = 3600;i>0;--i); 一条for语句 4个时钟
P3OUT ^= BIT1;
}
通过示波器观察,端口,正平宽,显示大约12.4ms,明显是跑的是1.几M的内部时钟。也就是说16M的时钟没有 作为主时钟。但多次下载,有时显示的事 870us,表明16M正常了,但是很不稳定。
4、接着我使用这样的语句起振。
do
{
IFG1 &= ~OFIFG;
for (i=4000; i>0; i--);
}while ((IFG1 & OFIFG) !=0);
基本能保证每次起振。但是0.1%,的概率还是没有起振。
5、接着我用
BCSCTL1 &= ~XT2OFF;
do
{
IFG1 &= ~OFIFG;
for (i=4000; i>0; i--);
}while ((IFG1 & OFIFG) !=0);
for (i=4000; i>0; i--);
do
{
IFG1 &= ~OFIFG;
for (i=4000; i>0; i--);
}while ((IFG1 & OFIFG) !=0);
0.9ms的延迟 是准的。说明,16M的时钟作为了主时钟。
6、我的理解,MSP430外围电路肯定是好的,只要不用16M一点问题没有。而且用16M每次都能作为SMCLK,因为定时器,和UART波特率每次都是对了。这说明16M作为MCLK过程是和SMCLK不一样的。,MCLK需要更严格。所以延迟要更大,可能光延迟还不够。用经典的延迟 0XFF,基本不能让MCLK变成16M,用(5)的方法,我也不能保证每次都让MCLK为16M。
7、待解决
文章评论(0条评论)
登录后参与讨论