系统时钟配置求解
例程版本:hc32f460_ddl_Rev2.1.0函数名:BSP_CLK_Init(void)
void BSP_CLK_Init(void)
{
stc_clk_sysclk_cfg_t stcSysClkCfg;
stc_clk_xtal_cfg_t stcXtalCfg;
stc_clk_mpll_cfg_t stcMpllCfg;
stc_sram_config_t stcSramConfig;
MEM_ZERO_STRUCT(stcSysClkCfg);
MEM_ZERO_STRUCT(stcXtalCfg);
MEM_ZERO_STRUCT(stcMpllCfg);
MEM_ZERO_STRUCT(stcSramConfig);
/* Set bus clk div. */
stcSysClkCfg.enHclkDiv= ClkSysclkDiv1;
stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;
stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;
stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;
stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;
stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;
stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;
CLK_SysClkConfig(&stcSysClkCfg);
/* Config Xtal and Enable Xtal */
stcXtalCfg.enMode = ClkXtalModeOsc;
stcXtalCfg.enDrv = ClkXtalLowDrv;
stcXtalCfg.enFastStartup = Enable;
CLK_XtalConfig(&stcXtalCfg);
CLK_XtalCmd(Enable);
/* 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();
/* MPLL config (XTAL / pllmDiv * plln / PllpDiv = 200M). */
stcMpllCfg.pllmDiv = 1ul;
stcMpllCfg.plln = 50ul;
stcMpllCfg.PllpDiv = 2ul;
stcMpllCfg.PllqDiv = 2ul;
stcMpllCfg.PllrDiv = 2ul;
CLK_SetPllSource(ClkPllSrcXTAL);
CLK_MpllConfig(&stcMpllCfg);
/* Enable MPLL. */
CLK_MpllCmd(Enable);
/* Wait MPLL ready. */
while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
{
;
}
/* Switch driver ability */
PWC_HS2HP();
/* Switch system clock source to MPLL. */
CLK_SetSysClkSource(CLKSysSrcMPLL);
}
遇到问题过程如下:
1、自己建立空白例程,开始并没有使用这个函数做时钟配置,程序正常跑。
2、各功能移植过程中,参照例程使用此函数初始化,发现程序会自动重启,屏蔽后又正常,此时屏蔽此函数,继续移植。(此时处理的是I2C做oled显示)
3、继续移植过程中,随着各功能增加,有回复此函数,程序正常,无重启。
求助:
对照用户手册,简单了解了时钟,还是不太清楚,这个的启动过程和配置,是否可以参照STM32的过程?或者,是否有专门针对这个时钟的详细说明文档?
自己顶一下~~ 结合ST的教程看看呢? 用这个例程你就需要外部挂一个8M的晶振,不然启动异常
或者你可以按照需求把外部晶振换成内部的16M晶振,再修改相应的代码也可以。
static void App_SysClkIni(void)
{
stc_clk_xtal_cfg_t stcXtalCfg;
stc_clk_mpll_cfg_t stcMpllCfg;
en_clk_sys_source_tenSysClkSrc;
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);
#if0
/* 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#defineICG1_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
} wubangmi 发表于 2021-10-9 17:24
用这个例程你就需要外部挂一个8M的晶振,不然启动异常
或者你可以按照需求把外部晶振换成内部的16M晶振,再 ...
我用的开发板,
看了下原理图,是8md
板子上焊接的丝印是T080~~~~
感谢解答,我慢慢对照你的代码,看看哪里有区别~· 时钟配置一直都比较米糊 这个是官方的例程吗 最快能达到多少啊 一定需要配置官方的开发板吗 自己建立空白工程是不是工作量比较大呢 wowu 发表于 2021-11-4 12:06
自己建立空白工程是不是工作量比较大呢
总要从空白工程来两次的,不然总是别人用过的
页:
[1]