S32K144的SDK库中两种时钟初始化的区别(一)
文章目录
- 1.背景
- 2.初始化代码分析
1.背景
在使用时钟初始化时,官方的例程中一直在使用两个函数来进行初始化,如下:
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_DRV_GetFreq(CORE_CLK, &i);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
而还有一个用于时钟初始化的函数,如下:
CLOCK_DRV_Init(&clockMan1_InitConfig0);
笔者第一次使用S32K144时,并没有看官方的例程,一直在使用CLOCK_DRV_Init这个函数来初始化时钟,很明显,这种方式比较简洁,但是不论是3.00的SDK例程还是4.03的SDK例程,均使用了第一种方式来做时钟初始化,那这两种时钟的设置有哪些区别呢?此篇文章先分析一下CLOCK_DRV_Init函数。
2.初始化代码分析
官网的注释大致是“仅对时钟相关寄存器进行设置,不通知驱动”,一看这个解释,压根不明白它在说什么,那只好分析一下源代码。
函数的源代码如下:
status_t CLOCK_DRV_Init(clock_manager_user_config_t const * config)
{
status_t result;
clock_manager_user_config_t config_default;
clock_manager_user_config_t const * cfg = config;
DEV_ASSERT(CLOCK_SYS_GetCurrentRunMode() == SCG_SYSTEM_CLOCK_MODE_RUN);
if (config == NULL)
{
/* Get default configuration */
CLOCK_SYS_GetDefaultConfiguration(&config_default);
cfg = &config_default;
}