[AT32L021] 【AT-START-L021测评】时钟配置以及超频试验

[复制链接]
 楼主| lulugl 发表于 2024-11-25 22:54 | 显示全部楼层 |阅读模式
【前言】
AT32L021的最大运行时钟可以运行在80MHz,最低可以运行在4MHz。主频运行时钟,是动态控制MCU运行功耗的一个工具,通过他的时钟树,我们可以通过选择不同的时钟源以及修改不同的分频系数,就可以设置MCU的运行频率以及AHB、APB的不同时钟,来达到动态功耗的控制效果。本篇旨在学习配置不同的时钟,同时通过printf孙子函数输出当前系统的运行时钟,同时还进行超频测试来试验总线最大可运行时钟频率。
【时钟树的简介以及配置】
1、AT32L021系列微控制器系统架构如下图所示
3240867447769df928.png
时钟通过HEXT、HICKI、PLL进入CRM,然后进入AHB总线,APB1与APB2挂载到AHB总线上,这三个总线都可以最大运行在80MHz中。
2、AT32L021时钟结构图如下:
643056744781f2885a.png
从图中,我们可以看到可以有多种时钟配置到达SCLK中,结合Work Bench时钟配置,我们可以更加清晰的看到AT32L021的几条线路:
75220674478b2c0542.png
在《AT32L021系列 技术手册》的第4章,时钟和复位管理中,总线时钟可以有两种,一种为内部时钟源HICK,另一个为外部时钟源HEXT。通过不同的线路,我们可以得知有以下几条线路可以配置SCLK的时钟:
时钟走线图.png
我们通过sclk_select三个选择,可以选定从Hext、hick、以及PLL作为输入源,在寄存器CRM_CFG的SCLKSEL系统选择中可以选择时来源,在手册中有如下所述:
8202767447e4db0f2d.png
当然我也们可以查询SCLKSTS,当前所选的状态位。
在at32l021_crm.c中有库函数crm_clock_source_enable来选择时钟源

  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  enable or disable the crm clock source
  3.   * @param  source
  4.   *         this parameter can be one of the following values:
  5.   *         - CRM_CLOCK_SOURCE_HICK
  6.   *         - CRM_CLOCK_SOURCE_HEXT
  7.   *         - CRM_CLOCK_SOURCE_PLL
  8.   *         - CRM_CLOCK_SOURCE_LEXT
  9.   *         - CRM_CLOCK_SOURCE_LICK
  10.   * @param  new_state (TRUE or FALSE)
  11.   * @retval none
  12.   */
  13. void crm_clock_source_enable(crm_clock_source_type source, confirm_state new_state)
  14. {
  15.   switch(source)
  16.   {
  17.     case CRM_CLOCK_SOURCE_HICK:
  18.       CRM->ctrl_bit.hicken = new_state;
  19.       break;
  20.     case CRM_CLOCK_SOURCE_HEXT:
  21.       CRM->ctrl_bit.hexten = new_state;
  22.       break;
  23.     case CRM_CLOCK_SOURCE_PLL:
  24.       CRM->ctrl_bit.pllen = new_state;
  25.       break;
  26.     case CRM_CLOCK_SOURCE_LEXT:
  27.     {
  28.       if(new_state == TRUE)
  29.       {
  30.         CRM->bpdc |= 0x19;
  31.       }
  32.       else
  33.       {
  34.         CRM->bpdc_bit.lexten = FALSE;
  35.       }
  36.       break;
  37.     }
  38.     case CRM_CLOCK_SOURCE_LICK:
  39.       CRM->ctrlsts_bit.licken = new_state;
  40.       break;
  41.     default:
  42.       break;
  43.   }
  44. }
当然在选择时钟源为PLL时,必须选配置前面的分频等,在at32l021_crm.c中有库函数crm_pll_config来配置倍频值 ,他的函数原型如下:
  1. /**
  2.   * @brief  config crm pll
  3.   * @param  clock_source
  4.   *         this parameter can be one of the following values:
  5.   *         - CRM_PLL_SOURCE_HICK
  6.   *         - CRM_PLL_SOURCE_HEXT
  7.   *         - CRM_PLL_SOURCE_HEXT_DIV
  8.   * @param  mult_value (CRM_PLL_MULT_2~64)
  9.   * @retval none
  10.   */
  11. void crm_pll_config(crm_pll_clock_source_type clock_source, crm_pll_mult_type mult_value)
  12. {
  13.   uint32_t pllrcfreq = 0;
  14.   crm_pll_fref_type pllfref = CRM_PLL_FREF_4M;

  15.   /* config pll clock source */
  16.   if(clock_source == CRM_PLL_SOURCE_HICK)
  17.   {
  18.     CRM->cfg_bit.pllrcs = FALSE;
  19.     pllrcfreq = (HICK_VALUE / 2);
  20.   }
  21.   else
  22.   {
  23.     CRM->cfg_bit.pllrcs = TRUE;
  24.     if(CRM_PLL_SOURCE_HEXT == clock_source)
  25.     {
  26.       pllrcfreq = HEXT_VALUE;
  27.       CRM->cfg_bit.pllhextdiv = FALSE;
  28.     }
  29.     else
  30.     {
  31.       pllrcfreq = (HEXT_VALUE / 2);
  32.       CRM->cfg_bit.pllhextdiv = TRUE;
  33.     }
  34.   }

  35.   if((pllrcfreq > 3900000U) && (pllrcfreq < 5000000U))
  36.   {
  37.     pllfref = CRM_PLL_FREF_4M;
  38.   }
  39.   else if((pllrcfreq > 5200000U) && (pllrcfreq < 6250000U))
  40.   {
  41.     pllfref = CRM_PLL_FREF_6M;
  42.   }
  43.   else if((pllrcfreq > 7812500U) && (pllrcfreq < 8330000U))
  44.   {
  45.     pllfref = CRM_PLL_FREF_8M;
  46.   }
  47.   else if((pllrcfreq > 8330000U) && (pllrcfreq < 12500000U))
  48.   {
  49.     pllfref = CRM_PLL_FREF_12M;
  50.   }
  51.   else if((pllrcfreq > 15625000U) && (pllrcfreq < 20830000U))
  52.   {
  53.     pllfref = CRM_PLL_FREF_16M;
  54.   }
  55.   else if((pllrcfreq > 20830000U) && (pllrcfreq < 31255000U))
  56.   {
  57.     pllfref = CRM_PLL_FREF_25M;
  58.   }

  59.   /* config pll multiplication factor */
  60.   CRM->cfg_bit.pllmult_l = (mult_value & 0x0F);
  61.   CRM->cfg_bit.pllmult_h = ((mult_value & 0x30) >> 4);

  62.   /* config pll fref */
  63.   CRM->pll_bit.pllfref = pllfref;
  64. }
在固件库使用说明中的5.3.22有详细的参数与配置说明:
3332267448081cafa0.png
当然如果需要复杂的配置,系统还提供了crm_pll_config2来做更加复杂的配置
27002674481027bbcf.png
【总线时钟的配置】
在配置好SCLK后,配置如AHB、APB1、APB2就相对于简单许多了,在AT32 Work Bench中可以非常直观的看到,如下图所示。
25654674482588e91f.png
在1中是对AHB总线进行分频,2是对APB1进行分频,3是对APB2进行分频,当然还可以对相关的ADC、TMR等进行更细的分频。
在AT32L021数据手册中,对AHB、APB1、APB2的配置分别是CRM_CFG的AHBDIV、APB1DIV、APB2DIV以及ADCDIV,如下图所示,详细的讲明了寄存器的分频因子:
35587674483a72a88f.png

在at32l021_crm.c中有如下三个函数是来设置他们的分频因子的:
  1. /**
  2.   * @brief  set crm ahb division
  3.   * @param  value
  4.   *         this parameter can be one of the following values:
  5.   *         - CRM_AHB_DIV_1
  6.   *         - CRM_AHB_DIV_2
  7.   *         - CRM_AHB_DIV_4
  8.   *         - CRM_AHB_DIV_8
  9.   *         - CRM_AHB_DIV_16
  10.   *         - CRM_AHB_DIV_64
  11.   *         - CRM_AHB_DIV_128
  12.   *         - CRM_AHB_DIV_256
  13.   *         - CRM_AHB_DIV_512
  14.   * @retval none
  15.   */
  16. void crm_ahb_div_set(crm_ahb_div_type value)
  17. {
  18.   CRM->cfg_bit.ahbdiv = value;
  19. }

  20. /**
  21.   * @brief  set crm apb1 division
  22.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]   the maximum frequency of APB1/APB2 clock is 96 MHz
  23.   * @param  value
  24.   *         this parameter can be one of the following values:
  25.   *         - CRM_APB1_DIV_1
  26.   *         - CRM_APB1_DIV_2
  27.   *         - CRM_APB1_DIV_4
  28.   *         - CRM_APB1_DIV_8
  29.   *         - CRM_APB1_DIV_16
  30.   * @retval none
  31.   */
  32. void crm_apb1_div_set(crm_apb1_div_type value)
  33. {
  34.   CRM->cfg_bit.apb1div = value;
  35. }

  36. /**
  37.   * @brief  set crm apb2 division
  38.   * @note   the maximum frequency of APB1/APB2 clock is 96 MHz
  39.   * @param  value
  40.   *         this parameter can be one of the following values:
  41.   *         - CRM_APB2_DIV_1
  42.   *         - CRM_APB2_DIV_2
  43.   *         - CRM_APB2_DIV_4
  44.   *         - CRM_APB2_DIV_8
  45.   *         - CRM_APB2_DIV_16
  46.   * @retval none
  47.   */
  48. void crm_apb2_div_set(crm_apb2_div_type value)
  49. {
  50.   CRM->cfg_bit.apb2div = value;
  51. }

  52. /**
  53.   * @brief  set crm adc division
  54.   * @param  value
  55.   *         this parameter can be one of the following values:
  56.   *         - CRM_ADC_DIV_2
  57.   *         - CRM_ADC_DIV_4
  58.   *         - CRM_ADC_DIV_6
  59.   *         - CRM_ADC_DIV_8
  60.   *         - CRM_ADC_DIV_3
  61.   *         - CRM_ADC_DIV_12
  62.   *         - CRM_ADC_DIV_5
  63.   *         - CRM_ADC_DIV_16
  64.   * @retval none
  65.   */
  66. void crm_adc_clock_div_set(crm_adc_div_type div_value)
  67. {
  68.   CRM->cfg_bit.adcdiv_l = div_value & 0x03;
  69.   CRM->cfg_bit.adcdiv_h = (div_value >> 2) & 0x01;
  70. }
【当前时钟频率的获取】
在at32l021_crm.c中有一个函数是获取片上时钟频率的函数,其函数原型如下:
  1. /**
  2.   * @brief  get crm clocks freqency
  3.   * @param  clocks
  4.   *         - pointer to the crm_clocks_freq structure
  5.   * @retval none
  6.   */
  7. void crm_clocks_freq_get(crm_clocks_freq_type *clocks_struct)
  8. {
  9.   uint32_t pll_mult = 0, pll_mult_h = 0, pll_clock_source = 0, temp = 0, div_value = 0;
  10.   uint32_t pllrcsfreq = 0, pll_ms = 0, pll_ns = 0, pll_fr = 0;
  11.   crm_sclk_type sclk_source;

  12.   static const uint8_t sclk_ahb_div_table[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  13.   static const uint8_t ahb_apb1_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  14.   static const uint8_t ahb_apb2_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  15.   static const uint8_t adc_div_table[8] = {2, 4, 6, 8, 2, 12, 8, 16};

  16.   /* get sclk source */
  17.   sclk_source = crm_sysclk_switch_status_get();

  18.   switch(sclk_source)
  19.   {
  20.     case CRM_SCLK_HICK:
  21.       if(CRM->misc2_bit.hick_to_sclk != RESET)
  22.         clocks_struct->sclk_freq = HICK_VALUE * 6;
  23.       else
  24.         clocks_struct->sclk_freq = HICK_VALUE;
  25.       break;
  26.     case CRM_SCLK_HEXT:
  27.       clocks_struct->sclk_freq = HEXT_VALUE;
  28.       break;
  29.     case CRM_SCLK_PLL:
  30.       pll_clock_source = CRM->cfg_bit.pllrcs;
  31.       if(CRM->pll_bit.pllcfgen == FALSE)
  32.       {
  33.         /* get multiplication factor */
  34.         pll_mult = CRM->cfg_bit.pllmult_l;
  35.         pll_mult_h = CRM->cfg_bit.pllmult_h;

  36.         /* process high bits */
  37.         if((pll_mult_h != 0U) || (pll_mult == 15U))
  38.         {
  39.           pll_mult += ((16U * pll_mult_h) + 1U);
  40.         }
  41.         else
  42.         {
  43.           pll_mult += 2U;
  44.         }

  45.         if (pll_clock_source == 0x00)
  46.         {
  47.           /* hick divided by 2 selected as pll clock entry */
  48.           clocks_struct->sclk_freq = (HICK_VALUE >> 1) * pll_mult;
  49.         }
  50.         else
  51.         {
  52.           /* hext selected as pll clock entry */
  53.           if (CRM->cfg_bit.pllhextdiv != RESET)
  54.           {
  55.             /* hext clock divided by 2 */
  56.             clocks_struct->sclk_freq = (HEXT_VALUE / 2) * pll_mult;
  57.           }
  58.           else
  59.           {
  60.             clocks_struct->sclk_freq = HEXT_VALUE * pll_mult;
  61.           }
  62.         }
  63.       }
  64.       else
  65.       {
  66.         pll_ms = CRM->pll_bit.pllms;
  67.         pll_ns = CRM->pll_bit.pllns;
  68.         pll_fr = CRM->pll_bit.pllfr;

  69.         if (pll_clock_source == 0x00)
  70.         {
  71.           /* hick divided by 2 selected as pll clock entry */
  72.           pllrcsfreq = (HICK_VALUE >> 1);
  73.         }
  74.         else
  75.         {
  76.           /* hext selected as pll clock entry */
  77.           if (CRM->cfg_bit.pllhextdiv != RESET)
  78.           {
  79.             /* hext clock divided by 2 */
  80.             pllrcsfreq = (HEXT_VALUE / 2);
  81.           }
  82.           else
  83.           {
  84.             pllrcsfreq = HEXT_VALUE;
  85.           }
  86.         }
  87.         clocks_struct->sclk_freq = (uint32_t)(((uint64_t)pllrcsfreq * pll_ns) / (pll_ms * (0x1 << pll_fr)));
  88.       }
  89.       break;
  90.     default:
  91.       clocks_struct->sclk_freq = HICK_VALUE;
  92.       break;
  93.   }

  94.   /* compute sclk, ahbclk, abp1clk apb2clk and adcclk frequencies */
  95.   /* get ahb division */
  96.   temp = CRM->cfg_bit.ahbdiv;
  97.   div_value = sclk_ahb_div_table[temp];
  98.   /* ahbclk frequency */
  99.   clocks_struct->ahb_freq = clocks_struct->sclk_freq >> div_value;

  100.   /* get apb1 division */
  101.   temp = CRM->cfg_bit.apb1div;
  102.   div_value = ahb_apb1_div_table[temp];
  103.   /* apb1clk frequency */
  104.   clocks_struct->apb1_freq = clocks_struct->ahb_freq >> div_value;

  105.   /* get apb2 division */
  106.   temp = CRM->cfg_bit.apb2div;
  107.   div_value = ahb_apb2_div_table[temp];
  108.   /* apb2clk frequency */
  109.   clocks_struct->apb2_freq = clocks_struct->ahb_freq >> div_value;

  110.   /* get adc division */
  111.   temp = CRM->cfg_bit.adcdiv_h;
  112.   temp = ((temp << 2) | (CRM->cfg_bit.adcdiv_l));
  113.   div_value = adc_div_table[temp];
  114.   /* adcclk clock frequency */
  115.   clocks_struct->adc_freq = clocks_struct->apb2_freq / div_value;
  116. }
其参数的输入与输出,在BSP手册中的5.3.26中有说明,如下图所示:
22784674484deb52f8.png
经过以上数据手册以及寄存器的了解,再结合官方生成的代码,那么我们如何在运行时修改时钟源以及时钟运行频率,在官方的示例中有一个示例为sclk_switch,他的有两个切换函数,我们结合两个函数来理一理,如果切换时钟。
【时钟切换】
时钟切换需要按以下步骤进行:
1、将时钟复位管理模块的寄存器和控制状态复位,函数为crm_rest。
2、修改闪存访问等周期,在FLASH_PSR寄存器中有介绍,分为三个档位,他的设置如下:
67545674486773c601.png
在我们在设计预期时钟时要根据以32\64\这两个界限来设定,时钟越高,设置等待延时要越多。他的设置函数为flash_psr_set;
3、使能电源控制(PWC)外设时钟。
4、配置电源LDO 输出电压设定值,即为电压监测临界值的选择
130576744884b24a3f.png
5、接下来使能我们需要的时钟源
6、等待内部(外部)时钟源稳定标位CRM_HICK_STABLE_FLAG。
7、配置pll的分频因子
8、使能pll时钟选择
9、等待配置的时钟源稳定。
10、对AHB、APB1、APB2,有必需要再配置ADC或者TMR等分频因子。
11,选择预期的时钟源
12、待待选择的时钟源稳定。
13、重置系统时钟的变量
在示例中函数配置如下:
  1. /**
  2.   * @brief  config sclk 64 mhz with hick clock source.
  3.   * @note   the system clock is configured as follow:
  4.   *         system clock (sclk)   = hick / 2 * pll_mult
  5.   *         system clock source   = pll (hick)
  6.   *         - hick                = HICK_VALUE
  7.   *         - sclk                = 64000000
  8.   *         - ahbdiv              = 1
  9.   *         - ahbclk              = 64000000
  10.   *         - apb2div             = 1
  11.   *         - apb2clk             = 64000000
  12.   *         - apb1div             = 1
  13.   *         - apb1clk             = 64000000
  14.   *         - pll_mult            = 16
  15.   *         - flash_wtcyc         = 1 cycle
  16.   * @param  none
  17.   * @retval none
  18.   */
  19. static void sclk_64m_hick_config(void)
  20. {
  21.   /* reset crm */
  22.   crm_reset();

  23.   /* config flash psr register */
  24.   flash_psr_set(FLASH_WAIT_CYCLE_1);

  25.   /* enable pwc periph clock */
  26.   crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);

  27.   /* config ldo voltage */
  28.   pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V2);

  29.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

  30.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);

  31.   /* wait till hick is ready */
  32.   while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
  33.   {
  34.   }

  35.   /* config pll clock resource */
  36.   crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_16);

  37.   /* enable pll */
  38.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  39.   /* wait till pll is ready */
  40.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  41.   {
  42.   }

  43.   /* config ahbclk */
  44.   crm_ahb_div_set(CRM_AHB_DIV_1);

  45.   /* config apb2clk, the maximum frequency of APB1/APB2 clock is 80 MHz  */
  46.   crm_apb2_div_set(CRM_APB2_DIV_1);

  47.   /* config apb1clk, the maximum frequency of APB1/APB2 clock is 80 MHz  */
  48.   crm_apb1_div_set(CRM_APB1_DIV_1);

  49.   /* select pll as system clock source */
  50.   crm_sysclk_switch(CRM_SCLK_PLL);

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

  55.   /* update system_core_clock global variable */
  56.   system_core_clock_update();

  57.   /* config systick delay */
  58.   delay_init();

  59.   /* config clkout */
  60.   clkout_config();
  61.        
  62. }
【当前时钟状态的打印】
为了更好的了解时钟当前频率,我写了一个时钟打印的函数,使用crm_clocks_freq_type,获取到当前系统运行的时钟:
  1. /*
  2. *打印时钟频率
  3. */
  4. void clk_print(void)
  5. {
  6.         crm_clocks_freq_type get_clocks_struct;
  7.        
  8.         crm_clocks_freq_get(&get_clocks_struct);
  9.   printf("\r\n--------------------\r\n");
  10.         printf("SCLK_FREQ:%dMHz\r\n",(get_clocks_struct.sclk_freq)/(1000*1000));
  11.         printf("AHB_FREQ: %dMHz\r\n", get_clocks_struct.ahb_freq/(1000*1000));
  12.         printf("APB2_FREQ:%dMHz\r\n", get_clocks_struct.apb2_freq/(1000*1000));
  13.         printf("APB1_FREQ:%dMHz\r\n", get_clocks_struct.apb1_freq/(1000*1000));
  14.         printf("ADC_FREQ:%dMHz\r\n", get_clocks_struct.adc_freq/(1000*1000));
  15.         printf("--------------------\r\n");
  16. }
在示例中,他还配置了当前时钟进行4分频后输出到PA8上,方便用示波器来观察实际的运行
  1. /**
  2.   * @brief  clkout configuration.
  3.   * @param  none
  4.   * @retval none
  5.   */
  6. void clkout_config(void)
  7. {
  8.   gpio_init_type gpio_init_struct;

  9.   /* enable gpio port clock */
  10.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  11.   /* set default parameter */
  12.   gpio_default_para_init(&gpio_init_struct);

  13.   /* clkout gpio init */
  14.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  15.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  16.   gpio_init_struct.gpio_pins = GPIO_PINS_8;
  17.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  18.   gpio_init(GPIOA, &gpio_init_struct);
  19.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_0);

  20.   /* config clkout division */
  21.   crm_clkout_div_set(CRM_CLKOUT_DIV_1);

  22.   /* config clkout clock */
  23.   crm_clock_out_set(CRM_CLKOUT_PLL_DIV_4);
  24. }
【实验现象】
编译并下载到开发板后,从串口助手可以了解到系统当前的运行状态。当按下按键后,系修改了时钟频率,再按一次用户按键,又打印出当前的状态:
9025267448b6b6b15e.png
示波器观查,64MHz经4分频后的波形:
9792567448bce84cfe.jpg
经4分频后,实际运行的频率为16.1MHz稍有出入。
观察80MHz时(外部时钟作为时钟源)
4852867448c2581756.jpg
经4分频后,实际为20MHz而且非常稳定。
经对比,如果需要高精的时钟,还是需要使用外部晶振来做时基比较好。
【超频测试】
在用户手册中,注明了最高频率为80MHz,我下面对PLL进行修改以达到更高的频率,查看系统时否能稳定运行。
1、修改HSE的PLL为12,系统可以稳定的运行在96MHZ:
3675467448d17133ec.png
2、修改HSE的PLL为14,系统可以稳定的运行在112MHZ:
889567448d5b18516.png
3、修改为16,系统可以稳定的运行在128MHZ:
6707967448d9860028.png

4、修改为18,系统可以稳定的运行在144MHz:
8199267448e550b274.png
修改到19倍频时,转换过去就发生错误了。
【超频小结】
这颗M0+的性能还是非常好的,可以超频到144MHz还是可以稳定的运行的。
【时钟配置总结】
经过我详细阅读数据手册、BSP库使用手册以及相关的例程,对AT32L021的时钟相关寄存器进行分析,结合示例等进行详细的解读,同时通过对示例的修改,成功的完成了时钟源的转换,不同时钟频率的设置,最后对这颗MCU进行了超频试验。全面的掌握了AT32L021的时钟设置,为以后的工程设计打下了坚实的基础。

呐咯密密 发表于 2024-12-8 10:38 | 显示全部楼层
这个144M稳定运行有些过于武断了,只是测试了一个printf打印,很多高速的通信都没做。
 楼主| lulugl 发表于 2024-12-8 11:59 | 显示全部楼层
呐咯密密 发表于 2024-12-8 10:38
这个144M稳定运行有些过于武断了,只是测试了一个printf打印,很多高速的通信都没做。 ...

对的对的,不过串口能稳定通信,说明就莫得问题,官方建议是80M。下次做个长时间测试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

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