1. 程式人生 > 其它 >HC32F460 內部高速時鐘(HRC)的使用

HC32F460 內部高速時鐘(HRC)的使用

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_OFFICG_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就不清楚了。