搜索

[综合信息] HC32 F00 时钟

[复制链接]
307|24
 楼主 | 2020-3-29 15:23 | 显示全部楼层 |阅读模式
时钟解锁函数
static void ClkUnlock(void)
{
    M0P_CLOCK->SYSCTRL2 = 0x5A5A;
    M0P_CLOCK->SYSCTRL2 = 0xA5A5;
}

使用特权

评论回复
 楼主 | 2020-3-29 15:25 | 显示全部楼层
时钟SYSCTRL0寄存器空写
static void ClkWriteDummy(void)
{
    M0P_CLOCK->SYSCTRL0_f.RESERVED11 = 0x0;
}

使用特权

评论回复
 楼主 | 2020-3-29 15:26 | 显示全部楼层
时钟功能设定
en_result_t Clk_SetFunc(en_clk_func_t enFunc, boolean_t bFlag)
{
    en_result_t enRet = Ok;

    ClkUnlock();
    bFlag = !!bFlag;

    switch (enFunc)
    {
        case ClkFuncWkupRCH:
            M0P_CLOCK->SYSCTRL0_f.WAKEUP_BYRCH = bFlag;
            break;
        case ClkFuncXTHEn:
            M0P_CLOCK->SYSCTRL1_f.EXTH_EN = bFlag;
            break;
        case ClkFuncFaultEn:
            M0P_CLOCK->SYSCTRL1_f.CLOCK_FT_EN = bFlag;
            break;
        case ClkFuncLockUpEn:
            M0P_CLOCK->SYSCTRL1_f.LOCK_EN = bFlag;
            break;
        case ClkFuncRstPinIOEn:
            M0P_CLOCK->SYSCTRL1_f.RES_UIO = bFlag;
            break;
        case ClkFuncSwdPinIOEn:
            M0P_CLOCK->SYSCTRL1_f.SWD_UIO = bFlag;
            break;
        default:
            ClkWriteDummy();
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 15:27 | 显示全部楼层
时钟源切换
  1. en_result_t Clk_SwitchTo(en_clk_source_t enSource)
  2. {
  3.     en_clk_source_t ClkOld;
  4.     en_clk_source_t ClkNew = enSource;


  5.     ClkOld = (en_clk_source_t)M0P_CLOCK->SYSCTRL0_f.CLK_SW4_SEL;
  6.     //set wait
  7.     switch (ClkNew)
  8.     {
  9.         case ClkRCH:
  10.             break;
  11.         case ClkXTH:
  12.             Clk_SetXTH_StableTime(ClkCycle16384);
  13.             break;
  14.         case ClkRCL:
  15.             Clk_SetRCL_StableTime(ClkCycle256);
  16.             break;
  17.         default:
  18.             return ErrorInvalidParameter;
  19.     }

  20.     //如果当前时钟或目标时钟有一个大于24MHz,则开启FLASH读等待周期
  21.     //add flash wait
  22.     M0P_FLASH->BYPASS = 0x5A5A;
  23.     M0P_FLASH->BYPASS = 0xA5A5;
  24.     if (((ClkXTH == ClkNew) || (ClkXTH == ClkOld)) && (CLK_XTH_VAL > (24 * 1000 * 1000)))
  25.     {
  26.         M0P_FLASH->CR_f.WAIT = TRUE;
  27.     }

  28.     Clk_Enable(ClkNew, TRUE);

  29.     while (FALSE == Clk_GetClkRdy(ClkNew))
  30.     {
  31.         ;
  32.     }

  33.     //switch
  34.     Clk_SetSource(ClkNew);

  35.     //close old
  36.     Clk_Enable(ClkOld, FALSE);

  37.     //如果当前时钟非外部高速(即不大于24MHz)则不增加读等待周期
  38.     if(ClkXTH != ClkNew)
  39.     {
  40.         M0P_FLASH->CR_f.WAIT = FALSE;
  41.     }
  42.    
  43.     SystemCoreClockUpdate();

  44.     return Ok;

  45. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-29 15:32 | 显示全部楼层
获得系统时钟(HCLK)频率值
  1. uint32_t Clk_GetHClkFreq(void)
  2. {
  3.     uint32_t u32Val = 0;
  4.     uint16_t u16TrimVal22_12 = 0;
  5.     const uint8_t u8hcr_tbl[] = { 4, 8, 16, 24 };
  6.     const uint32_t u32lcr_tbl[] = { 32768, 38400 };
  7.    
  8.     en_clk_source_t enSrc;

  9.     //1. get current input source
  10.     enSrc = (en_clk_source_t)M0P_CLOCK->SYSCTRL0_f.CLK_SW4_SEL;

  11.     switch (enSrc)
  12.     {
  13.         case ClkRCH:
  14.             u32Val = u8hcr_tbl[(M0P_CLOCK->RCH_CR_f.TRIM&0x600U)>>9u];
  15.             u32Val *= 1000u * 1000u;
  16.                         if(24000000u == u32Val)
  17.                         {
  18.                 u16TrimVal22_12 = RCH_CR_TRIM_22_12M_VAL;
  19.                                 if(u16TrimVal22_12 == M0P_CLOCK->RCH_CR_f.TRIM)
  20.                                 {
  21.                                         u32Val = 22120000u;
  22.                                 }
  23.                         }
  24.             break;
  25.         case ClkRCL:
  26.             u32Val = u32lcr_tbl[(M0P_CLOCK->RCL_CR_f.TRIM&0x200U)>>9u];
  27.             break;
  28.         case ClkXTH:
  29.             u32Val = CLK_XTH_VAL;
  30.             break;
  31.         default:
  32.             u32Val = 0u;
  33.             break;
  34.     }

  35.     u32Val = u32Val >> M0P_CLOCK->SYSCTRL0_f.HCLK_PRS;

  36.     return u32Val;
  37. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-29 15:35 | 显示全部楼层
获得外设时钟(PCLK)频率值
  1. uint32_t Clk_GetPClkFreq(void)
  2. {
  3.     uint32_t u32Val = 0;

  4.     u32Val = Clk_GetHClkFreq();
  5.     u32Val = u32Val >> M0P_CLOCK->SYSCTRL0_f.PCLK_PRS;

  6.     return u32Val;
  7. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-29 15:42 | 显示全部楼层
时钟初始化函数
  1. en_result_t Clk_Init(stc_clk_config_t *pstcCfg)
  2. {
  3.     ASSERT(NULL != pstcCfg);
  4.     ASSERT(pstcCfg->enHClkDiv <= ClkDiv128);
  5.     ASSERT(pstcCfg->enPClkDiv <= ClkDiv8);

  6.     Clk_SwitchTo(pstcCfg->enClkSrc);
  7.     Clk_SetHClkDiv(pstcCfg->enHClkDiv);
  8.     Clk_SetPClkDiv(pstcCfg->enPClkDiv);

  9.     return Ok;
  10. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-29 16:49 | 显示全部楼层
时钟去初始化函数
  1. en_result_t Clk_DeInit(void)
  2. {
  3.     //set clock to HCR 4Mhz
  4.     Clk_SetRCHFreq(ClkFreq4Mhz);
  5.     Clk_SwitchTo(ClkRCH);   
  6.     Clk_SetHClkDiv(ClkDiv1);
  7.     Clk_SetPClkDiv(ClkDiv1);
  8.     return Ok;
  9. }
复制代码


使用特权

评论回复
 楼主 | 2020-3-29 16:50 | 显示全部楼层
时钟源设定
en_result_t Clk_SetSource(en_clk_source_t enSource)
{
    en_result_t enRet = Ok;

    ClkUnlock();

    switch (enSource)
    {
        case ClkRCH:
        case ClkRCL:
        case ClkXTH:
            M0P_CLOCK->SYSCTRL0_f.CLK_SW4_SEL = enSource;
            break;
        default:
            ClkWriteDummy();
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 16:52 | 显示全部楼层
获得时钟源稳定标志
boolean_t Clk_GetClkRdy(en_clk_source_t enSource)
{
    boolean_t bFlag = FALSE;

    switch (enSource)
    {
        case ClkRCH:
            bFlag = M0P_CLOCK->RCH_CR_f.STABLE;
            break;
        case ClkXTH:
            bFlag = M0P_CLOCK->XTH_CR_f.STABLE;
            break;
        case ClkRCL:
            bFlag = M0P_CLOCK->RCL_CR_f.STABLE;
            break;
        default:
            break;
    }
    return bFlag;
}

使用特权

评论回复
 楼主 | 2020-3-29 16:53 | 显示全部楼层
内部高速时钟频率设定
en_result_t Clk_SetRCHFreq(en_clk_freq_t enVal)
{
    en_result_t enRet = Ok;

    switch (enVal)
    {
        case ClkFreq4Mhz:
            M0P_CLOCK->RCH_CR_f.TRIM = RCH_CR_TRIM_4M_VAL;
            break;
        case ClkFreq8Mhz:
            M0P_CLOCK->RCH_CR_f.TRIM = RCH_CR_TRIM_8M_VAL;
            break;
        case ClkFreq16Mhz:
            M0P_CLOCK->RCH_CR_f.TRIM = RCH_CR_TRIM_16M_VAL;
            break;
        case ClkFreq22_12Mhz:
            M0P_CLOCK->RCH_CR_f.TRIM = RCH_CR_TRIM_22_12M_VAL;
            break;
        case ClkFreq24Mhz:
            M0P_CLOCK->RCH_CR_f.TRIM = RCH_CR_TRIM_24M_VAL;
            break;
        default:
            enRet = ErrorInvalidParameter;
            break;
    }
   
    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 17:04 | 显示全部楼层
内部低速时钟频率设定
en_result_t Clk_SetRCLFreq(en_clk_freq_t enVal)
{
    en_result_t enRet = Ok;

    switch (enVal)
    {
        case ClkFreq32768:
            M0P_CLOCK->RCL_CR_f.TRIM = RCL_CR_TRIM_32_8K_VAL;
            break;
        case ClkFreq38_4K:
            M0P_CLOCK->RCL_CR_f.TRIM = RCL_CR_TRIM_38_4K_VAL;
            break;
        default:
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
| 2020-3-29 19:54 | 显示全部楼层
感谢楼主分享代码

使用特权

评论回复
 楼主 | 2020-3-29 20:03 | 显示全部楼层
系统时钟(HCLK)分频设定
en_result_t Clk_SetHClkDiv(uint8_t u8Div)
{
    switch (u8Div)
    {
        case ClkDiv1:
        case ClkDiv2:
        case ClkDiv4:
        case ClkDiv8:
        case ClkDiv16:
        case ClkDiv32:
        case ClkDiv64:
        case ClkDiv128:
            ClkUnlock();
            u8Div = Log2(u8Div);
            M0P_CLOCK->SYSCTRL0_f.HCLK_PRS = u8Div;
            break;
        default:
            return ErrorInvalidParameter;
    }

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:04 | 显示全部楼层
外设时钟(PCLK)分频设定
en_result_t Clk_SetPClkDiv(uint8_t u8Div)
{

    switch (u8Div)
    {
        case ClkDiv1:
        case ClkDiv2:
        case ClkDiv4:
        case ClkDiv8:
            ClkUnlock();
            u8Div = Log2(u8Div);
            M0P_CLOCK->SYSCTRL0_f.PCLK_PRS = u8Div;
            break;
        default:
            return ErrorInvalidParameter;
    }

    return Ok;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:13 | 显示全部楼层
外部高速时钟稳定时间设定
en_result_t Clk_SetXTH_StableTime(en_clk_cycle_t enCycle)
{
    en_result_t enRet = Ok;

    switch (enCycle)
    {
        case ClkCycle256:
            M0P_CLOCK->XTH_CR_f.STARTUP = 0u;
            break;
        case ClkCycle1024:
            M0P_CLOCK->XTH_CR_f.STARTUP = 1u;
            break;
        case ClkCycle4096:
            M0P_CLOCK->XTH_CR_f.STARTUP = 2u;
            break;
        case ClkCycle16384:
            M0P_CLOCK->XTH_CR_f.STARTUP = 3u;
            break;
        default:
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:15 | 显示全部楼层
内部低速时钟稳定时间设定
en_result_t Clk_SetRCL_StableTime(en_clk_cycle_t enCycle)
{
    en_result_t enRet = Ok;

    switch (enCycle)
    {
        case ClkCycle4:
            M0P_CLOCK->RCL_CR_f.STARTUP = 0u;
            break;
        case ClkCycle16:
            M0P_CLOCK->RCL_CR_f.STARTUP = 1u;
            break;
        case ClkCycle64:
            M0P_CLOCK->RCL_CR_f.STARTUP = 2u;
            break;
        case ClkCycle256:
            M0P_CLOCK->RCL_CR_f.STARTUP = 3u;
            break;
        default:
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:17 | 显示全部楼层
时钟使能
en_result_t Clk_Enable(en_clk_source_t enSource, boolean_t bFlag)
{
    en_result_t enRet = Ok;

    ClkUnlock();
    //force to 0/1
    bFlag = !!bFlag;

    switch (enSource)
    {

        case ClkRCL:
            M0P_CLOCK->SYSCTRL0_f.RCL_EN = bFlag;
            break;

        case ClkXTH:
            M0P_GPIO->P0ADS_f.P01 = bFlag;
            M0P_GPIO->P0ADS_f.P02 = bFlag;
            M0P_CLOCK->XTH_CR_f.DRIVER = 0xF;
            M0P_CLOCK->SYSCTRL0_f.XTH_EN = bFlag;
            break;

        case ClkRCH:
            M0P_CLOCK->SYSCTRL0_f.RCH_EN = bFlag;
            break;

        default:
            ClkWriteDummy();
            enRet = ErrorInvalidParameter;
            break;
    }

    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:18 | 显示全部楼层
设置外设时钟门控开关
en_result_t Clk_SetPeripheralGate(en_clk_peripheral_gate_t enPeripheral,
                                  boolean_t bFlag)
{
    en_result_t enRet = Ok;

    bFlag = !!bFlag;
    setBit(&M0P_CLOCK->PERI_CLKEN, enPeripheral, bFlag);
    return enRet;
}

使用特权

评论回复
 楼主 | 2020-3-29 20:19 | 显示全部楼层
获得外设时钟门控开关状态
boolean_t Clk_GetPeripheralGate(en_clk_peripheral_gate_t enPeripheral)
{
    return getBit(&M0P_CLOCK->PERI_CLKEN, enPeripheral);
}

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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