最近在学习华大的HC32F460单片机,学习单片机就不得不说说单片机的运行时钟,华大这款单片机的时钟有很多的时钟总线,外设都是挂载在时钟线上运行的,
HC32F460的时钟其实就是片内时钟和片外时钟两种
片内时钟有三种:
1.HRC 片内高速时钟
2.MRC 片内中速时钟
3.LRC 片内低速时钟
片外时钟有两种:
1.XTAL 片外高速时钟
2.XTAL32 片外低速时钟
在HC32F460的简介里说了他的时钟工作频率
如下图所示
但是这个怎么配置呢?在用户手册里的开始就有介绍,但是不清晰,我重新整理了一下
这张表内就把他说的AHB总线和APB总线时钟在内部是怎么分配的介绍清除了,不明白的同学可以查看用户手册
外设挂在哪个总线上清晰了,那怎么配置时钟是多少合适呢?
有两个方法可以参考,第一参考用户手册,第二参考厂家给的例程
先说用户手册看哪里,给大家一个表
大家在配置的时候可以根据这个表来配置时钟频率
刚才也说了有第二种方法来配置,怎么配置呢?
大家看下面这个代码,是我自己根据官方给的例程来进行注释说明的,具体如下
static void SysClkConfig(void)
{
stc_clk_sysclk_cfg_t stcSysClkCfg;
stc_clk_xtal_cfg_t stcXtalCfg;
stc_clk_mpll_cfg_t stcMpllCfg;
MEM_ZERO_STRUCT(stcSysClkCfg);
MEM_ZERO_STRUCT(stcXtalCfg);
MEM_ZERO_STRUCT(stcMpllCfg);
/* Set bus clk div. */
stcSysClkCfg.enHclkDiv = ClkSysclkDiv1; // 100MHz
stcSysClkCfg.enExclkDiv = ClkSysclkDiv2; // 50MHz
stcSysClkCfg.enPclk0Div = ClkSysclkDiv1; // 100MHz
stcSysClkCfg.enPclk1Div = ClkSysclkDiv2; // 50MHz
stcSysClkCfg.enPclk2Div = ClkSysclkDiv4; // 25MHz
stcSysClkCfg.enPclk3Div = ClkSysclkDiv4; // 25MHz
stcSysClkCfg.enPclk4Div = ClkSysclkDiv2; // 50MHz
CLK_SysClkConfig(&stcSysClkCfg);//时钟分频
/* Switch system clock source to MPLL. */
/* Use Xtal as MPLL source. */
stcXtalCfg.enMode = ClkXtalModeOsc;//XTAL模式选择位 0:振荡器模式 1:外部时钟输入模式
stcXtalCfg.enDrv = ClkXtalLowDrv;/*XTAL驱动能力选择 00:高驱动能力(建议20~24MHz晶振)
01:中驱动能力(建议16~20MHz晶振)
10:小驱动能力(建议8~16MHz晶振)
11:超小驱动能力(建议4~8MHz晶振)*/
stcXtalCfg.enFastStartup = Enable;//XTAL超高速驱动允许 0:禁止超高速驱动 1:允许超高速驱动 超高速驱动允许时,XTAL稳定后,无视此位设定,禁止超高速驱动,降低功耗。
CLK_XtalConfig(&stcXtalCfg);//CMU XTAL 配置寄存器
CLK_XtalCmd(Enable);//开启CMU XTAL 控制寄存器的XTALSTP位 0:XTAL振荡器振荡 1:停止振荡
/* MPLL config. */
stcMpllCfg.pllmDiv = 1ul;//MPLL输入时钟分频系数
stcMpllCfg.plln =50ul;//MPLL倍频系数
stcMpllCfg.PllpDiv = 4ul;
stcMpllCfg.PllqDiv = 4ul;
stcMpllCfg.PllrDiv = 4ul;
CLK_SetPllSource(ClkPllSrcXTAL);//CMU MPLL 配置 寄存器的时钟源选择
/*MPLL/UPLL输入时钟源选择
0:选择外部高速振荡器作为MPLL/UPLL的输入时钟
1:选择内部高速振荡器作为MPLL/UPLL的输入时钟*/
CLK_MpllConfig(&stcMpllCfg);//CMU MPLL 配置 寄存器 时钟分频配置
/* flash read wait cycle setting */
EFM_Unlock();
EFM_SetLatency(5ul);
EFM_Lock();
/* Enable MPLL. */
CLK_MpllCmd(Enable);//用于开始停止MPLL。0:MPLL动作开始 1:MPLL停止
/* Wait MPLL ready. */
while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
{
;
}
/* Switch system clock source to MPLL. */
CLK_SetSysClkSource(CLKSysSrcMPLL);//CMU 系统时钟源切换寄存器
/* 0 0 0:选择HRC时钟作为系统时钟 内部高速
0 0 1:选择MRC时钟作为系统时钟 内部中速
0 1 0:选择LRC时钟作为系统时钟 内部低速
0 1 1:选择XTAL时钟作为系统时钟 外部高速
1 0 0:选择XTAL32时钟作为系统时钟 外部低速
1 0 1:选择MPLL作为系统时钟 倍频
1 1 0:禁止设定
1 1 1:禁止设定*/
}
---------------------
作者:binoo7
链接:https://bbs.21ic.com/icview-3068836-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。