用时钟树了解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);
}

表格下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值