02、W601配置时钟
一、w601时钟树
如图就是W601整个芯片的时钟树,暂时对我们初始化系统时钟没有什么用,不过以后配置基本外设时钟还是有用的。
因为W601是M3内核,所以还是看内核。
……看了一下W601的SDK的API,已经为我们提供了配置系统时钟的接口:
void tls_sys_clk_set(u32 clk);
没错,只要调用这个接口就好了。其实我也找了寄存器文档,并没有介绍有关系统时钟的配置,只知道W601可以工作在80MHz。既然提供了接口那就用吧。其中SDK有个wm_regs.h文件,顾名思义,这就是寄存器配置,在其中可以找到有关W601的寄存器的地址,这个是由厂家提供的。
那是不是直接调用一下这个接口就行了呢?其实也是可以的,但是我们要考虑到整个芯片的结构,根据整个板子的特点来初始化系统时钟,并且封装成一个函数。
如图就是W601的芯片结构图。
这里我们仿照linux arm 板BootLoader中的写法,把时钟初始化放到.S汇编文件中,这样在配置好系统时钟之后在让程序进入到main函数,那么我们需要在配置系统时钟里面干些什么呢?
- 初始化系统时钟
- 关闭所有IO口的复用功能
- 配置中断优先级组
- 配置低功耗模式
- 配置PMU的时钟,因为芯片的框图里面有PMU,PMU 部分作为芯片的常供电模块提供了上电时序管理,起振时钟,实时时钟功能等
void SystemInit(void)
{
/*系统时钟设置为80MHz*/
tls_sys_clk_set(CPU_CLK_80M);
/*关闭所有IO的复用功能,只开启SWD复用功能*/
wm_gpio_af_disable();
/*中断优先级组配置*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/*配置深度睡眠低功耗模式*/
NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP, ENABLE);
/*选择PMU时钟*/
tls_pmu_clk_select(0);
}
配置好系统时钟需要把它放到汇编启动文件当中,我们先让系统时钟初始化然后再跳转到main函数中。
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
MOV R0, #0
MSR PRIMASK,R0
LDR R0, =__main
BX R0
ENDP
到此,关于W601的系统时钟就配置好了。
BX R0
ENDP
到此,关于W601的系统时钟就配置好了。