[学习笔记]

寄存器学习之clock

[复制链接]
925|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时钟。
/*!
* [url=home.php?mod=space&uid=247401]@brief[/url] set system clock use HSE
*
* @param[in] none
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
void SetSysClock(void)
{
    __IO uint8_t pllReference = 0;    ///<0:internal 1:XOSC
    __IO uint32_t status = 0;
    uint32_t timeout = 10000;

  //  MODIFY_MEM32(REG_XOSC_CFG0_ADDR, XOSC_CFG0_OK_BYPASS_MASK, XOSC_CFG0_OK_BYPASS_POS, DISABLE);   ///<Disabe bypass default DISABLE
   
    SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_HSEON_Msk); ///<Enable XOSC
   
    do  ///<wait for XOSC ready
    {
        status = READ_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_XOSC_RDY_Msk);
        timeout--;
    } while ((!status) && (timeout != 0));
    /* check if xosc enable success? */
    if (timeout == 0)   ///<xosc enable fail,change pll reference clock to HSI 8M
    {
        MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_PLL_REF_SEL_Msk, CKGEN_CTRL_PLL_REF_SEL_Pos, 0);
        pllReference = 0;
    }
    else    ///<select XOSC as PLL ref source
    {
        MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_PLL_REF_SEL_Msk, CKGEN_CTRL_PLL_REF_SEL_Pos, 1);
        pllReference = 1;
    }

    /* set system clock divider */
    MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_DIV_Msk, CKGEN_CTRL_SYSCLK_DIV_Pos, 0);
    SET_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_SYSPLL_ON_Msk);
    timeout = 10000;
    do
    {
        status = READ_BIT32(SPM->PWR_MGR_CFG1, SPM_PWR_MGR_CFG1_SYSPLL_RDY_Msk);
        timeout--;
    } while ((!status) && (timeout != 0));
    /* check if pll enable success? */
    if (timeout == 0)   /* pll enable fail */
    {
        if (pllReference == 1)
        {
            MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 2); ///<XOSC
        }
        else
        {
            MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 0); ///<HSI
        }
    }
    else
    {
        MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Pos, 0);
        MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Pos, 4);
        MODIFY_REG32(CKGEN->SYSPLL1_CFG0, CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Msk, CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Pos, 48);
        MODIFY_REG32(CKGEN->CTRL, CKGEN_CTRL_SYSCLK_SEL_Msk, CKGEN_CTRL_SYSCLK_SEL_Pos, 1); ///<PLL
    }
}
至此,芯片就运行于48M主频下了。

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

clock.rar (179.56 KB)

使用特权

评论回复

相关帖子

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

帖子

10

粉丝