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;
}
}
}