[学习笔记] 寄存器学习之clock

[复制链接]
1734|4
 楼主| JasonLee27 发表于 2020-7-14 14:54 | 显示全部楼层 |阅读模式
硬件环境:AC7801x 通用开发板  ATC-LINK
软件环境:keil 5.23


在gpio的基础上,给芯片加个速,并添上了完整的启动文件。
首先,从手册里面找到时钟章节的时钟树,可以看到芯片有三个时钟源:HSE,HSI以及LSI。
而系统时钟(下图Hclk)的时钟来源可以选择外部输入,HSE,HSI或者PLL。这个外部输入呢,就是可以直接从XI脚输入一个clock作为芯片的时钟源。
WeChat Screenshot_20200714143421.png
我们还是使用常规的,采用PLL作为Hclk时钟源,并设置为48MHz,同时PLL的时钟源选择HSE。
设置时钟的顺序要注意,先起振外部XOSC时钟,再开启PLL,成功后再设置各个DIV值,最后,再将系统时钟源切换为PLL时钟。
  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] set system clock use HSE
  3. *
  4. * @param[in] none
  5. * [url=home.php?mod=space&uid=266161]@return[/url] none
  6. */
  7. void SetSysClock(void)
  8. {
  9.     __IO uint8_t pllReference = 0;    ///<0:internal 1:XOSC
  10.     __IO uint32_t status = 0;
  11.     uint32_t timeout = 10000;

  12.   //  MODIFY_MEM32(REG_XOSC_CFG0_ADDR, XOSC_CFG0_OK_BYPASS_MASK, XOSC_CFG0_OK_BYPASS_POS, DISABLE);   ///<Disabe bypass default DISABLE
  13.    
  14.     SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_HSEON_Msk); ///<Enable XOSC
  15.    
  16.     do  ///<wait for XOSC ready
  17.     {
  18.         status = READ_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_RDY_Msk);
  19.         timeout--;
  20.     } while ((!status) && (timeout != 0));
  21.     /* check if xosc enable success? */
  22.     if (timeout == 0)   ///<xosc enable fail,change pll reference clock to HSI 8M
  23.     {
  24.         MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_PLL_REF_SEL_Msk, CKGEN_CTRL_PLL_REF_SEL_Pos, 0);
  25.         pllReference = 0;
  26.     }
  27.     else    ///<select XOSC as PLL ref source
  28.     {
  29.         MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_PLL_REF_SEL_Msk, CKGEN_CTRL_PLL_REF_SEL_Pos, 1);
  30.         pllReference = 1;
  31.     }

  32.     /* set system clock divider */
  33.     MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_DIV_Msk, CKGEN_CTRL_SYSCLK_DIV_Pos, 0);
  34.     SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_SYSPLL_ON_Msk);
  35.     timeout = 10000;
  36.     do
  37.     {
  38.         status = READ_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_SYSPLL_RDY_Msk);
  39.         timeout--;
  40.     } while ((!status) && (timeout != 0));
  41.     /* check if pll enable success? */
  42.     if (timeout == 0)   /* pll enable fail */
  43.     {
  44.         if (pllReference == 1)
  45.         {
  46.             MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 2); ///<XOSC
  47.         }
  48.         else
  49.         {
  50.             MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 0); ///<HSI
  51.         }
  52.     }
  53.     else
  54.     {
  55.         MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Pos, 0);
  56.         MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Pos, 4);
  57.         MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Pos, 48);
  58.         MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 1); ///<PLL
  59.     }
  60. }
至此,芯片就运行于48M主频下了。

最后,看下生成的代码大小:
Program Size: Code=996 RO-data=224 RW-data=8 ZI-data=1120  

clock.rar (179.56 KB, 下载次数: 18)

TechHolder 发表于 2020-7-14 15:19 | 显示全部楼层
函数名称上方的注释是有中文吗?感觉有点像乱码,不过代码看着棒棒的。
 楼主| JasonLee27 发表于 2020-7-15 09:32 | 显示全部楼层
TechHolder 发表于 2020-7-14 15:19
函数名称上方的注释是有中文吗?感觉有点像乱码,不过代码看着棒棒的。 ...

不是中文,不知道为什么贴过来会多链接
zeshoufx 发表于 2020-7-17 09:35 | 显示全部楼层
可以可以,,,
这是神魔节奏 发表于 2020-8-11 11:52 | 显示全部楼层
外部时钟8MHz,配置系统时钟96MHz
系统时钟配置.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

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