前言
参考正点原子与野火的教程,这里时钟树是根据STM32F103系列72MHz的系统频率来设的,如果STM32F4系列128MHz的系统频率。时钟树是结合STM32CubeMX软件时钟配置那部分进行参考说明的。
一、复位
1.1、系统复位
除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图4)以外,系统复位将复位所有寄存器至它们的复位状态。
当以下事件中的一件发生时,产生一个系统复位:
- NRST引脚上的低电平(外部复位)
- 窗口看门狗计数终止(WWDG复位)
- 独立看门狗计数终止(IWDG复位)
- 软件复位(SW复位)
- 低功耗管理复位
可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。
1.2 电源复位
电源复位将复位除了备份区域外的所有寄存器。当以下事件中之一发生时,产生电源复位:
- 上电/掉电复位(POR/PDR复位)
- 从待机模式中返回
电源复位将复位除了备份区域外的所有寄存器。(见图4)
1.3备份域复位
备份区域拥有两个专门的复位,它们只影响备份区域(见图4)。当以下事件中之一发生时,产生备份区域复位:
- 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)(见6.3.9节)中的 BDRST位产生。
- 在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位
二、时钟
对于系统时钟输入配置与用途配置可以参考芯片数据手册的电气特性中工作条件:F1系列的
2.1、时钟来源
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟(内部高速时钟),最高64MHz(F1系列,在PLL前经过了2分频)
● HSE振荡器时钟(外部高速时钟),最高可达72MHz(F1系列),F4是128MHz
● PLL时钟(由HSI和HSE锁相环倍频得来)
● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/ 待机模式下自动唤醒系统。
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)
2.2、系统时钟的用途
2.3、为外部驱动提供时钟
可以将时钟作为输出配置到引脚上,再用示波器查看相关的波形。
三、时钟配置(RCC)
电路频率越高相应的电路中间态时间就越长,其功耗也会随之变高,可以通过控制任一个时钟源都可以被独立的启动或关闭,由此优化系统功耗。
3.1、STM32CubeMX软件配置生成时钟配置代码
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure. 通过RCC来配置系统时钟
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses 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();
}
}
3.2、正点原子提供了系统时钟配置文件(sys.h和sys.c文件)
在配置时钟的时候可以查看相应芯片的数据手册