本帖最后由 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的时候不存在这个问题。
|