用时钟树了解HAL_RCC结构体

       STM32的HAL库是由可视化工具自动生成相关硬件参数设置代码,为了了解学习时钟树的配置我用ST官方提供的时钟树图纸和两段小代码学习RCC部分结构体。请大家批评指导。

用HSI输出最大频率的时钟信号

首先上时钟树

根据标题我们在时钟树上选出为了输出最大频率的时钟信号所需要经过的路径和要设置的参数。

首先我们选择内部高速时钟源HSI,有两条路径,路径1经过/2分频来到PLLSRC,路径2直接到SW

为了满足最高频率选择路径1,倍率选择16倍,频率64MHz,通过PLLCLK进入SW后选择AHB为/1分频,这时SYSCLK上时钟频率为64MHz,小于72MHz。

我们配置HCLK、APB1、APB2,HCLK最大72MHz,64MHz小于满足要求,APB1选择倍率/2频率为32MHz,小于36MHz满足要求,APB2倍率选择/1频率为64MHz,小于72MHz满足要求

RCC_OscinitTypeDef结构体

首先我们建立RCC_OscinitTypeDef结构体变量CC_OscinitType —— 配置结构体成员OscillatorType为RCC_OSCILLATORTYPE_HSI —— 配置结构体变量HSIState为RCC_HSI_ON —— 配置结构体变量HSICalibrationValue为默认值RCC_HSICALIBRATION_DEFAULT —— 配置PLL结构体变量PLLState为RCC_PLL_ON —— 配置PLL结构体变量PLLSource为RCC_PLLSOURCE_HSI_DIV2—— 配置PLL结构体变量 PLLMUL为RCC_PLL_MUL16

代码如下

RCC_OscinitTypeDef RCC_OscinitType;

RCC_OscinitType.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscinitType.HSIState = RCC_HSI_ON;
RCC_OscinitType.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscinitType.PLL.PLLState = RCC_PLL_ON;
RCC_OscinitType.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscinitType.PLL.PLLMUL = RCC_PLL_MUL16;
HAL_RCC_OscConfig(&RCC_OscInitType);

这样我们完成了红色框图内的红色路径设置

RCC_ClkInitTypeDef结构体

建立RCC_ClkInitTypeDef结构体变量RCC_ClkInitType —— 设置结构体变量ClockType为全部选项 —— 设置结构体变量SYSCLKSource为RCC_SYSCLKSOURCE_HSI —— 设置结构体变量AHBCLKDivider为RCC_SYSCLK_DIV1 —— 设置结构体变量APB1CLKDivider 为RCC_HCLK_DIV2——设置结构体变量APB2CLKDivider为RCC_HCLK_DIV1

代码如下

RCC_ClkInitTypeDef RCC_ClkInitType;

RCC_ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitType.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitType.APB2CLKDivider = RCC_HCLK_DIV1;

HAL_RCC_ClockConfig(&RCC_ClkInitType);

这样我们完成了全部的设置

最终代码

void RCC_HSI_maxInit(void){

    RCC_OscinitTypeDef RCC_OscinitType;
    RCC_ClkInitTypeDef RCC_ClkInitType;

    RCC_OscinitType.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscinitType.HSIState = RCC_HSI_ON;
    RCC_OscinitType.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscinitType.PLL.PLLState = RCC_PLL_ON;
    RCC_OscinitType.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
    RCC_OscinitType.PLL.PLLMUL = RCC_PLL_MUL16;
    HAL_RCC_OscConfig(&RCC_OscInitType);

    RCC_ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitType.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitType.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitType);
}

用HSE输出最大频率的时钟信号

同理我们根据路径和两个表格编写如下代码

void RCC_HSE_maxInit(void){

    RCC_OscinitTypeDef RCC_OscinitType;
    RCC_ClkInitTypeDef RCC_ClkInitType;

    RCC_OscinitType.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscinitType.HSEState = RCC_HSE_ON;
    RCC_OscinitType.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscinitType.PLL.PLLState = RCC_PLL_ON;
    RCC_OscinitType.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscinitType.PLL.PLLMUL = RCC_PLL_MUL4;

    RCC_ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitType.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitType.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitType);
}

表格下载

<think>好的,我需要帮助用户找到关于STM32H743 HAL时钟树配置的资料或教程。首先,用户提到了引用[1]和引用[2],其中引用[1]给出了一个具体的函数调用例子,而引用[2]提到使用STM32CubeMX配置时钟。接下来,我需要结合这些信息,分步骤解释配置方法。 首先,我应该说明STM32CubeMX工具的重要性,因为它是ST官方推荐的配置工具,可以图形化配置时钟树,自动生成代码,这对于用户来说非常方便。然后,可能需要提到用户提供的sys_stm32_clock_init函数,并解释其参数的含义,比如输入频率、分频系数等,这样用户可以直接在代码中调用。此外,用户可能需要手动调整时钟配置,因此需要说明如何通过HAL函数修改时钟源、PLL参数等。 另外,用户可能需要参考官方文档,如STM32H7参考手册和HAL用户手册,这些是权威的资料。还要提醒用户注意时钟树的结构,特别是高速外部时钟(HSE)、锁相环(PLL)以及各个总线的分频设置,以确保系统时钟和外设时钟正确。 在生成相关问题时,需要围绕用户可能遇到的疑问展开,比如配置步骤、如何验证配置是否正确、常见错误及解决方法,以及低功耗模式下的时钟调整等。这些问题可以帮助用户深入理解时钟配置的各个方面。 需要确保回答结构清晰,按照步骤进行,并且引用提供的资料。同时,要使用中文,数学公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,但如果有频率计算的话,例如APB1的频率计算,可以用行内公式表示。例如,APB1频率=系统时钟/分频系数,写成$f_{APB1} = \frac{168}{2} = 84\text{MHz}$。 最后,检查是否遗漏了用户提到的关键点,比如HAL的具体函数调用,STM32CubeMX的使用,以及参考文档的位置。确保回答准确,并且相关引用正确标注。</think>### STM32H743 HAL时钟树配置方法 #### 1. **使用STM32CubeMX工具配置** STM32CubeMX是ST官方提供的图形化配置工具,可自动生成初始化代码: - 在 **Clock Configuration** 选项卡中配置时钟源、PLL参数及分频系数[^2]。 - 例如,通过外部高速时钟(HSE)配置主频至400MHz: - 设置HSE频率(如25MHz) - 配置PLL分频(如输入分频$N=25$,倍频$M=400$) - 设置系统时钟源为PLL - 生成代码后,HAL会自动初始化时钟树[^1]。 #### 2. **手动代码配置** 若需直接通过代码配置,可参考以下步骤: ```c // 启用HSE时钟 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; HAL_RCC_OscConfig(&RCC_OscInitStruct); // 配置PLL RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; // 输入分频 RCC_OscInitStruct.PLL.PLLN = 400; // 倍频系数 RCC_OscInitStruct.PLL.PLLP = 2; // 主系统时钟分频 HAL_RCC_OscConfig(&RCC_OscInitStruct); // 设置总线分频 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟=400MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟=200MHz HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4); ``` 注意:需根据实际晶振频率调整参数,并验证Flash等待周期。 #### 3. **关键参数说明** - **HSE频率**:外部晶振频率(如8-50MHz) - **PLL配置**: - $f_{VCO} = \frac{HSE}{PLLM} \times PLLN$,需满足VCO输入频率1-2MHz,输出192-836MHz[^1] - 系统时钟$f_{SYSCLK} = \frac{f_{VCO}}{PLLP}$ - **总线分频**: - APB1最大频率通常为系统时钟的$\frac{1}{4}$(如100MHz) #### 4. **验证配置** - 调用`SystemCoreClock`变量检查系统频率。 - 使用示波器测量MCO引脚输出的时钟信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值