复位和时钟控制(RCC:reset clock control)
系统复位当发生以下任一事件时,产生一个系统复位:1. NRST 引脚上的低电平 ( 外部复位 )2. 窗口看门狗计数终止 (WWDG 复位 )3. 独立看门狗计数终止 (IWDG 复位 )4. 软件复位 (SW 复位 ) 5. 低功耗管理复位电源复位当以下事件中之一发生时,产生电源复位:1. 上电 / 掉电复位 (POR/PDR 复位 )2. 从待机模式中返回备份区复位备份区域拥有两个专门的复位,它们只影响备份区域。当以下事件中之一发生时,产生备份区域复位。1. 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)( 见数据手册 6.3.9 节 ) 中的BDRST位产生。2. 在 VDD 和 VBAT 两者掉电的前提下, VDD 或 VBAT 上电将引发备份区域复位。
时钟控制
什么是时钟? 时钟打开,对应的设备才会工作。
时钟来源?
三种不同的时钟源可被用来驱动系统时钟
(SYSCLK)
- HSI振荡器时钟(高速内部时钟)
- HSE振荡器时钟(高速外部时钟)
- PLL时钟(锁相环倍频时钟)
二级时钟源
:
- 40kHz低速内部RC(LSIRC)振荡器
- 32.768kHz低速外部晶体(LSE晶体)
如何使用CubeMX配置时钟
1. 创建一个新的工程:
2. 打开SYS,将Debug改成 Serial Wire:
3. 打开RCC配置时钟,将HSE振荡器时钟 配置成 “Crystal ....”:
4. 打开上方的“Clock Configuration"大选项:
4.1 按照下图,红圈中是需要修改的配置,橙色圈中修改完毕后按下回车其他会自动配置:
4.2 配置完之后的时钟图(如上图所示)
5. 点击上方的“Project Manager"大选项, 进行每个项目都需要的设置:
6. 生成代码
查看main函数中关于时钟部分的代码:
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_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();
}
}