[综合信息]

HC32 F00 时钟

[复制链接]
1201|24
手机看帖
扫描二维码
随时随地手机跟帖
gaoke231|  楼主 | 2020-3-29 15:23 | 显示全部楼层 |阅读模式
时钟解锁函数
static void ClkUnlock(void)
{
    M0P_CLOCK->SYSCTRL2 = 0x5A5A;
    M0P_CLOCK->SYSCTRL2 = 0xA5A5;
}

使用特权

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

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

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


    ClkOld = (en_clk_source_t)M0P_CLOCK->SYSCTRL0_f.CLK_SW4_SEL;
    //set wait
    switch (ClkNew)
    {
        case ClkRCH:
            break;
        case ClkXTH:
            Clk_SetXTH_StableTime(ClkCycle16384);
            break;
        case ClkRCL:
            Clk_SetRCL_StableTime(ClkCycle256);
            break;
        default:
            return ErrorInvalidParameter;
    }

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

    Clk_Enable(ClkNew, TRUE);

    while (FALSE == Clk_GetClkRdy(ClkNew))
    {
        ;
    }

    //switch
    Clk_SetSource(ClkNew);

    //close old
    Clk_Enable(ClkOld, FALSE);

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

    return Ok;

}


使用特权

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

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

    switch (enSrc)
    {
        case ClkRCH:
            u32Val = u8hcr_tbl[(M0P_CLOCK->RCH_CR_f.TRIM&0x600U)>>9u];
            u32Val *= 1000u * 1000u;
                        if(24000000u == u32Val)
                        {
                u16TrimVal22_12 = RCH_CR_TRIM_22_12M_VAL;
                                if(u16TrimVal22_12 == M0P_CLOCK->RCH_CR_f.TRIM)
                                {
                                        u32Val = 22120000u;
                                }
                        }
            break;
        case ClkRCL:
            u32Val = u32lcr_tbl[(M0P_CLOCK->RCL_CR_f.TRIM&0x200U)>>9u];
            break;
        case ClkXTH:
            u32Val = CLK_XTH_VAL;
            break;
        default:
            u32Val = 0u;
            break;
    }

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

    return u32Val;
}


使用特权

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

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

    return u32Val;
}


使用特权

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

    Clk_SwitchTo(pstcCfg->enClkSrc);
    Clk_SetHClkDiv(pstcCfg->enHClkDiv);
    Clk_SetPClkDiv(pstcCfg->enPClkDiv);

    return Ok;
}


使用特权

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


使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

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

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

评论回复
gaoke231|  楼主 | 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;
}

使用特权

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

1310

帖子

5

粉丝