硬件环境:AC7801x 通用开发板 ATC-LINK
软件环境:keil 5.23
在gpio的基础上,给芯片加个速,并添上了完整的启动文件。
首先,从手册里面找到时钟章节的时钟树,可以看到芯片有三个时钟源:HSE,HSI以及LSI。
而系统时钟(下图Hclk)的时钟来源可以选择外部输入,HSE,HSI或者PLL。这个外部输入呢,就是可以直接从XI脚输入一个clock作为芯片的时钟源。
我们还是使用常规的,采用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)
|