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.

CC2541,外部晶振失败后,如何重启外部晶振



外部32.768khz晶振因焊接问题,导致外部晶振失效,重新焊好之后发现单片机并没有重新使用外部晶振,是否是进入了内部晶振模式?如何恢复呢?

非常感谢!

  • // set 32kHz OSC and wait until it is stable
    #define SET_32KHZ_OSC() \
    {                                                                              \
      CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ;                                 \
      while ( (CLKCONSTA & 0x80) != OSC_32KHZ );                                   \
    }

    默认是使用外部的32k晶振的,您可以重新烧录程序试试。

  • #define BV(n) (1 << (n))


    #define XOSC_STB BV(6) /* XOSC: powered, stable=1 */
    #define HFRC_STB BV(5) /* HFRCOSC: powered, stable=1 */
    /* CLKCONCMD bit definitions */
    #define OSC BV(6)
    #define TICKSPD(x) (x << 3)
    #define CLKSPD(x) (x << 0)
    #define CLKCONCMD_32MHZ (0)
    #define CLKCONCMD_16MHZ (CLKSPD(1) | TICKSPD(1) | OSC)
    #define OSC_PD BV(2) /* Idle Osc: powered down=1 */

    #define EXTERNAL_CRYSTAL_OSC 0x00 // external 32kHz XOSC
    #define INTERNAL_RC_OSC 0x80 // internal 32kHz RCOSC

    // For non-USB, assume external, unless an internal crystal is explicitly indicated.
    #define XOSC32K_INSTALLED TRUE //FALSE TRUE
    #if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == TRUE))
    #define OSC_32KHZ EXTERNAL_CRYSTAL_OSC 
    #else
    #define OSC_32KHZ INTERNAL_RC_OSC 
    #endif

    //START_HSOSC_XOSC
    SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */
    while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */

    //SET_OSC_TO_HSOSC
    CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ;
    while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ );

    //SET_32KHZ_OSC
    CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ;
    while ( (CLKCONSTA & 0x80) != OSC_32KHZ );

    //SET_OSC_TO_XOSC
    CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_32MHZ;
    while ( (CLKCONSTA & ~0x80) != CLKCONCMD_32MHZ );

    //STOP_HSOSC
    SLEEPCMD |= OSC_PD; /* stop 16MHz RCOSC */