| 本帖最后由 xinmeng_wit 于 2021-2-8 14:22 编辑 
 AT32F407的时钟系统与STM32基本差不多,配置起来也非常简单,官方提供的库文件能很方便对时钟系统进行配置。
 雅特力Cortex-M4时钟最高跑到240MHz,ST最高到180MHz,这一点国产雅特力完胜。
 
 时钟树如下:
 
 
   
 
 
 本次我们将按照图中红色路径配置SYSCLK,HCLK,APB1CLK,APB2CLK.
 
 配置完成后
 SYSCLK = 240MHz
 HCLK    = 240MHz
 APB1CLK=120MHz
 APB2CLK=120MHz
 
 按照官方提供的库进行配置。主要接口都在at32f4xx_rcc.c/h这两个文件里面。
 
 配置函数如下:
 
 
 bool sysclk_init(uint32_t sys_clk, uint32_t AHB_clk, uint32_t APB1_clk, uint32_t APB2_clk)
{
  uint32_t temp = 0;
  uint8_t index = 0;
  
  bool ret = true;
  
  temp = sys_clk / 8;
  if(temp < 2)
  {
    ret = false;
    return ret;
  }
    
  RCC_HSEConfig(RCC_HSE_ENABLE); //HSE enable
  
  while(!RCC_WaitForHSEStable());//wait for HSE start up
  
  RCC_PLLCmd(DISABLE);
  
  /*PLL config*/
  if(sys_clk <= 72)
  {
    RCC_PLLConfig(RCC_PLLRefClk_HSE_Div1, PLL_MULT(30), RCC_Range_LessEqual_72Mhz);
  }
  else
  {
    RCC_PLLConfig(RCC_PLLRefClk_HSE_Div1, PLL_MULT(30), RCC_Range_GreatThan_72Mhz);
  }
  
  RCC_PLLCmd(ENABLE);
  
  while(!RCC_GetFlagStatus(RCC_FLAG_PLLSTBL));//wait for pll ready
  
  RCC_SYSCLKConfig(RCC_SYSCLKSelction_PLL);
  /*AHB CLOCK config*/  
  temp = sys_clk / AHB_clk;
  for(index = 0; index < 9; index++)
  {
    if(temp == AHB_DIV[index][0])
    {
      break;
    }
  }
  
  if(index >= 9)
  {
    index = 0;
  }
  
  RCC_AHBCLKConfig(AHB_DIV[index][1]);
  
  /*APB1 CLOCK config*/
  temp = AHB_clk / APB1_clk;
  for(index = 0; index < 5; index++)
  {
    if(temp == APB_DIV[index][0])
    {
      break;
    }
  }
  
  if(index >= 5)
  {
    index = 0;
  }  
  
  RCC_APB1CLKConfig(APB_DIV[index][1]);
  /*APB2 CLOCK config*/
  temp = AHB_clk / APB2_clk;
  for(index = 0; index < 5; index++)
  {
    if(temp == APB_DIV[index][0])
    {
      break;
    }
  }
  
  if(index >= 5)
  {
    index = 0;
  }  
  
  RCC_APB2CLKConfig(APB_DIV[index][1]);  
  return ret;
}
 为了验证是否配置成功,在main函数里调用RCC_GetClocksFreq()获取当前运行的时钟频率。
 
 
 int main(void)
{
  while(!sysclk_init(240, 240, 120, 120));
  AT32_Board_Init();
  get_sys_select = RCC_GetSYSCLKSelction();
  RCC_GetClocksFreq(&get_RCC_Clocks);
  for(;;)
  {
    AT32_LEDn_Toggle(LED2);
    Delay_ms(500);
    AT32_LEDn_Toggle(LED3);
    Delay_ms(500);
    AT32_LEDn_Toggle(LED4);
    Delay_ms(500);
  }
}
 运行结果:
 
   
 实际运行的时间与配置的一样,符合预期。
 
 发现一个问题:IAR退出debug以后程序不继续运行,板子复位后程序才能继续运行。
 
 
 调st的时候不存在这个问题。
 
 
 
 |