STM32F103微控制器确实有五个时钟源,分别是HSI、LSI、HSE、LSE和PLL。这些时钟源的主要区别在于他们的频率、稳定性和功耗。以下是这五个时钟源的简要说明:
- HSI (High Speed Internal):这是一个高速内部振荡器,频率通常为8 MHz。这个时钟源在微控制器启动时默认启用,因此不需要额外的硬件。
- LSI (Low Speed Internal):这是一个低速内部振荡器,频率通常为40 kHz。这个时钟源主要用于驱动独立看门狗和实时时钟。
- HSE (High Speed External):这是一个高速外部振荡器,频率范围通常在4 MHz到32 MHz。这个时钟源需要连接到外部的晶振或者振荡器。
- LSE (Low Speed External):这是一个低速外部振荡器,频率通常为32.768 kHz。这个时钟源主要用于驱动实时时钟,需要连接到外部的32.768 kHz晶振。
- PLL (Phase-Locked Loop):这是一个相位锁定环,它可以将HSI或者HSE的频率乘以一个因子,生成更高的频率。这个时钟源主要用于生成高性能的系统时钟。
这些时钟源之间的关系主要在于它们的使用场景和配置方式。例如,你可以配置微控制器使用HSI作为系统时钟,或者使用PLL将HSE的频率提高,然后使用PLL作为系统时钟。同时,你也可以使用LSI或者LSE来驱动实时时钟,这取决于你对频率稳定性和功耗的需求。
总的来说,选择哪个时钟源取决于你的应用需求,包括频率、稳定性、功耗和成本等因素。
使用STM32F103的PLL(Phase-Locked Loop)将HSE(High-Speed External)的频率提高,并进一步使用PLL作为系统时钟的步骤如下:
- 启动和稳定HSE:
- 首先,确保已连接外部晶振或振荡器,并启用HSE。
- 等待HSE启动并稳定。
- 配置PLL:
- 选择HSE作为PLL的输入源。
- 设置PLL的乘法因子。STM32F103的PLL允许从2到16.5的乘法因子。例如,如果HSE是8MHz,并且你想得到72MHz的系统时钟,你可以设置PLL的乘法因子为9。
- 启动PLL:
- 启动PLL。
- 等待PLL稳定。这可以通过检查PLL的锁定状态来确认。
- 配置系统时钟:
- 在切换到PLL作为系统时钟之前,最好先降低系统时钟的速度,以确保系统在高频下可以稳定运行。
- 选择PLL作为系统时钟。
- 配置闪存延迟。当系统时钟的频率超过一定的值时,你可能需要增加闪存的访问延迟。
- 调整总线和外设时钟:
- 根据需要,你可以配置AHB、APB1和APB2总线的时钟分频。例如,APB1的时钟不能超过36MHz,因此如果系统时钟为72MHz,APB1的分频因子应该设置为2。
- 确认设置:
- 你可以检查并确认PLL输出的频率以确保一切正常。
以下是使用STM32的标准外设库进行配置的一个简化示例(请注意,你可能需要根据你的具体需求和外部晶振的频率进行调整):
RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; // 启动HSE RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 乘法因子为9 HAL_RCC_OscConfig(&RCC_OscInitStruct); // 设置系统时钟为PLL输出 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1分频因子为2 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
上述代码是基于STM32 HAL库的,具体实现可能会根据所使用的库和STM32F103的具体型号而有所不同。