[牛人杂谈] 库函数之内核时钟配置函数解读

[复制链接]
1171|12
 楼主| antusheng 发表于 2020-6-7 20:34 | 显示全部楼层 |阅读模式
    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);
我们经常在例子中用到这个函数,我们可以看到这个函数就是设置内核时钟的,上面这个是这种PLL作为内核时钟。
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]      Set HCLK frequency
  3.   * @param[in]  u32Hclk is HCLK frequency
  4.   * [url=home.php?mod=space&uid=266161]@return[/url]     HCLK frequency
  5.   * [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.
  6.   *             The register write-protection function should be disabled before using this function.
  7.   */
  8. uint32_t CLK_SetCoreClock(uint32_t u32Hclk)
  9. {
  10.     uint32_t u32HIRCSTB;

  11.     /* Read HIRC clock source stable flag */   
  12.     u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;        
  13.    
  14.     /* The range of u32Hclk is 25 MHz ~ 50 MHz */   
  15.     if(u32Hclk > FREQ_50MHZ)
  16.         u32Hclk = FREQ_50MHZ;
  17.     else if(u32Hclk < FREQ_25MHZ)
  18.         u32Hclk = FREQ_25MHZ;

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

  28.     /* Configure PLL setting if HXT clock is not stable */   
  29.     else
  30.     {
  31.         u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HIRC, u32Hclk);
  32.         
  33.         /* Read HIRC clock source stable flag */   
  34.         u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;            
  35.     }

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

  38.     /* Disable HIRC if HIRC is disabled before setting core clock */
  39.     if( u32HIRCSTB == 0 )
  40.         CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk;      
  41.    
  42.     return u32Hclk;
  43. }
这个函数只能设置两个值,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 | 显示全部楼层
讲的不错,确实是这样,之前还疑惑呢,原来如此。
xinxianshi 发表于 2020-6-8 22:14 | 显示全部楼层
说的挺对的。
玛尼玛尼哄 发表于 2020-6-9 22:52 | 显示全部楼层
为何如此优秀
598330983 发表于 2020-6-18 22:47 | 显示全部楼层
透彻啊。
xinxianshi 发表于 2020-6-20 11:33 | 显示全部楼层
挖的深入。
wiba 发表于 2020-7-6 16:49 | 显示全部楼层
非常感谢楼主分享
zljiu 发表于 2020-7-6 16:50 | 显示全部楼层
非常不错的分享
coshi 发表于 2020-7-6 16:50 | 显示全部楼层
我总是搞不清楚这些时钟的问题
aoyi 发表于 2020-7-6 16:50 | 显示全部楼层
长知识了 呵呵
drer 发表于 2020-7-6 16:51 | 显示全部楼层
楼主辛苦了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

1521

帖子

5

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