[应用相关] 系统时钟初始化at32f4xx_clock.c中HEXT启动说明

[复制链接]
 楼主| 小小蚂蚁举千斤 发表于 2023-10-14 16:00 | 显示全部楼层 |阅读模式
在 at32f4xx_clock.c 中,函数 system_clock_config()目的是配置系统时钟。其中若直接使用 HEXT 作为系统
主时钟,或间接使用 HEXT 作 PLL 来源而使用 PLL 作为系统主时钟时,就会执行以下代码:
  1. #define HEXT_STABLE_DELAY (5000u)
  2. #define PLL_STABLE_DELAY (500u)
  3. /* reset crm */
  4. crm_reset();
  5. crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);
  6. <font color="#ff0000">/* wait for hext stable ,specially for AT32F403*/
  7. wait_stbl(HEXT_STABLE_DELAY);</font>
  8. /* wait till hext is ready */
  9. while(crm_hext_stable_wait() == ERROR)
  10. {
  11. }
  12. /* config pll clock resource */
  13. crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_48, CRM_PLL_OUTPUT_RANGE_GT72MHZ);
  14. /* enable pll */
  15. crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
  16. /* wait till pll is ready */
  17. while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  18. {
  19. }
  20. /* config apb2clk */
  21. crm_apb2_div_set(CRM_APB2_DIV_2);
  22. /* config apb1clk */
  23. crm_apb1_div_set(CRM_APB1_DIV_2);
  24. /* 1step: config ahbclk div8 */
  25. crm_ahb_div_set(CRM_AHB_DIV_8);
  26. /* select pll as system clock source */
  27. crm_sysclk_switch(CRM_SCLK_PLL);
  28. /* wait till pll is used as system clock source */
  29. 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 起振计时非常相关,特别说明如下:

  1. #define HEXT_STARTUP_TIMEOUT ((uint16_t)0x3000) /*!< time out for hext start up */
  2. error_status crm_hext_stable_wait(void)
  3. {
  4. uint32_t stable_cnt = 0;
  5. error_status status = ERROR;
  6. while((crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET) && (stable_cnt < HEXT_STARTUP_TIMEOUT))
  7. {
  8. stable_cnt ++;
  9. }
  10. if(crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET)
  11. {
  12. status = ERROR;
  13. }
  14. else
  15. {
  16. status = SUCCESS;
  17. }
  18. return status;
  19. }


在使能 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 的硬件问题。
另外,硬件电路设计需符合规格。对于无源晶振,需要检查匹配电容是否符合规格。若不符合,需要用户调
整电容容值以满足要求。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

2536

帖子

1

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