硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1774|回复: 2
收起左侧

[Clock] RT1052 如何使用内部 RC 振荡器充当时钟源

[复制链接]

9

主题

18

回帖

45

积分

新手上路

积分
45
发表于 2019-3-21 10:50:57 | 显示全部楼层 |阅读模式
我在 使用了 BOARD_BootClockRUN 函数后,用以下代码去切换内部晶振为,但是到了 切换函数这里后就失败了,程序直接死了,请问还有什么东西需要注意的吗?
  1. CLOCK_RCStart();
  2. CLOCK_InitRcOsc24M();
  3. CLOCK_SwitchOsc(kCLOCK_RcOsc);
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2019-3-21 12:42:01 | 显示全部楼层
帮顶下,好久不搞,还真不会了。
回复

使用道具 举报

9

主题

18

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-3-26 13:45:38 | 显示全部楼层
这个已经弄好了。作如下修改就可以了
  1. void BOARD_BootClockRUN(void)
  2. {
  3.     /* Enable 1MHz clock output. */
  4.     XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;
  5.     /* Use free 1MHz clock output. */
  6.     XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;
  7.     /* Set XTAL 24MHz clock frequency. */
  8.     CLOCK_SetXtalFreq(24000000U);
  9.     /* Enable XTAL 24MHz clock source. */
  10.     CLOCK_InitExternalClk(0);
  11.     /* Enable internal RC. */
  12.     CLOCK_InitRcOsc24M();

  13.     /* Configure self-tuning for RC OSC */
  14.     XTALOSC24M->OSC_CONFIG0 = XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG_CUR(0x4) | XTALOSC24M_OSC_CONFIG0_SET_HYST_MINUS(0x2) |
  15.                               XTALOSC24M_OSC_CONFIG0_RC_OSC_PROG(0xA7) |
  16.                               XTALOSC24M_OSC_CONFIG0_START_MASK | XTALOSC24M_OSC_CONFIG0_ENABLE_MASK;
  17.     XTALOSC24M->OSC_CONFIG1 = XTALOSC24M_OSC_CONFIG1_COUNT_RC_CUR(0x40) | XTALOSC24M_OSC_CONFIG1_COUNT_RC_TRG(0x2DC);
  18.     /* Set Oscillator ready counter value. */
  19.     CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);
  20.     /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
  21.     CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */
  22.     CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
  23.     /* Init ARM PLL. */
  24.     /* Bypass PLL first. */
  25.     CCM_ANALOG->PLL_ARM = (CCM_ANALOG->PLL_ARM & (~CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC_MASK)) |
  26.                           CCM_ANALOG_PLL_ARM_BYPASS_MASK | CCM_ANALOG_PLL_ARM_BYPASS_CLK_SRC(0);
  27.     CCM_ANALOG->PLL_ARM = (CCM_ANALOG->PLL_ARM & (~(CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK | CCM_ANALOG_PLL_ARM_POWERDOWN_MASK))) |
  28.                           CCM_ANALOG_PLL_ARM_ENABLE_MASK | CCM_ANALOG_PLL_ARM_DIV_SELECT(98);
  29.     while ((CCM_ANALOG->PLL_ARM & CCM_ANALOG_PLL_ARM_LOCK_MASK) == 0)
  30.     {
  31.     }
  32.     /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.
  33.      * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.
  34.      * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/
  35. #ifndef SKIP_SYSCLK_INIT
  36.     /* Init System PLL. */
  37.     /* Bypass PLL first. */
  38.     CCM_ANALOG->PLL_SYS = (CCM_ANALOG->PLL_SYS & (~CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC_MASK)) |
  39.                           CCM_ANALOG_PLL_SYS_BYPASS_MASK | CCM_ANALOG_PLL_SYS_BYPASS_CLK_SRC(0);
  40.     CCM_ANALOG->PLL_SYS = (CCM_ANALOG->PLL_SYS & (~(CCM_ANALOG_PLL_SYS_DIV_SELECT_MASK | CCM_ANALOG_PLL_SYS_POWERDOWN_MASK))) |
  41.                           CCM_ANALOG_PLL_SYS_ENABLE_MASK | CCM_ANALOG_PLL_SYS_DIV_SELECT(1);
  42.     while ((CCM_ANALOG->PLL_SYS & CCM_ANALOG_PLL_SYS_LOCK_MASK) == 0)
  43.     {
  44.     }
  45.     /* Init System pfd0. */
  46.     CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);
  47.     /* Init System pfd1. */
  48.     CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);
  49.     /* Init System pfd2. */
  50.     CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);
  51.     /* Init System pfd3. */
  52.     CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);
  53.     /* Disable pfd offset. */
  54.     CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_MASK;
  55. #endif
  56.     /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
  57.      * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.
  58.      * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/
  59. #if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
  60.     /* Set Usb1 PLL bypass clock source. */
  61.     CLOCK_SetPllBypassRefClkSrc(CCM_ANALOG, kCLOCK_PllUsb1, 0);
  62.     /* DeInit Usb1 PLL. */
  63.     CLOCK_DeinitUsb1Pll();
  64.     /* Bypass Usb1 PLL. */
  65.     CCM_ANALOG->PLL_USB1 |= CCM_ANALOG_PLL_USB1_BYPASS_MASK;
  66.     /* Enable Usb1 PLL output. */
  67.     CCM_ANALOG->PLL_USB1 |= CCM_ANALOG_PLL_USB1_ENABLE_MASK;
  68. #endif
  69.     /* Set Audio PLL bypass clock source. */
  70.     CLOCK_SetPllBypassRefClkSrc(CCM_ANALOG, kCLOCK_PllAudio, 0);
  71.     /* DeInit Audio PLL. */
  72.     CLOCK_DeinitAudioPll();
  73.     /* Bypass Audio PLL. */
  74.     CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_BYPASS_MASK;
  75.     CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;
  76.     CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;
  77.     /* Enable Audio PLL output. */
  78.     CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
  79.     /* Set Video PLL bypass clock source. */
  80.     CLOCK_SetPllBypassRefClkSrc(CCM_ANALOG, kCLOCK_PllVideo, 0);
  81.     /* DeInit Video PLL. */
  82.     CLOCK_DeinitVideoPll();
  83.     /* Bypass Video PLL. */
  84.     CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_BYPASS_MASK;
  85.     CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(0);
  86.     /* Enable Video PLL output. */
  87.     CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;
  88.     /* Init Enet PLL. */
  89.     uint32_t enet_pll = CCM_ANALOG_PLL_ENET_DIV_SELECT(1);
  90.     /* Bypass PLL first */
  91.     CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC_MASK)) |
  92.                            CCM_ANALOG_PLL_ENET_BYPASS_MASK | CCM_ANALOG_PLL_ENET_BYPASS_CLK_SRC(0);
  93.     enet_pll |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;
  94.     enet_pll |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;
  95.     CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~(CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK | CCM_ANALOG_PLL_ENET_POWERDOWN_MASK))) | enet_pll;
  96.     while ((CCM_ANALOG->PLL_ENET & CCM_ANALOG_PLL_ENET_LOCK_MASK) == 0)
  97.     {
  98.     }
  99.     /* Disable pfd offset. */
  100.     CCM_ANALOG->PLL_ENET &= ~CCM_ANALOG_PLL_ENET_PFD_OFFSET_EN_MASK;
  101.     /* Set Usb2 PLL bypass clock source. */
  102.     CLOCK_SetPllBypassRefClkSrc(CCM_ANALOG, kCLOCK_PllUsb2, 0);
  103.     /* DeInit Usb2 PLL. */
  104.     CLOCK_DeinitUsb2Pll();
  105.     /* Bypass Usb2 PLL. */
  106.     CCM_ANALOG->PLL_USB2 |= CCM_ANALOG_PLL_USB2_BYPASS_MASK;
  107.     /* Enable Usb2 PLL output. */
  108.     CCM_ANALOG->PLL_USB2 |= CCM_ANALOG_PLL_USB2_ENABLE_MASK;
  109.     /* Set AHB_PODF. */
  110.     CLOCK_SetDiv(kCLOCK_AhbDiv, 0);
  111.     /* Set IPG_PODF. */
  112.     CLOCK_SetDiv(kCLOCK_IpgDiv, 3);
  113.     /* Set ARM_PODF. */
  114.     CLOCK_SetDiv(kCLOCK_ArmDiv, 1);
  115.     /* Set preperiph clock source. */
  116.     CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
  117.     /* Set periph clock source. */
  118.     CLOCK_SetMux(kCLOCK_PeriphMux, 0);
  119.     /* Set PERIPH_CLK2_PODF. */
  120.     CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);
  121.     /* Set periph clock2 clock source. */
  122.     CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);
  123.     /* Set PERCLK_PODF. */
  124.     CLOCK_SetDiv(kCLOCK_PerclkDiv, 0);
  125.     /* Set per clock source. */
  126.     CLOCK_SetMux(kCLOCK_PerclkMux, 0);
  127.     /* Set USDHC1_PODF. */
  128.     CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);
  129.     /* Set Usdhc1 clock source. */
  130.     CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);
  131.     /* Set USDHC2_PODF. */
  132.     CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);
  133.     /* Set Usdhc2 clock source. */
  134.     CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);
  135.     /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.
  136.      * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.
  137.      * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/
  138. #ifndef SKIP_SYSCLK_INIT
  139.     /* Set SEMC_PODF. */
  140.     CLOCK_SetDiv(kCLOCK_SemcDiv, 2);
  141.     /* Set Semc alt clock source. */
  142.     CLOCK_SetMux(kCLOCK_SemcAltMux, 0);
  143.     /* Set Semc clock source. */
  144.     CLOCK_SetMux(kCLOCK_SemcMux, 0);
  145. #endif
  146.     /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
  147.      * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.
  148.      * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/
  149. #if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
  150.     /* Set FLEXSPI_PODF. */
  151.     CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);
  152.     /* Set Flexspi clock source. */
  153.     CLOCK_SetMux(kCLOCK_FlexspiMux, 0);
  154. #endif
  155.     /* Set CSI_PODF. */
  156.     CLOCK_SetDiv(kCLOCK_CsiDiv, 1);
  157.     /* Set Csi clock source. */
  158.     CLOCK_SetMux(kCLOCK_CsiMux, 0);
  159.     /* Set LPSPI_PODF. */
  160.     CLOCK_SetDiv(kCLOCK_LpspiDiv, 3);
  161.     /* Set Lpspi clock source. */
  162.     CLOCK_SetMux(kCLOCK_LpspiMux, 2);
  163.     /* Set TRACE_PODF. */
  164.     CLOCK_SetDiv(kCLOCK_TraceDiv, 3);
  165.     /* Set Trace clock source. */
  166.     CLOCK_SetMux(kCLOCK_TraceMux, 2);
  167.     /* Set SAI1_CLK_PRED. */
  168.     CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);
  169.     /* Set SAI1_CLK_PODF. */
  170.     CLOCK_SetDiv(kCLOCK_Sai1Div, 1);
  171.     /* Set Sai1 clock source. */
  172.     CLOCK_SetMux(kCLOCK_Sai1Mux, 0);
  173.     /* Set SAI2_CLK_PRED. */
  174.     CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);
  175.     /* Set SAI2_CLK_PODF. */
  176.     CLOCK_SetDiv(kCLOCK_Sai2Div, 1);
  177.     /* Set Sai2 clock source. */
  178.     CLOCK_SetMux(kCLOCK_Sai2Mux, 0);
  179.     /* Set SAI3_CLK_PRED. */
  180.     CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);
  181.     /* Set SAI3_CLK_PODF. */
  182.     CLOCK_SetDiv(kCLOCK_Sai3Div, 1);
  183.     /* Set Sai3 clock source. */
  184.     CLOCK_SetMux(kCLOCK_Sai3Mux, 0);
  185.     /* Set LPI2C_CLK_PODF. */
  186.     CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);
  187.     /* Set Lpi2c clock source. */
  188.     CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);
  189.     /* Set CAN_CLK_PODF. */
  190.     CLOCK_SetDiv(kCLOCK_CanDiv, 1);
  191.     /* Set Can clock source. */
  192.     CLOCK_SetMux(kCLOCK_CanMux, 2);
  193.     /* Set UART_CLK_PODF. */
  194.     CLOCK_SetDiv(kCLOCK_UartDiv, 0);
  195.     /* Set Uart clock source. */
  196.     CLOCK_SetMux(kCLOCK_UartMux, 0);
  197.     /* Set LCDIF_PRED. */
  198.     CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);
  199.     /* Set LCDIF_CLK_PODF. */
  200.     CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);
  201.     /* Set Lcdif pre clock source. */
  202.     CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);
  203.     /* Set SPDIF0_CLK_PRED. */
  204.     CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);
  205.     /* Set SPDIF0_CLK_PODF. */
  206.     CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);
  207.     /* Set Spdif clock source. */
  208.     CLOCK_SetMux(kCLOCK_SpdifMux, 3);
  209.     /* Set FLEXIO1_CLK_PRED. */
  210.     CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);
  211.     /* Set FLEXIO1_CLK_PODF. */
  212.     CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);
  213.     /* Set Flexio1 clock source. */
  214.     CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);
  215.     /* Set FLEXIO2_CLK_PRED. */
  216.     CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);
  217.     /* Set FLEXIO2_CLK_PODF. */
  218.     CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);
  219.     /* Set Flexio2 clock source. */
  220.     CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);
  221.     /* Set Pll3 sw clock source. */
  222.     CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);
  223.     /* Set lvds1 clock source. */
  224.     CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);
  225.     /* Set clock out1 divider. */
  226.     CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);
  227.     /* Set clock out1 source. */
  228.     CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);
  229.     /* Set clock out2 divider. */
  230.     CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);
  231.     /* Set clock out2 source. */
  232.     CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);
  233.     /* Set clock out1 drives clock out1. */
  234.     CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;
  235.     /* Disable clock out1. */
  236.     CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;
  237.     /* Disable clock out2. */
  238.     CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;
  239.     /* Set SystemCoreClock variable. */
  240.     SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
  241.             /* Switch clock source to internal RC. */
  242.     CLOCK_SwitchOsc(kCLOCK_RcOsc);
  243. }


复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 22:06 , Processed in 0.152811 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表