文档来源(雅特力官网):https://www.arterytek.com/cn/support/index.jsp?index=0
- 简介
- 时钟树
- 代码配置解析
3.1 函数接口
3.2 时钟配置流程
3.2.1 复位(CRM Reset)
3.2.2 时钟源配置(Clock SourceConfiguration)
1> HEXT
2> HICK
3.2.3 PLL配置(PLL Configuration)
1> PLL时钟源
2> PLL倍频系数
3> PLL频率范围
3.2.4总线分频(Set Bus FrequencyDivision)
3.2.5 切换系统时钟(Switch SystemClock)
1> 顺滑模式
2> HICK系统时钟
3> HEXT系统时钟
4> PLLCLK系统时钟
3.2.6 更新核心频率(Update CoreFrequency)
3.2.7 时钟配置示例- 时钟配置工具
Bork Bench/New_Clock Configuration
1. 简介
时钟是芯片正确高效运行的基础,正确的时钟配置是芯片能正确运行的必要条件,其重要性不言而 喻。AT32各系列产品的时钟配置部分可能存在细微的差异和需要注意的事项,本文档就着重针对各 系列的情况来详细介绍如何结合雅特力提供的V2.x.x的板级支持包(BSP)来配置时钟。
定时器的时钟源通常可以选择系统时钟(SysClk)或者其他时钟源,例如内部时钟(Internal Clock)。
在您的系统中,如果定时器的时钟源选择的是系统时钟(SysClk),那么定时器的时钟频率将会与系统时钟频率一致。
以下介绍时钟配置的方法主要分两种:
1、 以手动编写代码调用BSP中提供的驱动函数接口来进行时钟配置。
2、 采用时钟工具来配置并生成相应的源码文件。
2. 时钟树
在进行时钟配置之前,应充分了解对应芯片的时钟树结构,这样在进行时钟配置时才会游刃有余。对 于系统时钟频率及路径的配置我们需要关注时钟源、倍频及系统时钟部分。类似如下图:
可由图中得到以下几个关键信息:
1) SCLKSEL:系统时钟可以由HEXT、PLLCLK、HICK三大时钟源提供。
2) HEXT:HEXT是外部高速时钟,其可以外接范围是4~25 MHz的晶振或时钟源。
3) HICK:HICK RC是内部高速振荡器,频率为48 MHz。HICK时钟由内部振荡器给出,但在初 始情况下由HICKDIV控制并默认6分频后为8 MHz,亦可配置为不分频,保持48 MHz的频 率。
4) PLLCLK:PLL时钟 = PLL输入时钟 * PLL倍频系数。
5) PLL输入时钟:PLL的输入时钟由PLLRCS及PLLHEXTDIV共同决定,其细分可分为三个来 源:HICK 4MHz、HEXT和HEXTDIV,HEXTDIV由HEXT分频系数决定,默认为2分频。
3. 代码配置解析
以下将以库函数接口为核心来对时钟配置流程和方法进行说明。
3.1 函数接口
各系列产品对应提供的BSP中对硬件的时钟设置部分已封装好接口函数以供调用,以下罗列出时钟 配置常用的函数接口,各函数的具体参数及返回值类型等请参考at32f403a_407_crm.c/.h文件。
3.2 时钟配置流程
按常规应用来讲解时钟配置流程,其内容可大致分为如下步骤:
3.2.1 复位(CRM Reset)
首先按规范流程应复位CRM配置参数,其主要是将系统时钟切换到HICK,其余的系统时钟配置寄 存器写入默认值,待后续进行新配置参数的写入。函数调用的代码实现如下: crm_reset(); /* CRM 复位 */
3.2.2 时钟源配置(Clock Source Configuration)
与系统时钟相关的高速时钟源主要包括HEXT和HICK,PLL也是使用以上时钟源来进行倍频。
需要 在配置使能PLL前将所使用的PLL参考时钟源开启并等待其稳定。
1> HEXT
外部高速时钟如采用外接有源时钟的方式时,可开启旁路模式来进行使用,采用晶振时,不能开启旁 路模式,旁路模式应在外部高速时钟源使能前进行设定,其默认情况为关闭。旁路模式使能代码实现 如下:
crm_hext_bypass(TRUE); /* HEXT时钟旁路模式开启 */
使能HEXT时钟源并等待HEXT时钟稳定,代码实现如下:
crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE); /* 开启HEXT时钟源 */
while(crm_hext_stable_wait() == ERROR){} /* 等待HEXT时钟稳定 */
2> HICK
内部高速时钟是由芯片内部振荡器提供,使能HICK时钟源并等待HICK时钟稳定,代码实现如下:
crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE); /* 开启HICK时钟源 */ while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET){} /* 等待HICK稳定标志置起 */
3.2.3 PLL配置(PLL Configuration)
PLL 配置主要包括:PLL时钟源、PLL倍频系数、PLL倍频频率范围等的设置。倍频时钟公式为: PLLCLK = PLL输入时钟 * PLL倍频系数。
1> PLL时钟源
PLL 时钟源细分有三个来源:1、HICK(4 MHz),2、HEXT,3、HEXT分频时钟,PLL时钟源应 在PLL配置使能前开启并等待稳定。以上PLL时钟源在crm_pll_config函数中对应的参数定义如 下:
CRM_PLL_SOURCE_HICK
CRM_PLL_SOURCE_HEXT
CRM_PLL_SOURCE_HEXT_DIV
当选择PLL时钟源为CRM_PLL_SOURCE_HEXT_DIV时,HEXT的分频系数可以通过函数 crm_hext_clock_div_set 进行设置,其默认分频系数为2分频。
2> PLL倍频系数
倍频系数为2~64倍可选,但应该注意最高主频限制,以此按实际情况来合适选择倍频系数,如8倍 频使用参数CRM_PLL_MULT_8。
3> PLL频率范围
频率范围主要以倍频后的PLLCLK频率来做设定,其范围参数以72 MHz为界限设定,如下:
CRM_PLL_OUTPUT_RANGE_LE72MHZ
CRM_PLL_OUTPUT_RANGE_GT72MHZ
/* PLLCLK 小于等于 72 MHz */
/* PLLCLK 大于 72 MHz */
当PLL参数设置完成后,即可开启PLL并等待PLL稳定。示例:外部时钟晶振8 MHz,采用HEXT 2 分频时钟作为PLL时钟源,PLLCLK倍频到240 MHz的代码实现如下:
crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_60,
CRM_PLL_OUTPUT_RANGE_GT72MHZ);
/* 配置PLL参数 */
crm_hext_clock_div_set(CRM_HEXT_DIV_2);
/* 设置HEXT分频系数 */
crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET){}
3.2.4 总线分频(Set Bus Frequency Division)
总线分频包含SCLK到AHBCLK分频、AHBCLK到APB1CLK分频、AHBCLK到APB2CLK分 频。AHB总线1分频、APB1/APB2总线2分频的代码实现如下:
crm_ahb_div_set(CRM_AHB_DIV_1);
crm_apb2_div_set(CRM_APB2_DIV_2);
/* SCLK 1 分频作为AHB总线时钟 */
/* AHBCLK 2 分频作为APB2总线时钟 */
crm_apb1_div_set(CRM_APB1_DIV_2);
/* AHBCLK 2 分频作为APB1总线时钟 */
3.2.5 切换系统时钟(Switch System Clock)
系统时钟来源主要有三个:HICK、HEXT、PLLCLK。在切换系统时钟到如上时钟源时应提前确保对 应时钟源已稳定。
1> 顺滑模式
时钟顺滑模式是为了确保整个系统时钟切换过程的稳定而设计,当即将切换为系统时钟的目标时钟频 率大于108 MHz时应开启时钟顺滑模式,所以其主要应用对象为PLLCLK用作系统时钟时的场景。 通常使用方法是在系统时钟切换前开始,切换成功后关闭。代码实现如下:
crm_auto_step_mode_enable(TRUE); /* 开启时钟顺滑模式 */
crm_auto_step_mode_enable(FALSE); /* 关闭时钟顺滑模式 */
2> HICK系统时钟
内部高速时钟在系统复位重新运行时默认作为系统时钟,后期代码进行设定时,可有两种频率值来进 行设定(8 MHz和48 MHz)。如图1所述HICK默认情况下用的是8 MHz,可配置为48 MHz。 HICK 8 MHz用作系统时钟的代码实现如下:
crm_sysclk_switch(CRM_SCLK_HICK); /* 切换系统时钟到HICK */
while(crm_sysclk_switch_status_get() != CRM_SCLK_HICK){} /* 等待系统时钟状态为HICK */
HICK 48 MHz用作系统时钟的代码实现如下:
crm_hick_sclk_frequency_select (CRM_HICK_SCLK_48MHZ); /* HICK选择hick48MHz */
crm_sysclk_switch(CRM_SCLK_HICK); /* 切换系统时钟到HICK */
while(crm_sysclk_switch_status_get() != CRM_SCLK_HICK){} /* 等待系统时钟状态为HICK */
3> HEXT系统时钟
外部高速时钟用作系统时钟时,其系统时钟频率以实际使用的外部时钟频率为准,范围为4~25 MHz。HEXT用作系统时钟的代码实现如下:
crm_sysclk_switch(CRM_SCLK_HEXT); /* 切换系统时钟到HEXT */
while(crm_sysclk_switch_status_get() != CRM_SCLK_HEXT){} /* 等待系统时钟状态为HEXT */
4> PLLCLK系统时钟
PLLCLK用作系统时钟时,其系统时钟频率以实际的PLL倍频结果为准。其最高频率应满足芯片规 格为基础。PLLCLK用作系统时钟的代码实现如下:
crm_sysclk_switch(CRM_SCLK_PLL); /* 切换系统时钟到PLL */
while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL){} /* 等待系统时钟状态为PLL */
3.2.6 更新核心频率(Update Core Frequency)
提供的BSP中,其代码框架内保留了一个表示系统核心频率的参数值system_core_clock,其保存 的是CPU核心的运行频率值,应该在每次系统时钟配置完成后来进行更新。为的是在整个代码框架 下,各外设驱动的频率配置能很快获取到当前核心运行频率值并使用。代码实现如下:
system_core_clock_update(); /* 更新系统核心频率值system_core_clock */
3.2.7 时钟配置示例
以下将以完整的时钟配置流程来进行说明,示例:由8 MHz外部时钟晶振作为时钟源,其2分频路 径经PLL倍频到240 MHz并用做系统时钟,AHB不分频,APB1/APB2采用2分频。函数 system_clock_config代码实现如下:
void system_clock_config(void)
{
crm_reset(); /* CRM 复位 */
crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE); /* 使能HEXT时钟源 */
while(crm_hext_stable_wait() == ERROR) /* 等待HEXT时钟稳定 */
{
}
crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_60,
CRM_PLL_OUTPUT_RANGE_GT72MHZ); /* 配置PLL,PLL时钟源选择HEXT分
频路径,倍频系数60倍,PLL频率范围选择大于72 MHz ,公式:PLLCLK = 8 / 2 * 60 = 240 MHz */
crm_hext_clock_div_set(CRM_HEXT_DIV_2); /* HEXT的分频系数采用2分频 */
crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE); /* 使能PLL */
while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET) /* 等待PLL稳定 */
{
}
crm_ahb_div_set(CRM_AHB_DIV_1); /* SCLK 1分频作为AHB总线时钟 */
crm_apb2_div_set(CRM_APB2_DIV_2); /* AHBCLK 2分频作为APB2总线时钟 */
crm_apb1_div_set(CRM_APB1_DIV_2); /* AHBCLK 2分频作为APB1总线时钟 */
crm_auto_step_mode_enable(TRUE); /* 因PLLCLK 240 MHz 大于108 MHz,
开启时钟切换顺滑模式 */
crm_sysclk_switch(CRM_SCLK_PLL); /* 切换系统时钟到PLL */
while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL) /* 等待系统时钟切换状态为PLL */
{
}
crm_auto_step_mode_enable(FALSE); /* 切换完成,关闭时钟切换顺滑模式 */
system_core_clock_update(); /* 更新系统核心频率值 */
}
4. 时钟配置工具
Bork Bench/New_Clock_Configuration
Bork Bench包含New_Clock_Configuration,时钟配置工具是雅特力科技为方便对AT32系列MCU进行时钟配置而开发的一个图形化配置工具,其主旨是使用户清晰了解时钟路径和配置出期望的时钟频率并生成源码文件。
点击进入官网即可免费下载(技术开发与支持->Tool):
雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)