打印
[牛人杂谈]

库函数之内核时钟配置函数解读

[复制链接]
779|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
antusheng|  楼主 | 2020-6-7 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);
我们经常在例子中用到这个函数,我们可以看到这个函数就是设置内核时钟的,上面这个是这种PLL作为内核时钟。
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]      Set HCLK frequency
  * @param[in]  u32Hclk is HCLK frequency
  * [url=home.php?mod=space&uid=266161]@return[/url]     HCLK frequency
  * [url=home.php?mod=space&uid=1543424]@Details[/url]    This function set HCLK frequency. The frequency unit is Hz. The range of u32Hclk is 25 MHz ~ 50 MHz.
  *             The register write-protection function should be disabled before using this function.
  */
uint32_t CLK_SetCoreClock(uint32_t u32Hclk)
{
    uint32_t u32HIRCSTB;

    /* Read HIRC clock source stable flag */   
    u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;        
   
    /* The range of u32Hclk is 25 MHz ~ 50 MHz */   
    if(u32Hclk > FREQ_50MHZ)
        u32Hclk = FREQ_50MHZ;
    else if(u32Hclk < FREQ_25MHZ)
        u32Hclk = FREQ_25MHZ;

    /* Switch HCLK clock source to HIRC clock for safe */
    CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);  
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
    CLK->CLKDIV &= (~CLK_CLKDIV_HCLK_N_Msk);   
   
    /* Configure PLL setting if HXT clock is stable */
    if(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk)
        u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, u32Hclk);

    /* Configure PLL setting if HXT clock is not stable */   
    else
    {
        u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HIRC, u32Hclk);
        
        /* Read HIRC clock source stable flag */   
        u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;            
    }

    /* Select HCLK clock source to PLL */   
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(1));

    /* Disable HIRC if HIRC is disabled before setting core clock */
    if( u32HIRCSTB == 0 )
        CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk;      
   
    return u32Hclk;
}
这个函数只能设置两个值,50MHz,25MHz
先将HCLK设置到HIRC,确保百分百能运行,这个时候HCLK还是22MHz
然后确认外部晶振是否正常运行,如果正常运行设置到外部晶振,然后设置PLL为50MHz,
如果晶振没有正常运行设置PLL时钟源为HIRC,同样设置PLL到50MHz
然后再将HCLK设置到PLL上去。

使用特权

评论回复
沙发
antusheng|  楼主 | 2020-6-7 20:35 | 只看该作者
更多解读参考
https://bbs.21ic.com/icview-2968922-1-1.html
我在这个贴里的回复。

使用特权

评论回复
板凳
antusheng|  楼主 | 2020-6-7 20:38 | 只看该作者
我们可以在很多库函数里面看到这种为了考虑稳定安全,而先设置为内部时钟,然后再尝试设置为你指定的时钟的方法。

使用特权

评论回复
地板
dongnanxibei| | 2020-6-7 20:39 | 只看该作者
讲的不错,确实是这样,之前还疑惑呢,原来如此。

使用特权

评论回复
5
xinxianshi| | 2020-6-8 22:14 | 只看该作者
说的挺对的。

使用特权

评论回复
6
玛尼玛尼哄| | 2020-6-9 22:52 | 只看该作者
为何如此优秀

使用特权

评论回复
7
598330983| | 2020-6-18 22:47 | 只看该作者
透彻啊。

使用特权

评论回复
8
xinxianshi| | 2020-6-20 11:33 | 只看该作者
挖的深入。

使用特权

评论回复
9
wiba| | 2020-7-6 16:49 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
zljiu| | 2020-7-6 16:50 | 只看该作者
非常不错的分享

使用特权

评论回复
11
coshi| | 2020-7-6 16:50 | 只看该作者
我总是搞不清楚这些时钟的问题

使用特权

评论回复
12
aoyi| | 2020-7-6 16:50 | 只看该作者
长知识了 呵呵

使用特权

评论回复
13
drer| | 2020-7-6 16:51 | 只看该作者
楼主辛苦了

使用特权

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

本版积分规则

83

主题

1470

帖子

5

粉丝