MA35D1 RTP CANFD 时钟源不能改变

cwlin0 |浏览51次
收藏|2024/04/03 14:57

MA35D1 RTP CANFD 时钟源不能改变

满意回答

2024/04/03 14:59

按照以下方式修改代碼后,问题解决:

void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv)

{

    uint32_t u32sel = 0U, u32div = 0U;


    if (u32ModuleIdx == KPI_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV4 & ~(CLK_CLKDIV4_KPIDIV_Msk) | u32ClkDiv;

        CLK->CLKSEL4 = CLK->CLKSEL4 & ~(CLK_CLKSEL4_KPISEL_Msk) | u32ClkSrc;

        CLK->APBCLK0 = CLK->APBCLK0 & ~(CLK_APBCLK0_KPICKEN_Msk) | CLK_APBCLK0_KPICKEN_Msk;

    }

    else if (u32ModuleIdx == ADC_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV4 & ~(CLK_CLKDIV4_ADCDIV_Msk) | u32ClkDiv;

        CLK->APBCLK2 = CLK->APBCLK2 & ~(CLK_APBCLK2_ADCCKEN_Msk) | CLK_APBCLK2_ADCCKEN_Msk;

    }

              else if (u32ModuleIdx == CANFD0_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV0 & ~(CLK_CLKDIV0_CANFD0DIV_Msk) | u32ClkDiv;

        CLK->CLKSEL4 = CLK->CLKSEL4 & ~(CLK_CLKSEL4_CANFD0SEL_Msk) | u32ClkSrc;

    }

    else if (u32ModuleIdx == CANFD1_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV0 & ~(CLK_CLKDIV0_CANFD1DIV_Msk) | u32ClkDiv;

        CLK->CLKSEL4 = CLK->CLKSEL4 & ~(CLK_CLKSEL4_CANFD1SEL_Msk) | u32ClkSrc;

    }

    else if (u32ModuleIdx == CANFD2_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV0 & ~(CLK_CLKDIV0_CANFD2DIV_Msk) | u32ClkDiv;

        CLK->CLKSEL4 = CLK->CLKSEL4 & ~(CLK_CLKSEL4_CANFD2SEL_Msk) | u32ClkSrc;

    }

    else if (u32ModuleIdx == CANFD3_MODULE)

    {

        CLK->CLKDIV4 = CLK->CLKDIV0 & ~(CLK_CLKDIV0_CANFD3DIV_Msk) | u32ClkDiv;

        CLK->CLKSEL4 = CLK->CLKSEL4 & ~(CLK_CLKSEL4_CANFD3SEL_Msk) | u32ClkSrc;

    }

    else

    {

        if (MODULE_CLKDIV_Msk(u32ModuleIdx) != MODULE_NoMsk)

        {

            /* Get clock divider control register address */

            u32div = (uint32_t)&CLK->CLKDIV0 + ((MODULE_CLKDIV(u32ModuleIdx)) * 4U);

            /* Apply new divider */

            M32(u32div) = (M32(u32div) & (~(MODULE_CLKDIV_Msk(u32ModuleIdx) << MODULE_CLKDIV_Pos(u32ModuleIdx)))) | u32ClkDiv;

        }


        if (MODULE_CLKSEL_Msk(u32ModuleIdx) != MODULE_NoMsk)

        {

            /* Get clock select control register address */

            u32sel = (uint32_t)&CLK->CLKSEL0 + ((MODULE_CLKSEL(u32ModuleIdx)) * 4U);

            /* Set new clock selection setting */

            M32(u32sel) = (M32(u32sel) & (~(MODULE_CLKSEL_Msk(u32ModuleIdx) << MODULE_CLKSEL_Pos(u32ModuleIdx)))) | u32ClkSrc;

        }

    }

}


nuvoton2022

其他回答(0)
0人关注该问题
+1
 加载中...