5. 时钟设置
Overview
以 AC638N 为例,提供用户时钟设置接口的应用示例。
5.1. 应用示例
AC638N 的初始时钟设置为24M,详见 sdk/bsp/AC638N/src/boot.c 中的主函数
int main()
:clk_early_init(SYS_CLOCK_INPUT_PLL_RCL, 32768, 24000000);
Important
SDK 默认为省晶振方案,芯片需要校准(trim)后,时钟才正常,省晶振方案不能选择OSC做时钟源,否则,外设模块(例如timer、uart)将无法正常使用。
用户可以根据自己的需求去设置不同的时钟频率,代码跑起来后可以使用接口 clk_set 重新设置时钟,示例设置为 48M。
5.2. 工程配置
在 sdk/apps/main.c 中函数
user_main()
添加如下工程代码:int user_main() { mdelay(10000); clk_set("sys", ,48*1000000); clk_out(IO_PORTA_03, HSB_CLK_OUT); }
编译下载后,PA3 接示波器,可以观察初始输出频率是否正常,重新切换频率后是否有效。
5.3. 常见问题
如何使用外部晶振做时钟源?
答:使用外部晶振时,例如使用外部 24M 晶振,
int main()
代码中要作以下修改:clk_early_init(SYS_CLOCK_INPUT_PLL_BT_OSC, 24000000, 24000000);同时在
bsp\AC638N\tools\isd_config.ini
文件中,注释掉:#PLL_SRC=LRC; //选择内部LRC做时钟源
。
5.4. API参考
时钟常用相关API介绍,具体软件代码见 sdk/bsp/AC638N/src/clock.c
Functions
-
int clk_early_init(u8 sys_in, u32 input_freq, u32 out_freq)
clk_early_init 时钟初始化
- Parameters
sys_in – SYS_CLOCK_INPUT_BT_OSC SYS_CLOCK_INPUT_PLL_RCL
input_freq – 24000000
out_freq – sys 时钟
- Returns
-
int clk_get(const char *name)
获取各种模块的时钟源
- Parameters
name – 模块名:包含sys lsb uart timer sd spi adc mcpwm plink pll
-
void clk_set_en(u8 en)
时钟设置使能
- Parameters
en – 0:关闭时钟切换功能,1:允许调用clk_set修改系统时钟
-
int clk_set(const char *name, int clk)
支持设置 sys 时钟
- Parameters
name – 模块名
clk – [24|32|48|64|96|128|192] * 100000
- Returns
返回实际频率
-
void clk_out(u8 gpio, enum CLK_OUT_SOURCE clk)
输出时钟到io
- Parameters
gpio – 对应gpio
clk – 输出时钟源
-
void clk_dump(void)
打印时钟配置信息