• 《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()


    观前提示:函数完整代码在文末,本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法
    f105时钟树详解图

    HAL_RCC_OscConfig()

    函数介绍:

    此函数是一个用于初始化RCC(Reset and Clock Control)振荡器(Oscillators,函数名中Osc为此单词缩写)的函数。它接受一个指向RCC_OscInitTypeDef结构体的指针,结构体的各成员分别包含了RCC振荡器的配置信息。
    函数行数为442行,功能性上分为六个部分:

    • HSE配置,外部高速时钟
    • HSI配置,内部高速时钟
    • LSE配置,外部低速时钟
    • LSI配置,内部低速时钟
    • PLL1配置,锁相环1
    • PLL2配置,锁相环2

    下文中我们将以功能为线索依次分析此函数

    函数分析

    1. HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
    2. {
    3. uint32_t tickstart;
    4. uint32_t pll_config;
    5. /* Check Null pointer */
    6. if (RCC_OscInitStruct == NULL)
    7. {
    8. return HAL_ERROR;
    9. }
    10. /* Check the parameters */
    11. 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->OscillatorTypeRCC_OSCILLATORTYPE_HSE进行按位与操作,并将结果与RCC_OSCILLATORTYPE_HSE进行比较。如果结果等于RCC_OSCILLATORTYPE_HSE,则条件成立。这个条件判断语句的目的是检查是否启用了外部高速时钟(HSE)作为振荡器类型。

    1. /* Check the parameters */
    2. assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));

    这是一个断言语句,用于检查RCC_OscInitStruct->HSEState的值是否符合要求。IS_RCC_HSE是一个宏,用于验证RCC_OscInitStruct->HSEState是否满足特定的条件。如果断言失败,则会触发断言错误。

    1. if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE)
    2. || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE)))

    这个条件判断语句检查系统时钟源是否为外部高速时钟(HSE),或者是由HSE驱动的PLL时钟源。如果条件成立,则意味着HSE在系统时钟或PLL时钟源中被使用,此时不允许将其禁用。

    1. if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
    2. {
    3. return HAL_ERROR;
    4. }

    这个条件判断语句检查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的状态。

    1. /* Check the HSE State */
    2. if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
    3. {
    4. /* Get Start Tick */
    5. tickstart = HAL_GetTick();
    6. /* Wait till HSE is ready */
    7. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
    8. {
    9. if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
    10. {
    11. return HAL_TIMEOUT;
    12. }
    13. }
    14. }

    这部分代码在HSE不是禁用状态时,等待HSE就绪。它使用__HAL_RCC_GET_FLAG宏来检查HSE是否已经就绪。如果HSE在超时时间内仍未就绪,函数将返回HAL_TIMEOUT

    1. else
    2. {
    3. /* Get Start Tick */
    4. tickstart = HAL_GetTick();
    5. /* Wait till HSE is disabled */
    6. while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET)
    7. {
    8. if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
    9. {
    10. return HAL_TIMEOUT;
    11. }
    12. }
    13. }

    这部分代码在HSE为禁用状态时,等待HSE被禁用。它使用__HAL_RCC_GET_FLAG宏来检查HSE是否已经禁用。如果HSE在超时时间内仍未禁用,函数将返回HAL_TIMEOUT

    点击《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()——古月居可查看全文。

  • 相关阅读:
    RefConv: 重参数化的重新聚焦卷积(论文翻译)
    将swagger注解导入apifox的IDEA配置
    kubernetes组件 Controller manager深刻认知
    Matlab顶级期刊配色工具Rggsci
    vim编辑器
    (18)Verilog实现信号延迟N拍【4拍】
    记录.偏僻冷知识
    Scala第五章节(方法、函数的格式和用法以及九九乘法表案例)
    设计模式之状态模式
    CreateProcess error=206, 文件名或扩展名太长。
  • 原文地址:https://blog.csdn.net/hcx25909/article/details/139737505