打印
[活动专区]

【AT-START-F407测评】2.时钟配置

[复制链接]
549|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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的时候不存在这个问题。


1.jpg (314.11 KB )

1.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

240

帖子

1

粉丝