HC32F460 內部高速時鐘(HRC)的使用
阿新 • • 發佈:2022-04-11
HRC 時鐘
HRC時鐘訊號由內部高速振盪器生成,可直接用作系統時鐘,或者用作MPLL/UPLL輸入。HRC的頻率可由 ICG1. HRCFREQSEL配置成16MHz 或者 20MHz。
在前文中我們使用了xtal作為時鐘輸入,xtal精度高,但是需要使用外部晶振。既然HC32內部提供了數個時鐘,直接使用內部時鐘更方便。
輸入MPLL
HRC時鐘雖然可以直接提供時鐘,但是其最大僅有20Mhz,若想晶片最大頻率執行,還是需要MPLL分頻在倍頻使用。
配置程式碼如下,主要是修改了XTAL為HRC。
ClkHrcInit
/** ******************************************************************************* ** \brief Initialize Clock, use HRC. ** ** \param [in] None ** ** \retval None ** ******************************************************************************/ void ClkHrcInit(void) { stc_clk_mpll_cfg_t stcMpllCfg; en_clk_sys_source_t enSysClkSrc; stc_clk_sysclk_cfg_t stcSysClkCfg; MEM_ZERO_STRUCT(enSysClkSrc); MEM_ZERO_STRUCT(stcSysClkCfg); MEM_ZERO_STRUCT(stcMpllCfg); /* 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); /* Switch system clock source to MPLL. */ CLK_HrcCmd(Enable);//使能HRC時鐘 /* MPLL config. */ stcMpllCfg.pllmDiv = 16u; /* HRC 16M / 16=1M */ stcMpllCfg.plln = 400u; /* 4M*100 = 400M */ stcMpllCfg.PllpDiv = 2u; /* MLLP = 200M */ stcMpllCfg.PllqDiv = 2u; /* MLLQ = 200M */ stcMpllCfg.PllrDiv = 2u; /* MLLR = 200M */ CLK_SetPllSource(ClkPllSrcHRC); CLK_MpllConfig(&stcMpllCfg); /* flash read wait cycle setting */ EFM_Unlock(); EFM_SetLatency(EFM_LATENCY_4); EFM_Lock(); /* Enable MPLL. */ CLK_MpllCmd(Enable); /* Wait MPLL ready. */ while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy)) { } /* Switch system clock source to MPLL. */ CLK_SetSysClkSource(CLKSysSrcMPLL); }
配置HRC
HRC時鐘頻率為16Mhz或20Mhz,預設為16Mhz。如果要使用20Mhz的話,需要根據手冊要求,修改ICG1. HRCFREQSEL
SDK使用hc32f46x_icg.c
檔案配置該暫存器,因此在hc32f46x_icg.h
中修改定義即可。
在334-350行中定義了HRC。
/** ******************************************************************************* ** \brief HRC hardware start configuration ******************************************************************************/ /*!< Enable or disable HRC hardware start */ #define ICG1_HRC_HARDWARE_START (ICG_FUNCTION_OFF) /*!< HRC register config */ #define ICG1_HRC_FREQSEL (HRC_FREQUENCY_16MHZ) #define ICG1_HRC_STOP (HRC_OSCILLATION_START) /*!< HRC register config value */ #if ICG1_HRC_HARDWARE_START == ICG_FUNCTION_ON #define ICG1_HRC_REG_CONFIG (ICG1_HRC_FREQSEL | ICG1_HRC_STOP) #else #define ICG1_HRC_REG_CONFIG ((uint16_t)0xFFFF) #endif
預設HRC巨集定義是關閉的,需要修改ICG_FUNCTION_OFF
為ICG_FUNCTION_ON
來開啟,然後修改HRC_FREQUENCY_16MHZ
為·
HRC_FREQUENCY_20MHZ
即可切換到20Mhz。
然後修改分頻係數,執行,一切正常。
示波器抓下串列埠資料,穩定12.5Mhz
如果需要微調時鐘,可以在進行修改。
#if !defined (HRC_16MHz_VALUE) #define HRC_16MHz_VALUE ((uint32_t)16000000UL) /*!< Internal high speed RC freq.(16MHz) */ #endif #if !defined (HRC_20MHz_VALUE) #define HRC_20MHz_VALUE ((uint32_t)20000000UL) /*!< Internal high speed RC freq.(20MHz) */ #endif
甚至在這裡直接將16Mhz值修改為20Mhz,不進行ICG配置,也能以20Mhz頻率使用,串列埠也很穩,但是會產生什麼Bug就不清楚了。