[活动专区] 【AT-START-F407测评】2.时钟配置

[复制链接]
 楼主| xinmeng_wit 发表于 2021-2-8 14:19 | 显示全部楼层 |阅读模式
本帖最后由 xinmeng_wit 于 2021-2-8 14:22 编辑

AT32F407的时钟系统与STM32基本差不多,配置起来也非常简单,官方提供的库文件能很方便对时钟系统进行配置。
雅特力Cortex-M4时钟最高跑到240MHz,ST最高到180MHz,这一点国产雅特力完胜。

时钟树如下:

2.jpg



本次我们将按照图中红色路径配置SYSCLK,HCLK,APB1CLK,APB2CLK.

配置完成后
SYSCLK = 240MHz
HCLK    = 240MHz
APB1CLK=120MHz
APB2CLK=120MHz

按照官方提供的库进行配置。主要接口都在at32f4xx_rcc.c/h这两个文件里面。

配置函数如下:

  1. bool sysclk_init(uint32_t sys_clk, uint32_t AHB_clk, uint32_t APB1_clk, uint32_t APB2_clk)
  2. {
  3.   uint32_t temp = 0;
  4.   uint8_t index = 0;
  5.   
  6.   bool ret = true;
  7.   
  8.   temp = sys_clk / 8;
  9.   if(temp < 2)
  10.   {
  11.     ret = false;
  12.     return ret;
  13.   }
  14.    
  15.   RCC_HSEConfig(RCC_HSE_ENABLE); //HSE enable
  16.   
  17.   while(!RCC_WaitForHSEStable());//wait for HSE start up
  18.   
  19.   RCC_PLLCmd(DISABLE);
  20.   
  21.   /*PLL config*/
  22.   if(sys_clk <= 72)
  23.   {
  24.     RCC_PLLConfig(RCC_PLLRefClk_HSE_Div1, PLL_MULT(30), RCC_Range_LessEqual_72Mhz);
  25.   }
  26.   else
  27.   {
  28.     RCC_PLLConfig(RCC_PLLRefClk_HSE_Div1, PLL_MULT(30), RCC_Range_GreatThan_72Mhz);
  29.   }
  30.   
  31.   RCC_PLLCmd(ENABLE);
  32.   
  33.   while(!RCC_GetFlagStatus(RCC_FLAG_PLLSTBL));//wait for pll ready
  34.   
  35.   RCC_SYSCLKConfig(RCC_SYSCLKSelction_PLL);

  36.   /*AHB CLOCK config*/  
  37.   temp = sys_clk / AHB_clk;
  38.   for(index = 0; index < 9; index++)
  39.   {
  40.     if(temp == AHB_DIV[index][0])
  41.     {
  42.       break;
  43.     }
  44.   }
  45.   
  46.   if(index >= 9)
  47.   {
  48.     index = 0;
  49.   }
  50.   
  51.   RCC_AHBCLKConfig(AHB_DIV[index][1]);
  52.   
  53.   /*APB1 CLOCK config*/
  54.   temp = AHB_clk / APB1_clk;
  55.   for(index = 0; index < 5; index++)
  56.   {
  57.     if(temp == APB_DIV[index][0])
  58.     {
  59.       break;
  60.     }
  61.   }
  62.   
  63.   if(index >= 5)
  64.   {
  65.     index = 0;
  66.   }  
  67.   
  68.   RCC_APB1CLKConfig(APB_DIV[index][1]);

  69.   /*APB2 CLOCK config*/
  70.   temp = AHB_clk / APB2_clk;
  71.   for(index = 0; index < 5; index++)
  72.   {
  73.     if(temp == APB_DIV[index][0])
  74.     {
  75.       break;
  76.     }
  77.   }
  78.   
  79.   if(index >= 5)
  80.   {
  81.     index = 0;
  82.   }  
  83.   
  84.   RCC_APB2CLKConfig(APB_DIV[index][1]);  
  85.   return ret;
  86. }


为了验证是否配置成功,在main函数里调用RCC_GetClocksFreq()获取当前运行的时钟频率。

  1. int main(void)
  2. {
  3.   while(!sysclk_init(240, 240, 120, 120));
  4.   AT32_Board_Init();
  5.   get_sys_select = RCC_GetSYSCLKSelction();
  6.   RCC_GetClocksFreq(&get_RCC_Clocks);
  7.   for(;;)
  8.   {
  9.     AT32_LEDn_Toggle(LED2);
  10.     Delay_ms(500);
  11.     AT32_LEDn_Toggle(LED3);
  12.     Delay_ms(500);
  13.     AT32_LEDn_Toggle(LED4);
  14.     Delay_ms(500);
  15.   }
  16. }


运行结果:
2.jpg

实际运行的时间与配置的一样,符合预期。

发现一个问题:IAR退出debug以后程序不继续运行,板子复位后程序才能继续运行。


调st的时候不存在这个问题。


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

本版积分规则

70

主题

276

帖子

2

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