[AT32F407] AT32F407VGT7 用外部晶振25MHz时串口乱码

[复制链接]
 楼主| dongly 发表于 2022-5-4 22:15 | 显示全部楼层 |阅读模式
本帖最后由 dongly 于 2022-5-4 22:17 编辑

  • 状况: AT32F407VGT7 用外部晶振25MHz时串口输出乱码
  • 硬件: 晶振为25MHz无源晶振
  • 标准库:V2.0.9
  • 时钟配置: New Clock Configuration V2.00.06
  • 例程: AT32F403A_407_Firmware_Library_V2.0.9\project\at_start_f407\examples\usart\printf
  • 编译器信息

    1. IDE-Version:
    2. μVision V5.30.0.0
    3. Copyright (C) 2020 ARM Ltd and ARM Germany GmbH. All rights reserved.

    4. Tool Version Numbers:
    5. Toolchain:        MDK-ARM Plus  Version: 5.30.0.0
    6. Toolchain Path:    e:\Keil_v5\ARM\ARMCC\Bin
    7. C Compiler:         Armcc.exe        V5.06 update 6 (build 750)
    8. Assembler:          Armasm.exe        V5.06 update 6 (build 750)
    9. Linker/Locator:     ArmLink.exe        V5.06 update 6 (build 750)
    10. Library Manager:    ArmAr.exe        V5.06 update 6 (build 750)
    11. Hex Converter:      FromElf.exe        V5.06 update 6 (build 750)
    12. CPU DLL:               SARMCM3.DLL          V5.30.0.0
    13. Dialog DLL:         TCM.DLL              V1.42.0.0
    14. Target DLL:             Segger\JL2CM3.dll      V2.99.38.0
    15. Dialog DLL:         TCM.DLL              V1.42.0.0



  • 使用内部时钟HICK时,生成新的system_clock_config()替换原来的system_clock_config(),串口打印正常

    1. /**
    2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  system clock config program
    3.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]   the system clock is configured as follow:
    4.   *         - system clock        = hick / 12 * pll_mult
    5.   *         - system clock source = pll (hick)
    6.   *         - sclk                = 240000000
    7.   *         - ahbdiv              = 1
    8.   *         - ahbclk              = 240000000
    9.   *         - apb1div             = 2
    10.   *         - apb1clk             = 120000000
    11.   *         - apb2div             = 2
    12.   *         - apb2clk             = 120000000
    13.   *         - pll_mult            = 60
    14.   *         - pll_range           = GT72MHZ (greater than 72 mhz)
    15.   * @param  none
    16.   * @retval none
    17.   */
    18. void system_clock_config(void)
    19. {
    20.   /* reset crm */
    21.   crm_reset();

    22.   /* enable hick */
    23.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);

    24.    /* wait till hick is ready */
    25.   while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
    26.   {
    27.   }

    28.   /* config pll clock resource */
    29.   crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

    30.   /* enable pll */
    31.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

    32.   /* wait till pll is ready */
    33.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
    34.   {
    35.   }

    36.   /* config ahbclk */
    37.   crm_ahb_div_set(CRM_AHB_DIV_1);

    38.   /* config apb2clk */
    39.   crm_apb2_div_set(CRM_APB2_DIV_2);

    40.   /* config apb1clk */
    41.   crm_apb1_div_set(CRM_APB1_DIV_2);

    42.   /* enable auto step mode */
    43.   crm_auto_step_mode_enable(TRUE);

    44.   /* select pll as system clock source */
    45.   crm_sysclk_switch(CRM_SCLK_PLL);

    46.   /* wait till pll is used as system clock source */
    47.   while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
    48.   {
    49.   }

    50.   /* disable auto step mode */
    51.   crm_auto_step_mode_enable(FALSE);

    52.   /* update system_core_clock global variable */
    53.   system_core_clock_update();
    54. }

  • 在PA8输出sclk的64分频(理论值3.750MHz)为3.760MHz
  • 使用外部晶振时,生成新的system_clock_config(),串口打死乱码(用分析仪查看了一下,貌似波特率不对)

    1. /**
    2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  system clock config program
    3.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]   the system clock is configured as follow:
    4.   *         - system clock        = hext / 5 * pll_mult
    5.   *         - system clock source = pll (hext)
    6.   *         - hext                = 25000000
    7.   *         - sclk                = 240000000
    8.   *         - ahbdiv              = 1
    9.   *         - ahbclk              = 240000000
    10.   *         - apb1div             = 2
    11.   *         - apb1clk             = 120000000
    12.   *         - apb2div             = 2
    13.   *         - apb2clk             = 120000000
    14.   *         - pll_mult            = 48
    15.   *         - pll_range           = GT72MHZ (greater than 72 mhz)
    16.   * @param  none
    17.   * @retval none
    18.   */
    19. void system_clock_config(void)
    20. {
    21.   /* reset crm */
    22.   crm_reset();

    23.   /* enable hext */
    24.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

    25.    /* wait till hext is ready */
    26.   while(crm_hext_stable_wait() == ERROR)
    27.   {
    28.   }

    29.   /* config pll clock resource */
    30.   crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_48, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

    31.   /* config hext division */
    32.   crm_hext_clock_div_set(CRM_HEXT_DIV_5);

    33.   /* enable pll */
    34.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

    35.   /* wait till pll is ready */
    36.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
    37.   {
    38.   }

    39.   /* config ahbclk */
    40.   crm_ahb_div_set(CRM_AHB_DIV_1);

    41.   /* config apb2clk */
    42.   crm_apb2_div_set(CRM_APB2_DIV_2);

    43.   /* config apb1clk */
    44.   crm_apb1_div_set(CRM_APB1_DIV_2);

    45.   /* enable auto step mode */
    46.   crm_auto_step_mode_enable(TRUE);

    47.   /* select pll as system clock source */
    48.   crm_sysclk_switch(CRM_SCLK_PLL);

    49.   /* wait till pll is used as system clock source */
    50.   while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
    51.   {
    52.   }

    53.   /* disable auto step mode */
    54.   crm_auto_step_mode_enable(FALSE);

    55.   /* update system_core_clock global variable */
    56.   system_core_clock_update();
    57. }
    微信截图_20220504220352.png
  • 在PA8输出sclk的64分频(理论值3.750MHz)为3.751MHz,说明时钟是正常的

请问各位大能,这个问题出哪里?

骑着蜗牛狂奔O 发表于 2022-5-5 10:16 | 显示全部楼层
我这边按着你的配置是没有问题的, 你注意,时钟配置工具共生成的文件clock.c clock.h conf.h 都要替换,你是不是没有替换完
sparrow054 发表于 2022-5-5 10:24 | 显示全部楼层
是不是你时钟没配置好,导致串口波特率并不是是想要的
 楼主| dongly 发表于 2022-5-5 10:27 | 显示全部楼层
骑着蜗牛狂奔O 发表于 2022-5-5 10:16
我这边按着你的配置是没有问题的, 你注意,时钟配置工具共生成的文件clock.c clock.h conf.h 都要替换,你 ...

好了,是conf.h未替换,谢谢!
hudi008 发表于 2022-5-16 10:38 | 显示全部楼层
乱码就是波特率的问题。   
vivilyly 发表于 2022-5-16 11:02 | 显示全部楼层
AT32F407VGT7 串口没有问题的。  
ingramward 发表于 2022-5-16 11:48 | 显示全部楼层
你的时钟是怎么配置的呢  
uiint 发表于 2022-5-16 12:14 | 显示全部楼层
是传输的速度太快了吗  
muyichuan2012 发表于 2022-5-16 12:14 来自手机 | 显示全部楼层
  地板 楼层已回复可以了。conf.h没更新导致。
selongli 发表于 2022-5-16 13:06 | 显示全部楼层
25MHz不好配置波特率吧   
muyichuan2012 发表于 2022-5-16 13:12 | 显示全部楼层
本帖最后由 muyichuan2012 于 2022-5-16 14:06 编辑

用雅特力时钟配置工具,25MHz等各种晶振都是很好配置的。
USART波特率的话,由于25MHz配置的主频也是240MHz,因此USART的配置是没有区别的。
该楼主的问题是没有更新conf.h 里外部晶振的宏大小。现在已ok.
21626281de060d8cc.png



earlmax 发表于 2022-5-16 13:58 | 显示全部楼层
外部晶振25MHz?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

9

帖子

0

粉丝
快速回复 返回顶部 返回列表