打印
[应用相关]

系统时钟初始化at32f4xx_clock.c中HEXT启动说明

[复制链接]
970|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在 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 即可进行后续操作而不会引发
系统异常。

使用特权

评论回复
沙发
小小蚂蚁举千斤|  楼主 | 2023-10-14 16:01 | 只看该作者
crm_hext_stable_wait()函数和 HEXT 起振计时非常相关,特别说明如下:

#define HEXT_STARTUP_TIMEOUT ((uint16_t)0x3000) /*!< time out for hext start up */
error_status crm_hext_stable_wait(void)
{
uint32_t stable_cnt = 0;
error_status status = ERROR;
while((crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET) && (stable_cnt < HEXT_STARTUP_TIMEOUT))
{
stable_cnt ++;
}
if(crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET)
{
status = ERROR;
}
else
{
status = SUCCESS;
}
return status;
}


在使能 HEXT 后,代码会进入等待循环等待 HEXT 就绪标志位置起后跳出循环,再进行后续配置动作。但此
循环运行的同时也会进行超时计数。若 HEXT 就绪标志位迟迟不起且时间超出 HEXT_STARTUP_TIMEO UT
的设定,表示 HEXT 启动失败,代码会返回 ERROR,由用户在 system_clock_config()中自行处理这个错误
情况。
经实测,特性优良的 HEXT 晶振在硬件匹配合适时,约 800 μs 就可以起振就绪;若特性及匹配差一些,最
多 10 ms 也可起振就绪。HEXT_STARTUP_TIMEOUT 设定值为 0x3000,在最佳时间优化的编译设置下约
为 20 ms。若 HEXT 启动后等待 20 ms 就绪标志位都还未置起,可以判定晶振有匹配问题、虚焊脱落、或
是损坏。因此 HEXT_STARTUP_TIMEOUT 的设定值提供一个合理的超时检测,不但可以满足一般 HEXT
起振就绪时间,又可得知 HEXT 的硬件问题。
另外,硬件电路设计需符合规格。对于无源晶振,需要检查匹配电容是否符合规格。若不符合,需要用户调
整电容容值以满足要求。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

1862

帖子

1

粉丝