时钟设置

Overview

以 AC638N 为例,提供用户时钟设置接口的应用示例。

应用示例

  • 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。

工程配置

  • 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 接示波器,可以观察初始输出频率是否正常,重新切换频率后是否有效。

常见问题

如何使用外部晶振做时钟源?

答:使用外部晶振时,例如使用外部 24M 晶振, int main() 代码中要作以下修改:

clk_early_init(SYS_CLOCK_INPUT_PLL_BT_OSC, 24000000, 24000000);

同时在 bsp\AC638N\tools\isd_config.ini 文件中,注释掉: #PLL_SRC=LRC;   //选择内部LRC做时钟源

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)

打印时钟配置信息