[技术问答] 系统时钟配置求解

[复制链接]
 楼主| kiwis66 发表于 2021-10-4 10:20 | 显示全部楼层 |阅读模式
例程版本:hc32f460_ddl_Rev2.1.0
函数名:BSP_CLK_Init(void)

  1. void BSP_CLK_Init(void)
  2. {
  3.     stc_clk_sysclk_cfg_t    stcSysClkCfg;
  4.     stc_clk_xtal_cfg_t      stcXtalCfg;
  5.     stc_clk_mpll_cfg_t      stcMpllCfg;
  6.     stc_sram_config_t       stcSramConfig;

  7.     MEM_ZERO_STRUCT(stcSysClkCfg);
  8.     MEM_ZERO_STRUCT(stcXtalCfg);
  9.     MEM_ZERO_STRUCT(stcMpllCfg);
  10.     MEM_ZERO_STRUCT(stcSramConfig);

  11.     /* Set bus clk div. */
  12.     stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;
  13.     stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;
  14.     stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;
  15.     stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;
  16.     stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;
  17.     stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;
  18.     stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;
  19.     CLK_SysClkConfig(&stcSysClkCfg);

  20.     /* Config Xtal and Enable Xtal */
  21.     stcXtalCfg.enMode = ClkXtalModeOsc;
  22.     stcXtalCfg.enDrv = ClkXtalLowDrv;
  23.     stcXtalCfg.enFastStartup = Enable;
  24.     CLK_XtalConfig(&stcXtalCfg);
  25.     CLK_XtalCmd(Enable);

  26.     /* sram init include read/write wait cycle setting */
  27.     stcSramConfig.u8SramIdx = Sram12Idx | Sram3Idx | SramHsIdx | SramRetIdx;
  28.     stcSramConfig.enSramRC = SramCycle2;
  29.     stcSramConfig.enSramWC = SramCycle2;
  30.     SRAM_Init(&stcSramConfig);

  31.     /* flash read wait cycle setting */
  32.     EFM_Unlock();
  33.     EFM_SetLatency(EFM_LATENCY_5);
  34.     EFM_Lock();

  35.     /* MPLL config (XTAL / pllmDiv * plln / PllpDiv = 200M). */
  36.     stcMpllCfg.pllmDiv = 1ul;
  37.     stcMpllCfg.plln    = 50ul;
  38.     stcMpllCfg.PllpDiv = 2ul;
  39.     stcMpllCfg.PllqDiv = 2ul;
  40.     stcMpllCfg.PllrDiv = 2ul;
  41.     CLK_SetPllSource(ClkPllSrcXTAL);
  42.     CLK_MpllConfig(&stcMpllCfg);

  43.     /* Enable MPLL. */
  44.     CLK_MpllCmd(Enable);
  45.     /* Wait MPLL ready. */
  46.     while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
  47.     {
  48.         ;
  49.     }
  50.     /* Switch driver ability */
  51.     PWC_HS2HP();
  52.     /* Switch system clock source to MPLL. */
  53.     CLK_SetSysClkSource(CLKSysSrcMPLL);
  54. }


遇到问题过程如下:
1、自己建立空白例程,开始并没有使用这个函数做时钟配置,程序正常跑。
2、各功能移植过程中,参照例程使用此函数初始化,发现程序会自动重启,屏蔽后又正常,此时屏蔽此函数,继续移植。(此时处理的是I2C做oled显示)
3、继续移植过程中,随着各功能增加,有回复此函数,程序正常,无重启。

求助:
对照用户手册,简单了解了时钟,还是不太清楚,这个的启动过程和配置,是否可以参照STM32的过程?或者,是否有专门针对这个时钟的详细说明文档?
 楼主| kiwis66 发表于 2021-10-8 09:35 | 显示全部楼层
自己顶一下~~
asmine 发表于 2021-10-9 16:28 | 显示全部楼层
结合ST的教程看看呢?
wubangmi 发表于 2021-10-9 17:24 | 显示全部楼层
用这个例程你就需要外部挂一个8M的晶振,不然启动异常
或者你可以按照需求把外部晶振换成内部的16M晶振,再修改相应的代码也可以。
static void App_SysClkIni(void)
{
    stc_clk_xtal_cfg_t   stcXtalCfg;
    stc_clk_mpll_cfg_t   stcMpllCfg;
    en_clk_sys_source_t  enSysClkSrc;
    stc_clk_sysclk_cfg_t stcSysClkCfg;
    stc_clk_freq_t       stcClkFreq;
    stc_sram_config_t    stcSramConfig;

    MEM_ZERO_STRUCT(enSysClkSrc);
    MEM_ZERO_STRUCT(stcSysClkCfg);
    MEM_ZERO_STRUCT(stcXtalCfg);
    MEM_ZERO_STRUCT(stcMpllCfg);
    MEM_ZERO_STRUCT(stcClkFreq);
    MEM_ZERO_STRUCT(stcSramConfig);
#if 0
    App_Xtal32_ClockConfig();                     ///<   External XTAL32 configure and enable
#else
    CLK_LrcCmd(Enable);                           ///<   internal XTAL32 Enable
#endif
    /* Set bus clk div. */
    stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  /* Max 200MHz */
    stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  /* Max 100MHz */
    stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  /* Max 200MHz */
    stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  /* Max 100MHz */
    stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  /* Max 50MHz */
    stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  /* Max 50MHz */
    stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  /* Max 100MHz */
    CLK_SysClkConfig(&stcSysClkCfg);
#if  0
    /* Switch system clock source to MPLL. */
    /* Use Xtal as MPLL source. */
    stcXtalCfg.enMode = ClkXtalModeOsc;
    stcXtalCfg.enDrv = ClkXtalLowDrv;
    stcXtalCfg.enFastStartup = Enable;
    CLK_XtalConfig(&stcXtalCfg);
    CLK_XtalCmd(Enable);

    /* MPLL config. */
    stcMpllCfg.pllmDiv = 1ul;                  ///<  extern Xtal is 8MHZ
    stcMpllCfg.plln    = 36ul;                 ///<  MPLL=8*36=288Mhz,PLL max is 400Mhz
    stcMpllCfg.PllpDiv = 4ul;                  ///<  MPLLP=MPLL/4 = 288Mhz/4=72Mhz
    stcMpllCfg.PllqDiv = 4ul;                  ///<  MPLLQ=MPLL/4 = 288Mhz/4=72Mhz
    stcMpllCfg.PllrDiv = 4ul;                  ///<  MPLLR=MPLL/4 = 288Mhz/4=72Mhz
    CLK_SetPllSource(ClkPllSrcXTAL);
    CLK_MpllConfig(&stcMpllCfg);
#else
    /* Use HRC as MPLL source. Config HRC*/
    /* Modify hc32f46x_icg.h Enable ICG1_HRC_HARDWARE_START for HRC*/   ///<
    CLK_HrcTrim(0);                            ///<   HRC Trim,HRC 16Mhz,default ICG1=0xFFFFFFFF,if modify default need to ICG.H  #define  ICG1_HRC_HARDWARE_START  (ICG_FUNCTION_ON)
    CLK_HrcCmd(Enable);
   
    /* MPLL config. */
    stcMpllCfg.pllmDiv = 2ul;                  ///<  Input clk source DIV,(Internal HRC is 16Mhz),2-1=1,DIV2
    stcMpllCfg.plln    = 50ul;                 ///<  Input clk source multiplication,MPLL=8*50=400Mhz,PLL max is 400Mhz
    stcMpllCfg.PllpDiv = 2ul;                  ///<  MPLLP Div 2,MPLLP Freq=MPLL/2 = 400Mhz/2=200Mhz
    stcMpllCfg.PllqDiv = 2ul;                  ///<  MPLLQ Div 2,MPLLQ Freq=MPLL/2 = 400Mhz/2=200Mhz
    stcMpllCfg.PllrDiv = 2ul;                  ///<  MPLLR Div 2,MPLLR Freq=MPLL/2 = 400Mhz/2=200Mhz
    CLK_SetPllSource(ClkPllSrcHRC);
    CLK_MpllConfig(&stcMpllCfg);
#endif   
    /* sram init include read/write wait cycle setting */
    stcSramConfig.u8SramIdx = Sram12Idx | Sram3Idx | SramHsIdx | SramRetIdx;
    stcSramConfig.enSramRC  = SramCycle2;
    stcSramConfig.enSramWC  = SramCycle2;
    SRAM_Init(&stcSramConfig);
    /* flash read wait cycle setting */
    EFM_Unlock();
    EFM_SetLatency(EFM_LATENCY_5);
    EFM_Lock();

    /* Enable MPLL. */
    CLK_MpllCmd(Enable);
    /* Wait MPLL ready. */
    while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
    {
      ;
    }
    PWC_HS2HP();
    /* Switch system clock source to MPLL. */
    CLK_SetSysClkSource(CLKSysSrcMPLL);
    CLK_GetClockFreq(&stcClkFreq);              ///<  Get HCLK pclk Value
}
 楼主| kiwis66 发表于 2021-10-14 13:28 | 显示全部楼层
wubangmi 发表于 2021-10-9 17:24
用这个例程你就需要外部挂一个8M的晶振,不然启动异常
或者你可以按照需求把外部晶振换成内部的16M晶振,再 ...

我用的开发板,
看了下原理图,是8md
板子上焊接的丝印是T080~~~~

感谢解答,我慢慢对照你的代码,看看哪里有区别~·
paotangsan 发表于 2021-11-4 12:02 | 显示全部楼层
时钟配置一直都比较米糊
xiaoqizi 发表于 2021-11-4 12:02 | 显示全部楼层
这个是官方的例程吗
labasi 发表于 2021-11-4 12:05 | 显示全部楼层
最快能达到多少啊
木木guainv 发表于 2021-11-4 12:06 | 显示全部楼层
一定需要配置官方的开发板吗
wowu 发表于 2021-11-4 12:06 | 显示全部楼层
自己建立空白工程是不是工作量比较大呢
 楼主| kiwis66 发表于 2021-11-6 10:33 | 显示全部楼层
wowu 发表于 2021-11-4 12:06
自己建立空白工程是不是工作量比较大呢

总要从空白工程来两次的,不然总是别人用过的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

1183

帖子

2

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

189

主题

1183

帖子

2

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