在 at32f4xx_clock.c 中,函数 system_clock_config()目的是配置系统时钟。其中若直接使用 HEXT 作为系统
主时钟,或间接使用 HEXT 作 PLL 来源而使用 PLL 作为系统主时钟时,就会执行以下代码:
#define HEXT_STABLE_DELAY (5000u)
#define PLL_STABLE_DELAY (500u)
/* reset crm */
crm_reset();
crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);
<font color="#ff0000">/* wait for hext stable ,specially for AT32F403*/
wait_stbl(HEXT_STABLE_DELAY);</font>
/* wait till hext is ready */
while(crm_hext_stable_wait() == ERROR)
{
}
/* config pll clock resource */
crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_48, CRM_PLL_OUTPUT_RANGE_GT72MHZ);
/* enable pll */
crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
/* wait till pll is ready */
while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
{
}
/* config apb2clk */
crm_apb2_div_set(CRM_APB2_DIV_2);
/* config apb1clk */
crm_apb1_div_set(CRM_APB1_DIV_2);
/* 1step: config ahbclk div8 */
crm_ahb_div_set(CRM_AHB_DIV_8);
/* select pll as system clock source */
crm_sysclk_switch(CRM_SCLK_PLL);
/* wait till pll is used as system clock source */
while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
wait_stbl(HEXT_STABLE_DELAY)函数是 AT32F403 独有的,这段代码的本质是延时空指令,
其他型号不需要。原因是 AT32F403 就绪标志位置起过早,此时晶振的实际振荡情况尚不稳定,若立即进行
设置 PLL 或切换系统主时钟操作,会造成系统异常。HEXT_STABLE_DELAY 设定值为 5000,执行延时时
间约为 2 ms。经实测若 HEXT 晶振配置合宜,就绪标志位置起后再等 2 ms 即可进行后续操作而不会引发
系统异常。
|