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.
软件清LFXTOFFG时,会导致单片机重启,我在用户手册上没有找到相关解释,是正常现象吗?如果是正常现象,能否避免软件清LFXTOFFG时,单片机重启呢?
CSCTL5 &= ~(LFXTOFFG);
外部32768晶振遇到在设备组装时可能会受到轻微挤压导致,32768晶振瞬间故障,但是挤压过后又会恢复震荡,因为我的ACLK用的是外部的32768,单片机用户手册说,当外部晶振故障时会自动置位LFXTOFFG,并且自动切换到MODCLK代替32768供给ACLK,LFXTOFFG需要软件清除才会从MODCLK切回到32768。但是一执行CSCTL5 &= ~(LFXTOFFG);语句后单片机就自动重启一次。后来实验发现就算LFXTOFFG没置位,执行CSCTL5 &= ~(LFXTOFFG);也会重启一次。
CSCTL0_H = CSKEY >> 8;
CSCTL1 = DCOFSEL_1;
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;
CSCTL4 = 0;
CSCTL4 |= VLOOFF + SMCLKOFF + HFXTOFF;
do
{
CSCTL5 &= ~(LFXTOFFG+ HFXTOFFG);//
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG);
CSCTL5 &= ~(ENSTFCNT1 + ENSTFCNT2);
CSCTL6 &=~( ACLKREQEN|MCLKREQEN|SMCLKREQEN);
CSCTL0_H = 0;
这是我的时钟配置,MCLK是用的DCOCLK,您要我在什么情况下,是把LFXTCLK输出吗?
谢谢您的反馈。
请您试一下下面的代码能否正常运行,而不会复位
/* --COPYRIGHT--,BSD_EX * Copyright (c) 2014, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************* * * MSP430 CODE EXAMPLE DISCLAIMER * * MSP430 code examples are self-contained low-level programs that typically * demonstrate a single peripheral function or device feature in a highly * concise manner. For this the code may rely on the device's power-on default * register values and settings such as the clock configuration and care must * be taken when combining code from several examples to avoid potential side * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware * for an API functional library-approach to peripheral configuration. * * --/COPYRIGHT--*/ //****************************************************************************** // MSP430FR6x7x Demo - Output 32768Hz crystal on XT1 and observe failsafe // // Description: Configure ACLK = LFXT1 and enter LPM3. // To observe failsafe behavior short the crystal briefly on the target board. // This will cause an NMI to occur. P1.0 is toggled inside the NMI ISR. // Once the fault flag is cleared XT1 operation continues from 32768Hz crystal // Otherwise ACLK defaults to LFMODCLK (~37.5KHz). // ACLK = LFXT1 = 32kHz, MCLK = SMCLK = 1MHz // // MSP430FR6972 // --------------- // /|\| XIN|- // | | | 32KHz Crystal // --|RST XOUT|- // | | // | PJ.2|---> ACLK = 32.768kHz (or 37.5kHz during LFXTOFFG) // | P7.4|---> SMCLK = MCLK = 1MHz // | P1.0|---> LED // // Andreas Dannenberg // Texas Instruments Inc. // September 2014 // Built with IAR Embedded Workbench V5.60 & Code Composer Studio V6.0 //****************************************************************************** #include <msp430.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // GPIO Setup P1OUT = 0; P1DIR = BIT0; // For LED PJDIR |= BIT2; PJSEL0 |= BIT2; // Output ACLK PJSEL1 &= ~BIT2; P7DIR |= BIT4; P7SEL0 |= BIT4; P7SEL1 |= BIT4; // Output SMCLK PJSEL0 |= BIT4 | BIT5; // For XT1 // Disable the GPIO power-on default high-impedance mode to activate // previously configured port settings PM5CTL0 &= ~LOCKLPM5; // Clock System Setup CSCTL0_H = CSKEY >> 8; // Unlock CS registers CSCTL1 = DCOFSEL_0; // Set DCO to 1MHz CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK; CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers CSCTL4 &= ~LFXTOFF; do { CSCTL5 &= ~LFXTOFFG; // Clear XT1 fault flag SFRIFG1 &= ~OFIFG; }while (SFRIFG1&OFIFG); // Test oscillator fault flag // Now that osc is running enable fault interrupt SFRIE1 |= OFIE; __bis_SR_register(LPM0_bits); // Wait in LPM0 for fault flag } #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=UNMI_VECTOR __interrupt void UNMI_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(UNMI_VECTOR))) UNMI_ISR (void) #else #error Compiler not supported! #endif { do { // set a breakpoint on the line below to observe XT1 operating from VLO // when the breakpoint is hit during a crystal fault CSCTL5 &= ~LFXTOFFG; // Clear XT1 fault flag SFRIFG1 &= ~OFIFG; P1OUT |= BIT0; __delay_cycles(25000); // time for flag to get set again }while (SFRIFG1&OFIFG); // Test oscillator fault flag P1OUT &= ~BIT0; }
上午又做实验应该是找到原因了
我的时钟初始化代码中
第一条语句解锁,然后最后一条又相当于锁了时钟的寄存器,手册里边说的是,
CSKEY password. Must always be written with A5h; a PUC is generated if any other value is written. Always reads as 96h. After the correct password is written, all CS registers are available for writing. |
相当于我再后边的程序没有解锁,直接这样写CSCTL5 &= ~(LFXTOFFG);,导致了一个PUC,所以只要执行这个就复位。
后来改了一下清LFXTOFFG的后边程序的代码
CSCTL0_H = CSKEY >> 8;
do
{
CSCTL5 &= ~(LFXTOFFG+ HFXTOFFG);//
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG);
CSCTL0_H = 0;
这样就OK了,不重启
再次感谢您抽时间给我解答问题,没有您的帮助我还不知道啥时候能找出问题所在,谢谢!!!!!