[技术问答] NUC029使用外部晶振无法起振是为什么?

[复制链接]
739|10
 楼主| jcky001 发表于 2023-6-16 11:40 | 显示全部楼层 |阅读模式
使用内部晶振程序是可以跑起来的,但是使用外部晶振,程序一直在等待,请问这是什么原因?(晶振使用的是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);
}
liu96jp 发表于 2023-6-25 15:58 | 显示全部楼层
问题似乎是在使用外部晶振时程序卡在了某个地方等待,而使用内部晶振时程序可以正常运行。这可能是由于外部晶振的连接不良或者外部晶振的频率不稳定导致的
d1ng2x 发表于 2023-6-25 17:08 | 显示全部楼层
你的晶振是无源晶振,而无源晶振需要外部电路才能提供时钟信号。如果外部电路没有正确连接或者设置不当,也可能导致程序无法正常运行
zhizia4f 发表于 2023-6-25 19:10 | 显示全部楼层
检查一下外部晶振的连接和电路设置吧
y1n9an 发表于 2023-6-25 20:21 | 显示全部楼层
外部晶振没起来呗,看看匹配电容
q1d0mnx 发表于 2023-6-25 21:15 | 显示全部楼层
一般是电容不匹配导致的外部晶振没起来,好好检查一下,看看电路
suw12q 发表于 2023-6-26 06:02 | 显示全部楼层
其实看通过官方推荐的晶振时钟电路就好了
p0gon9y 发表于 2023-6-26 07:16 | 显示全部楼层
等待说明时钟配置的不对的
t1ngus4 发表于 2023-6-26 08:25 | 显示全部楼层
话说,新唐是否有时钟配置工具啊?
b5z1giu 发表于 2023-6-26 10:04 | 显示全部楼层
你这个一般用无源的晶振就好了
l1uyn9b 发表于 2023-6-26 12:24 | 显示全部楼层
那你就先用内部的时钟运行吧,如果没有啥特殊的外设,好像不用外置时钟也是可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1650

主题

5706

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部