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);
}
表格下载