学校网站建设行业现状,wordpress怎么保存图片,比较好的ui设计网站,wordpress搬家 乱码观前提示#xff1a;函数完整代码在文末#xff0c;本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig()
函数介绍#xff1a;
此函数是一个用于初始化RCC#xff08;Reset and Clock Control#xff09;振荡器#xff08;Osc…观前提示函数完整代码在文末本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig()
函数介绍
此函数是一个用于初始化RCCReset and Clock Control振荡器Oscillators函数名中Osc为此单词缩写的函数。它接受一个指向RCC_OscInitTypeDef结构体的指针结构体的各成员分别包含了RCC振荡器的配置信息。 函数行数为442行功能性上分为六个部分
HSE配置外部高速时钟HSI配置内部高速时钟LSE配置外部低速时钟LSI配置内部低速时钟PLL1配置锁相环1PLL2配置锁相环2
下文中我们将以功能为线索依次分析此函数
函数分析
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
{uint32_t tickstart;uint32_t pll_config;/* Check Null pointer */if (RCC_OscInitStruct NULL){return HAL_ERROR;}/* Check the parameters */assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct-OscillatorType));首先定义了两个局部变量tickstart和pll_config。
接下来检查传入的指针RCC_OscInitStruct是否为空如果为空则返回HAL_ERROR。
然后使用assert_param宏来检查RCC_OscInitStruct-OscillatorType参数是否合法。
HSE Configuration部分
if (((RCC_OscInitStruct-OscillatorType) RCC_OSCILLATORTYPE_HSE) RCC_OSCILLATORTYPE_HSE)这行代码通过按位与运算符将RCC_OscInitStruct-OscillatorType与RCC_OSCILLATORTYPE_HSE进行按位与操作并将结果与RCC_OSCILLATORTYPE_HSE进行比较。如果结果等于RCC_OSCILLATORTYPE_HSE则条件成立。这个条件判断语句的目的是检查是否启用了外部高速时钟HSE作为振荡器类型。
/* Check the parameters */
assert_param(IS_RCC_HSE(RCC_OscInitStruct-HSEState));这是一个断言语句用于检查RCC_OscInitStruct-HSEState的值是否符合要求。IS_RCC_HSE是一个宏用于验证RCC_OscInitStruct-HSEState是否满足特定的条件。如果断言失败则会触发断言错误。
if ((__HAL_RCC_GET_SYSCLK_SOURCE() RCC_SYSCLKSOURCE_STATUS_HSE)|| ((__HAL_RCC_GET_SYSCLK_SOURCE() RCC_SYSCLKSOURCE_STATUS_PLLCLK) (__HAL_RCC_GET_PLL_OSCSOURCE() RCC_PLLSOURCE_HSE)))这个条件判断语句检查系统时钟源是否为外部高速时钟HSE或者是由HSE驱动的PLL时钟源。如果条件成立则意味着HSE在系统时钟或PLL时钟源中被使用此时不允许将其禁用。
if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) ! RESET) (RCC_OscInitStruct-HSEState RCC_HSE_OFF))
{return HAL_ERROR;
}这个条件判断语句检查HSE是否已经就绪并且RCC_OscInitStruct-HSEState的值为禁用状态RCC_HSE_OFF。如果这两个条件都满足函数将返回HAL_ERROR。
__HAL_RCC_HSE_CONFIG(RCC_OscInitStruct-HSEState);这行代码根据RCC_OscInitStruct-HSEState的值配置HSE振荡器的状态。__HAL_RCC_HSE_CONFIG是一个宏用于设置HSE的状态。
/* Check the HSE State */
if (RCC_OscInitStruct-HSEState ! RCC_HSE_OFF)
{/* Get Start Tick */tickstart HAL_GetTick();/* Wait till HSE is ready */while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) RESET){if ((HAL_GetTick() - tickstart) HSE_TIMEOUT_VALUE){return HAL_TIMEOUT;}}
}这部分代码在HSE不是禁用状态时等待HSE就绪。它使用__HAL_RCC_GET_FLAG宏来检查HSE是否已经就绪。如果HSE在超时时间内仍未就绪函数将返回HAL_TIMEOUT。
else
{/* Get Start Tick */tickstart HAL_GetTick();/* Wait till HSE is disabled */while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) ! RESET){if ((HAL_GetTick() - tickstart) HSE_TIMEOUT_VALUE){return HAL_TIMEOUT;}}
}这部分代码在HSE为禁用状态时等待HSE被禁用。它使用__HAL_RCC_GET_FLAG宏来检查HSE是否已经禁用。如果HSE在超时时间内仍未禁用函数将返回HAL_TIMEOUT。
点击《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()——古月居可查看全文。