“线程:测试”中讨论的其它部件
我的项目有时会在我的项目开始时退出程序代码。
经过多次测试,它似乎与振荡器有关。
void OSC_Init(void)
{
P5SEL |= BIT2 + BIT3; // P5.2,3 = XT2IN and XT2OUT
UCSCTL6 &= ~XT2OFF;
UCSCTL3 |= SELREF__REFOCLK;
UCSCTL4 |= SELA__REFOCLK;
// __bis_SR_register(SCG0); // Disable the FLL control loop
// UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
// UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
// UCSCTL2 = FLLD_1 + 390; // Set DCO Multiplier for 8MHz
// // (N + 1) * FLLRef = Fdco
// // (390 + 1) * 32768 = 12.8MHz
// // Set FLL Div = fDCOCLK/2
// __bic_SR_register(SCG0); // Enable the FLL control loop
// __delay_cycles(400000);
// Loop until XT1,XT2 & DCO stabilizes
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
// UCSCTL6 &= XT2DRIVE1; // Decrease XT2 Drive according to
// expected frequency
UCSCTL4 |= SELS__XT2CLK + SELM__XT2CLK; // SMCLK=MCLK=XT2
UCS_setExternalClockSource(XT1_CLK, XT2_CLK);
}这是发生错误时我的原始代码。
我正在尝试使用 XT2外置晶体生成12.8MHz 时钟。

我尝试检查示波器上的 SMCLK,这是程序运行正常时捕获的内容

但是,当错误发生且程序已超出程序顺序时,SMCLK 就会捕获这种情况。
我从 MSP430x5xx 和 MSP430x6xx 系列用户指南中了解到,当我将 UCSCTL4设置为选择 XT2作为 SMCLK 时,它将在 XT2可用时选择它,否则将选择 DCOCLKDIV。
我怀疑 DCOCLK 是在发生错误时被使用的,因为偶尔,当错误发生时,我可以在示波器上看到1MHz 的波形。
因此,我尝试添加逻辑来配置 DCOCLK 频率,如上载代码的注释部分所示。
我添加了这一逻辑后,错误似乎消失了。 (我尝试重置程序100次以上,但没有发生。 通常在20次内发生)
我也尝试了没有 DCOCLK 配置的情况,但将__delay_cycles (400000)留在代码中,错误似乎也消失了。 这让我感到奇怪的是,在 XT2稳定使用之前清除 XT2OFF 后是否需要一定的延迟? 如果没有 DELAY_CYCLES,当我尝试选择 XT2作为 SMCLK 源时,XT2有时不可用,这是什么原因? 我想在这里的论坛上核实我的怀疑。
如果确实需要延迟,我应该实际延迟多长时间? 我在测试期间只使用了40000个周期 ,因为这是我在配置 DCOCLK 时使用的周期数,我只是重复使用了该代码行。 但是,清除 XT2OFF 后所需的周期数的正确估计值是多少(如果需要)?
此外,我认为在代码中的 DO while 循环后,XT2应该是稳定的? 这是从 msp430x54xA_UCS_8示例代码中获取的。 因此,我也想澄清我在这个岗位上的疑虑
谢谢