This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我当前用于测试振荡器设置的代码如下:
int main(void) { WDT_A_hold(WDT_A_BASE); //Configure MCLOCK OUtput Pin GPIO_setAsPeripheralModuleFunctionOutputPin( GPIO_PORT_P3, GPIO_PIN0, GPIO_PRIMARY_MODULE_FUNCTION ); //Configure XIN and XOUT pins GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P2, GPIO_PIN7, GPIO_SECONDARY_MODULE_FUNCTION ); //Turn on bypass mode CS_bypassXT1(); //source MCLOCK from XT1 CS_initClockSignal(CS_MCLK,CS_XT1CLK_SELECT,CS_CLOCK_DIVIDER_1); //Clear flags after starting oscillator CS_clearAllOscFlagsWithTimeout(1000); while(1){ } }
运行时、此代码无法尝试调用 CS_bypassXT1()。 它停留在 cs.c 中的以下 while 语句上:
while (HWREG8(CS_BASE + OFS_CSCTL7) & (XT1OFFG)) { //Clear OSC fault flags HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG); // Clear the global fault flag. In case the XT1 caused the global fault // flag to get set this will clear the global error condition. If any // error condition persists, global flag will get again. HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG; }
如有任何帮助、将不胜感激
您是否尝试过寄存器级代码? 或者您能否在此处共享整个项目的 zip 文件?
我已经浏览了寄存器级别。 它似乎得到了一个振荡器故障标志、但我还无法找到关于原因的具体解释。
连接到 XIN 的外部时钟似乎遇到了一个非常类似的问题、这会导致 MSP 锁定。 最初我们认为在清除全局振荡器故障标志时 MSP 正在锁定。 但是、经过进一步调查、我们发现从内部 DCO (800kHz)切换到外部时钟时、MSP430FR2355会卡住。
MCU 可以保持此状态一段时间、我们观察到该行为与温度相关。 一段时间后、CPU 开始使用外部时钟正常工作。 外部时钟未中断、似乎不是问题的原因。
我们上周的帖子:MSP430FR2355:MCU 锁定、时钟问题?"
我认为您可能是对的。 "你是不是说你的孩子?"
while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG);
另外、我也无法重现您的温度问题。 我的温度循环它与一个不太优雅的冷冻喷雾和热枪,但它从来没有逃脱环路。
是的,我们也首先注意到使用冷冻喷雾和热风枪的行为。 然后、我们将硬件放入温度室中。
我们还尝试了以下方法:可以在引脚上启用 MCLK 输出。 在正常运行中、您应该首先看到频率为800kHz 左右的内部时钟、然后应该切换到外部时钟。 但在本例中、有时会发生切换、有时不会发生切换。
要测试我们的代码是否卡在振荡器故障 while
环路中:
do { GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1); //Clear XT1 and DCO fault flags HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG | DCOFFG); // Clear the global fault flag. In case the XT1 caused the global fault // flag to get set this will clear the global error condition. If any // error condition persists, global flag will get again. HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG; GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN1); } while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG); // Test oscillator fault flag
我们只需使用 GPIO 引脚并已将其切换。
要将 MCLK 重新路由至输出引脚、可以使用以下代码:
P2SEL0 |= BIT6; // Select P2.6 as MCLK out P2SEL1 &= ~(BIT6); // Select P2.6 as MCLK out // Output MCLK on P2.6 P2DIR |= BIT6; // Configure P2.6 as output direction pin
在示波器上观察信号波形时、我们会看到代码卡在需要从内部800kHz 时钟切换到24MHz 外部时钟的点。 此问题会持续一段时间、然后才能恢复正常运行。
此时:
CSCTL4 = SELMS__XT1CLK | SELA__REFOCLK;
代码卡住时示波器的图像:
如果您使用热风枪对 MCU 加热一点点、或者只是让器件预热、它从它卡住的点开始正常工作
MCU 有时会卡住、而在其他情况下、它在复位后可以正常工作。 这是一切正常运行时示波器的波形、我们可以看到 MCLK 波形从800kHz 变为24 MHz
毫无疑问、TI 专家应介入并就您和我们的行为提供反馈。 在本例中、我们无法解释为什么会发生这种情况、为什么它会卡住一段时间、然后开始再次工作、但不会自行复位。 或许 GPIO 引脚可以帮助您识别它卡住的位置、这可能是一个很好的故障排除技巧。
myside 的几条评论:
1.您能帮助捕捉时钟信号捕获,以确保质量好吗?
2.您可以尝试此代码、我已使用5.333MHz 信号输入(由 LP-MSPM0G3507生成、从计时器的 PWM 输出来看占空比为57%)对其进行了验证、MSP430FR2355没有问题