本帖最后由 夜声 于 2023-1-8 17:23 编辑
#申请原创#@21小跑堂
一、前言
在上一篇讲到AT32使用Lua语言开发,使用Lua完成点灯测试,本次计划完成AT32F437ZMT7的极限超频测试。
二、准备
在进行超频前需要准备一个基本工程,使用GPIO点灯工程。
添加串口Printf打印功能,用于输出芯片内部的系统时钟频率。
三、超频方案
方案一:倍频系数调整
使用软件内部倍频功能,这种方式相对比较简单,当需要看官方的库支不支持,查看官方的系统时钟设置函数。
可以得到PLL倍频由crm_pll_config函数设置得到。接下来在应用手册中查找PLL时钟输出的计算公式。
可以看到PLL倍频的时钟频率由晶振,预分频系数分频后的配置值以及PLL倍频系数决定,根据官方的PLL倍频输出,将其他值进行固定,通过调整PLL的倍频系数就可以调整PLL输出的时钟频率。
查看PLL倍频系数的值是否可以调整,跳转到crm_pll_config,查看第二个输入值得范围,从下图可以得到倍频系数可以从31调整到500,可以完成极限超频测试。
方案二:更换晶振
更换外部晶振,在图中可以看到,开发板板载的晶振为8M,封装是5032贴片晶振,更换起来相对比较麻烦,在可以进行芯片内部倍频的方式是不选择更换外部晶振,更换晶振作为备用方案。
综上所述,选择方案一。
四、极限超频测试
通过上面的描述,超频方法已经确定,现在还需要将超频后的时钟频率的值使用串口输出。
在rm_clocks_freq_get函数中,可以看到超频后的值通过ocks_struct->sclk_freq = (uint32_t)(((uint64_t)pllrcsfreq * pll_ns) / (pll_ms * pll_fr));赋值给了ocks_struct->sclk_freq。
void crm_clocks_freq_get(crm_clocks_freq_type *clocks_struct)
{
uint32_t pll_ns = 0, pll_ms = 0, pll_fr = 0, pll_clock_source = 0, pllrcsfreq = 0;
uint32_t temp = 0, div_value = 0;
crm_sclk_type sclk_source;
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};
static const uint8_t ahb_apb1_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
static const uint8_t ahb_apb2_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
static const uint8_t pll_fr_table[6] = {1, 2, 4, 8, 16, 32};
/* get sclk source */
sclk_source = crm_sysclk_switch_status_get();
switch(sclk_source)
{
case CRM_SCLK_HICK:
if(((CRM->misc1_bit.hick_to_sclk) != RESET) && ((CRM->misc1_bit.hickdiv) != RESET))
clocks_struct->sclk_freq = HICK_VALUE * 6;
else
clocks_struct->sclk_freq = HICK_VALUE;
break;
case CRM_SCLK_HEXT:
clocks_struct->sclk_freq = HEXT_VALUE;
break;
case CRM_SCLK_PLL:
/* get pll clock source */
pll_clock_source = CRM->pllcfg_bit.pllrcs;
/* get multiplication factor */
pll_ns = CRM->pllcfg_bit.pllns;
pll_ms = CRM->pllcfg_bit.pllms;
pll_fr = pll_fr_table[CRM->pllcfg_bit.pllfr];
if (pll_clock_source == CRM_PLL_SOURCE_HICK)
{
/* hick selected as pll clock entry */
pllrcsfreq = HICK_VALUE;
}
else
{
/* hext selected as pll clock entry */
pllrcsfreq = HEXT_VALUE;
}
clocks_struct->sclk_freq = (uint32_t)(((uint64_t)pllrcsfreq * pll_ns) / (pll_ms * pll_fr));
system_clock=clocks_struct->sclk_freq;
break;
default:
clocks_struct->sclk_freq = HICK_VALUE;
break;
}
/* compute sclk, ahbclk, abp1clk and apb2clk frequencies */
/* get ahb division */
temp = CRM->cfg_bit.ahbdiv;
div_value = sclk_ahb_div_table[temp];
/* ahbclk frequency */
clocks_struct->ahb_freq = clocks_struct->sclk_freq >> div_value;
/* get apb1 division */
temp = CRM->cfg_bit.apb1div;
div_value = ahb_apb1_div_table[temp];
/* apb1clk frequency */
clocks_struct->apb1_freq = clocks_struct->ahb_freq >> div_value;
/* get apb2 division */
temp = CRM->cfg_bit.apb2div;
div_value = ahb_apb2_div_table[temp];
/* apb2clk frequency */
clocks_struct->apb2_freq = clocks_struct->ahb_freq >> div_value;
}
定义一个变量将值转出来,uint32_t system_clock;
主函数,添加系统时钟频率输出。
查看没调整前的系统时钟频率,默认为288MHZ
接下来开始超频测试,取350MHZ,进行测试,心跳灯闪烁继续超频,若心跳灯不闪则证明芯片已经不能工作。
芯片还能工作,继续提高倍频系数,超频到380MHZ
灯还在工作,串口还在输出,接下来将系统时钟调到400MHZ
芯片工作正常,继续调整,调整都410MHZ
芯片还在运行,将系统时钟频率调整到420MHZ
将系统时钟频率调整到420MHZ时,串口没有输出,LED灯熄灭,不在闪烁。证明AT32F437ZMT7的极限频率在410MHZ~420MHZ之间,测试414MHZ,芯片还是死机。
继续测试412MHZ,程序下载到芯片中,发现LED闪烁,串口继续输出,即AT32F437ZMT7的极限频率为412MHZ。
五、总结
本次测试完成AT32F437ZMT7的极限超频测试,采用的是修改PLL倍频系数的方法,得到AT32F437ZMT7的极限频率为412MHZ。
|