单片机学习小组
直播中

神之小风

12年用户 803经验值
私信 关注

NUC029使用外部晶振无法起振是为什么?

使用内部晶振程序是可以跑起来的,但是使用外部晶振,程序一直在等待,请问这是什么原因?(晶振使用的是12M无源晶振,不知道是不是有源无源的问题)


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

    /* Waiting for Internal RC clock ready */
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk));

    /* Switch HCLK clock source to Internal RC */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;

    /* Enable external XTAL 12MHz clock */
    CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk;

    /* Waiting for external XTAL clock ready */
//死在这里!!
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK->PLLCON = PLLCON_SETTING;
    while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB_Msk));
    CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLK_S_Msk);
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_PLL;

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 1;        // HCLK
    CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

    /* Enable UART module clock */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk | CLK_APBCLK_I2C0_EN_Msk;

    /* Select UART module clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
    CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set P3 multi-function pins for UART0 RXD and TXD, and set P3.4 and P3.5 for I2C0 SDA and SCL */
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk | SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0 | SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0);
}




回帖(1)

王璐

2024-4-1 18:32:48
sp;       */    /*---------------------------------------------------------------------------------------------------------*/    /* Unlock protected registers */    SYS_UnlockReg();    /* Enable HIRC clock (internal 22.1184MHz) */    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);    /* Waiting for HIRC clock ready */    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);    /* 选择外部晶振模式 */    CLK_SetHXT(CLK_CLKSEL0_HXTSEL_HXT, CLK_CLKDIV0_HXT(1));    /* Waiting for clock ready */    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);    /* HCLK clock source. */    CLK_SetCoreClock(FREQ_36MHZ);    /* Enable peripheral clock */    CLK_EnableModuleClock(UART0_MODULE);    /* Disable PLL first to avoid unstable when setting PLL */    CLK_DisablePLL();    /* Configure PLL frequency */    CLK_SetPLL(CLK_PLLCTL_PLLSRC_HXT, CLK_PLLCTL_PLLDIV(3), CLK_PLLCTL_MUL3);    /* Waiting for PLL ready */    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);    /* Set HCLK clock */    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(1));    /* Set PCLK0/PCLK1 clock */    CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01SEL_HXT, 0);    CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23SEL_HXT, 0);    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);    CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1SEL_HXT, 0);    CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL1_TMR2SEL_HXT, 0);    CLK_SetModuleClock(TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_HXT, 0);    /* Enable PLL */    CLK_EnablePLL();    /* Waiting for PLL ready */    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);    /* Lock protected registers */    SYS_LockReg();}

无法使用外部晶振可能有以下原因:

1. 晶振没有正确连接至芯片。

2. 晶振的频率不正确。

3. 用户程序没有执行正确的初始化代码。

4. 晶振是有源晶振,但没有正确的供电。

通过上述代码可以看出,程序已经完成了对外部晶振的初始化设置。如果以上情况都排除,还无法使用外部晶振,可以考虑更换晶振或者与芯片厂商联系。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分