STM32F103时钟配置教程:RCC使用HSE和HSI方法

版权申诉
0 下载量 160 浏览量 更新于2024-10-18 收藏 307KB ZIP 举报
资源摘要信息:"该资源提供了关于STM32F103系列微控制器如何使用高性能内部(HSI)或外部高速时钟(HSE)配置系统时钟的示例程序。STM32F103是STMicroelectronics(意法半导体)生产的一款基于ARM Cortex-M3内核的32位微控制器,广泛应用于嵌入式系统中。该资源的标题和描述表明它专注于RCC(Reset and Clock Control)的配置过程,这是STM32F系列微控制器中的一个重要功能模块。" 知识点: 1. STM32F103微控制器基础: - STM32F103是基于ARM Cortex-M3的32位微控制器,具有高性能、低成本、低功耗的特点。 - 它通常用于需要处理能力适中、外设接口丰富且功耗要求严格的嵌入式系统应用。 2. RCC(Reset and Clock Control): - RCC是STM32F103中一个重要的硬件模块,负责系统时钟的生成和分配。 - RCC模块提供了多种时钟源选项,包括内部时钟源和外部时钟源。 - 它允许设计者通过软件配置,选择并启用不同的时钟源,从而满足系统在不同应用场景下的时钟需求。 3. HSI(High-Speed Internal)时钟源: - HSI是一个内置的高速振荡器,通常为STM32F103提供8MHz的内部时钟源。 - HSI时钟源是芯片上电默认的时钟源。 - 相比外部时钟源,HSI具有启动速度快、无需外部组件的优点。 4. HSE(High-Speed External)时钟源: - HSE支持外接晶振或外部时钟信号作为时钟源。 - 它可以提供更高精度和稳定性的时钟信号,通常用于对时钟要求较高的应用。 - HSE的频率范围一般为4MHz到25MHz,可以达到更高的频率,但需要外部硬件支持。 5. RCC配置系统时钟: - RCC的配置是通过一系列的寄存器来完成的,这些寄存器包括时钟源选择、时钟分频器设置等。 - 在程序中配置时钟涉及启动时钟源(HSI或HSE)、等待时钟源稳定、切换到所需的时钟源、配置系统时钟分频器等步骤。 - 正确配置RCC对于确保微控制器稳定运行及优化性能至关重要。 6. STM32F103时钟系统架构: - STM32F103的时钟系统架构包括时钟源、PLL(Phase Locked Loop)模块、系统时钟树和外设时钟分频器。 - PLL可以接收HSI或HSE作为输入源,并对信号进行倍频,生成更高速率的系统时钟。 - 系统时钟树负责将时钟信号分配到不同的内核和外设。 7. 编程示例: - 程序示例通常会展示如何通过代码操作RCC寄存器来配置时钟。 - 代码中会包含初始化时钟源、配置PLL参数、等待锁定和切换时钟等关键步骤。 - 示例代码往往还会涉及对时钟状态的检查和错误处理。 8. 资源文件名称解析: - 压缩包文件名称“16-RCC—使用HSE或者HSI配置系统时钟”清楚地指明了该资源将涉及到的主题是RCC的配置,特别是关于如何使用外部高速时钟(HSE)和内部高速时钟(HSI)。 - 标题中的“STM32F103”指明了该示例程序是适用于STM32F103系列微控制器的。 - 标签中的“stm32f103__hsi”、“stm32f103_rcc”、“stm32f103_时钟”、“stm32f103_hsi”进一步强调了关注点在于使用HSI配置时钟和RCC模块的使用。 了解上述知识点将有助于深入掌握STM32F103微控制器的时钟系统配置,进而实现微控制器在各种复杂应用场景下的高效稳定运行。

/** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0};//定义结构体变量RCC_OscInitStruct RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};//定义结构体变量RCC_ClkInitStruct RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};//定义结构体变量PeriphClkInit /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV2; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ 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; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } }

2023-07-15 上传