HAL库的时钟配置的一个小问题

本文探讨了STM32微控制器的时钟配置问题,具体分析了一段配置HSI和HSE的代码,并指出了可能存在的问题。通过示例代码展示了如何正确地配置外部高速时钟(HSE)及锁相环(PLL),并强调了避免同时启用内部高速时钟(HSI)的重要性。

好几天没动手,又有个小问题疏忽了。

  RCC_OscInitStruct.OscillatorType =   	RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);`

第一行代码中应该删除内部时钟,否则硬件不能执行。

### 配置STM32F103C8T6使用HAL时钟设置 STM32F103C8T6是基于ARM Cortex-M3内核的高性能微控制器,广泛用于嵌入式系统中。为了充分发挥其性能,需要正确配置系统时钟HAL提供了丰富的API来简化时钟配置过程,同时结合STM32CubeMX工具可以自动生成初始化代码。 #### 系统时钟源选择 STM32F103C8T6支持多种时钟源,包括: - **HSI(High Speed Internal)**:8 MHz的内部高速时钟,适用于大多数应用,无需外部元件。 - **HSE(High Speed External)**:外部晶振或时钟源,频率范围为4~16 MHz。 - **PLL(Phase Locked Loop)**:可以将HSI或HSE的频率倍频,用于提升系统主频。 通常,为了获得更高的系统时钟频率,会选择使用HSE配合PLL进行时钟配置。 #### 使用STM32CubeMX配置时钟 1. **打开STM32CubeMX**,选择STM32F103C8T6芯片型号。 2. 在“Pinout & Configuration”选项卡中,点击“System Core” -> “RCC”,选择HSE作为系统时钟源(假设使用8 MHz外部晶振)。 3. 在“Clock Configuration”选项卡中,设置PLL的倍频系数。例如,如果HSE为8 MHz,并希望系统主频达到72 MHz,则可以设置PLL倍频为9(8 MHz × 9 = 72 MHz)。 4. 确保AHB、APB1、APB2的预分频系数设置正确。通常: - AHB = 1(不分频) - APB1 = 2(36 MHz) - APB2 = 1(72 MHz) 5. 完成配置后,点击“Project” -> “Generate Code”,选择IDE(如STM32CubeIDE),生成初始化代码。 #### HAL时钟配置代码分析 在生成的代码中,`main()`函数会调用`SystemClock_Config()`函数,该函数由`stm32f1xx_hal_msp.c`或`main.c`中的`SystemClock_Config()`实现。其核心配置如下: ```c void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 初始化HSE振荡器 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 8 MHz * 9 = 72 MHz if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } // 初始化系统时钟、AHB、APB1、APB2 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(); } } ``` 上述代码首先配置了HSE作为时钟源,并启用PLL进行倍频。接着设置系统时钟源为PLL输出,并配置AHB、APB1、APB2的分频系数以确保各外设时钟在允许范围内。 #### 注意事项 - 在使用HSE时,需确保外部晶振电路稳定,否则可能导致系统无法启动。 - 如果使用PLL,必须确保PLL输出频率在芯片允许范围内(对于STM32F103系列,最大为72 MHz)。 - 修改时钟配置后,应检查所有外设的时钟源和频率是否仍然适用,尤其是定时器、SPI、I2C等依赖系统时钟的模块。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值