如何在STM32系列MCU上配置双晶振系统?
时间: 2024-09-27 12:17:41 浏览: 40
嵌入式软硬件+STM32L431RCT6+串口DMA收发+STM32新手学习+MCU验证+使用STM32CubeMX
4星 · 用户满意度95%
在STM32系列微控制器上配置双晶振系统通常涉及以下几个步骤:
1. **硬件连接**:
- 将主晶振连接到微控制器的XTAL1和XTAL2引脚(有些型号仅需XTAL1)。如果主板支持,也可能有单独的外接时钟引脚。
- 对于备份时钟,常见的选项有陶瓷谐振器(CRystal)或无源外部RC网络,分别连接至EXTI_XTALIN和EXTI_XTALIN2(某些型号支持)。
2. **启动模式选择**:
- 在STM32的启动序列开始时,通过STM32F10x RCC (Reset and Clock Control)寄存器配置,你可以选择默认启动主时钟或备用时钟。例如,`RCC_OscInitTypeDef`结构体用于设定时钟源。
```c
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 设置为主晶振
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 启动主晶振
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 如果需要,设置 PLL
```
3. **时钟分频及配置**:
- 使用`RCC_ClkInitStruct`配置系统时钟、APB时钟和ISP时钟,确保在主晶振失效时备用时钟可以接管。
```c
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // 初始设为HSE
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
```
4. **错误检测和切换**:
- 在程序中添加对主时钟性能的监测,如定时器超时或系统频率检测。当检测到主时钟有问题时,切换到备用时钟。
- 可以利用中断机制(例如SYSCLK_ALGO_CHANGED标志)来触发时钟源的自动切换。
5. **更新配置**:
- 完成切换后,再次配置RCC寄存器以使用新的时钟源,然后激活新的时钟树。
```c
RCC_OscInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_BYPASS; // 使用备份时钟
RCC_ClkInitStruct.PLL.PLLState = RCC_PLL_NONE; // 关闭PLL(如果不需要)
RCC_ClkInitStruct.ClockType |= RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SysClkSource = RCC_SYSCLKSOURCE_XTAL;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
// ... 更新其他时钟配置
RCCClockConfig(&RCC_OscInitStruct, &RCC_ClkInitStruct);
```
阅读全文