时钟可选配内部与外部时钟,内部时钟最高可选配到64MHz,外部时钟最高可以配置到72MHz

从内部时钟HSI来到PLLSRC要先÷2得到4MHz要得到最大且不超过72MHz的只能是×16,得到64MHz的频率。AHB总线分三个:HCLK,APB1,APB2。如图所示有三种64,32,64分别相对应。

内部时钟:64MHz

void RccClock_Init(void)
{
	RCC_OscInitTypeDef RCC_OscInitType;// 内外部时钟源配置结构体
	RCC_ClkInitTypeDef RCC_ClkInitType;// 总线时钟配置结构体
	
	RCC_OscInitType.OscillatorType = RCC_OSCILLATORTYPE_HSI;// (需要配置的震荡电路)配置内部高速时钟HSI相应寄存器
	RCC_OscInitType.HSIState = RCC_HSI_ON;// (内部高速时钟状态) 打开HSI
	RCC_OscInitType.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;// (HSI微调值)0x10(默认值)
	RCC_OscInitType.PLL.PLLState = RCC_PLL_ON;//(PLL状态) RCC_PLL_ON
	RCC_OscInitType.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;//(PLL输入源) HSI内部高速时钟2分频后作为PLL输入源
	RCC_OscInitType.PLL.PLLMUL = RCC_PLL_MUL16;//(PLL倍频值)
	HAL_RCC_OscConfig(&RCC_OscInitType);//传上面的参数给 内外部时钟源配置结构体

	RCC_ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	//(需要配置的时钟) HAL_RCC_ClockConfig函数中会配置SYSCLK相关的寄存器|函数中会配置HCLK相关的寄存器|函数中会配置PCLK1相关的寄存器|函数中会配置PCLK2相关的寄存器
	RCC_ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;//(SYSCLK系统时钟输入源) PLL输出作为系统时钟
	RCC_ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;//(AHB分频系数)(HLCK) SYSCLK的值除以1的值就是HCLK的值
	RCC_ClkInitType.APB1CLKDivider = RCC_HCLK_DIV2;//(低速APB预分频)(APB1)(PCLK1) HCLK的值除以2就是PCLK1的值
	RCC_ClkInitType.APB2CLKDivider = RCC_HCLK_DIV1;//(高速APB预分频)(APB2)(PCLK2) HCLK的值除以1就是PCLK2的值
	HAL_RCC_ClockConfig(&RCC_ClkInitType,FLASH_LATENCY_2);//传上面的参数给 总线时钟配置结构体
}

外部时钟:72MHz

void RccClock_Init(void)
{
	RCC_OscInitTypeDef RCC_OscInitType;// 内外部时钟源配置结构体
	RCC_ClkInitTypeDef RCC_ClkInitType;// 总线时钟配置结构体
	
	RCC_OscInitType.OscillatorType = RCC_OSCILLATORTYPE_HSE;// (需要配置的震荡电路) 配置外部高速时钟HSE相应寄存器
	RCC_OscInitType.HSEState = RCC_HSE_ON;// (外部高速时钟状态)打开HSE
	RCC_OscInitType.HSEPredivValue = RCC_HSE_PREDIV_DIV1;//(外部高速时钟分频值)HSE除以1后作为PLL输入时钟
	RCC_OscInitType.PLL.PLLState = RCC_PLL_ON;//(PLL状态) PLL打开
	RCC_OscInitType.PLL.PLLSource = RCC_PLLSOURCE_HSE;//(PLL输入源) HSE外部高速时钟作为PLL输入
	RCC_OscInitType.PLL.PLLMUL = RCC_PLL_MUL9;//(PLL倍频值)乘9    8*9=72MHz
	HAL_RCC_OscConfig(&RCC_OscInitType);//传上面的参数给 内外部时钟源配置结构体

	RCC_ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	//(需要配置的时钟) HAL_RCC_ClockConfig函数中会配置SYSCLK相关的寄存器|函数中会配置HCLK相关的寄存器|函数中会配置PCLK1相关的寄存器|函数中会配置PCLK2相关的寄存器
	RCC_ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;//(SYSCLK系统时钟输入源) PLL输出作为系统时钟
	RCC_ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;//(AHB分频系数)(HLCK) SYSCLK的值除以1的值就是HCLK的值
	RCC_ClkInitType.APB1CLKDivider = RCC_HCLK_DIV2;//(低速APB预分频)(APB1)(PCLK1) HCLK的值除以2就是PCLK1的值
	RCC_ClkInitType.APB2CLKDivider = RCC_HCLK_DIV1;//(高速APB预分频)(APB2)(PCLK2) HCLK的值除以1就是PCLK2的值
	HAL_RCC_ClockConfig(&RCC_ClkInitType,FLASH_LATENCY_2);//传上面的参数给 总线时钟配置结构体
}

STM32CubeMX的配置方法:

内部时钟:

1.

2.在红色框内输入64然后回车,软件会自动配置。

外部时钟:

1.

2.在红色框内输入72然后回车,软件会自动配置。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐