大家好
我有一个定制设计的主板,没有LF晶体和16MHz HF晶体。 按照示例配置HF晶体时,MCU将重置。 当我在1MHz或8MHz使用DCO时,它可以正常工作,没有任何重置,但是OFIFG和LFXTOFFG标志已设置。 初始化时钟的代码如下:
void gLCO_ClocksInit()
{
/*禁用GPIO开机默认高阻抗模式以激活
*以前配置的端口设置。 */
PM5CTL0 &=~LOCKLPM2;
/*选择HFX功能。 */
PJSEL0 ||(BIT6 | BIT7);
/*解锁CS寄存器。 */
CSCTL0_H = CSOKEY >> 8;
/*将DCO设置为1MHz,因此使用时很明显。 */
CSCTL1 = DCOFSEL_0;
/*将ACLK设置为内部低频率生成器以及MCLK和SMCLK
*到晶体。 */
CSCTL2 =拉美经济体系_ LFMODCLK | STELS_ HFXTCLK | SELM_ HFXTCLK;
/* LFx旋转。 */
CSCTL4 |= LFXTOFF;
/*将晶体和频率的最大驱动器功率设置为8-16MHz。 */
CSCTL4 ||(HFXTDRIVE_3| HFFREQ_2);
/*清除LFx故障标志,因为它将在切换到之前设置
* LFMODCLK*/
CSCTL5 &=~LFxTOFFG;
/*将所有分禾器设置为1。 */
CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;
/*启用HFX晶体。 */
CSCTL4 &=~HFXTOFF;
/*等待晶体稳定下来。 */
做
{
/*清除故障标志。 */
CSCTL5 &=~HFXTOFFG;
SFRIFG1 &=~OFIFG;
}
同时(SFRIFG1和OFIFG);
CSCTL0_H = 0;
}
从实验中看,在调用“SFRIFG1 & OFIFG”后,它似乎重置。 例如,如果我将while循环代码更改为:
/*等待晶体稳定下来。 */ 做 { /*清除故障标志。 */ CSCTL5 &=~HFXTOFFG; } 同时(CSCTL5和HFXTOFFG);
如果以后使用调试器检查寄存器,则HFXTOFFG 和LFxTOFFG标志都将保持清除状态。 问题在于OFIFG错误标志仍然保持设置。 我猜这个问题与SLAU367M (此MSP用户指南)第92页上的说明有关:
故障逻辑
只要故障状况仍然存在,OFIFG将保持设置。 应用程序必须执行
清除OFIFG信号时要特别小心。 如果OFIFG时没有故障状态
信号被清除,时钟逻辑将切换回故障前的原始用户设置
条件。
但是我不明白你应该如何在不造成竞争状况的情况下清除故障和OFIFG。 即OFIFG的状态取决于HFXTOFFG和LFXTOFFG,因此您需要先清除它们,然后再清除OFIFG。 但是,如果 您清除HFXTOFFG和LFxTOFFG后不再出现故障,则时钟逻辑是否会切换回? 那么,如何正确清除所有错误标志?
(附注 切换LED时,__delay_cycles (800万)似乎也会产生大约2秒的延迟。 我希望每运行16MHz的0.5 秒都会切换此设置,所以我猜还有其他配置可能会丢失?)
如有任何帮助,我们将不胜感激。
谢谢
-Wynand