RCC_Clocks是什么
时间: 2024-07-20 19:00:40 浏览: 169
RCC_Clocks是Resource Controller Clocks的缩写,它在嵌入式系统设计特别是使用像Arm Cortex-M微控制器平台的开发中扮演重要角色。RCC(Reset and Clock Control)是系统控制寄存器,它是负责管理处理器和外设时钟的模块。在STM32这样的微控制器中,RCC_Clocks用于配置和管理各种工作时钟源,如内部振荡器、外部时钟、PLL(锁相环路)等,以满足不同模块的需求,如处理器时钟、USB、UART、ADC等的运行速度。
具体来说,RCC_Clocks包括但不限于以下操作:
1. 启用或禁用时钟:根据应用需求选择合适的时钟源,并启用它们为各个模块供电。
2. 设置时钟频率:通过调整时钟源的分频或倍频,设置最终的时钟频率。
3. 时钟安全:在系统启动或复位后,初始化必要的时钟以保证系统的稳定运行。
4. 配置时钟保护:防止不恰当的时钟配置导致系统不稳定。
相关问题
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_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; 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();
这段代码是STM32的初始化代码,用于初始化芯片的时钟系统。首先,它定义了两个结构体变量RCC_OscInitStruct和RCC_ClkInitStruct,分别用于配置芯片的振荡器和时钟。
在RCC_OscInitStruct结构体中,它指定使用HSI振荡器并将其打开,使用默认的HSI校准值,并打开PLL。PLL的输入时钟源为HSI/2,乘数为16。
在RCC_ClkInitStruct结构体中,它指定时钟类型为HCLK、SYSCLK、PCLK1和PCLK2,并将SYSCLK源设置为PLLCLK。AHB时钟分频器设置为1,APB1时钟分频器设置为2,APB2时钟分频器设置为1。
最后,如果调用HAL_RCC_OscConfig和HAL_RCC_ClockConfig函数返回错误,则调用Error_Handler函数进行错误处理。
/** * @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(); } }
SystemClock_Config函数是用来配置系统时钟的。它执行了以下操作:
1. 初始化CPU、AHB和APB总线时钟。
2. 配置振荡器类型:使用LSI和HSE两种振荡器。
3. 配置HSE状态为旁路模式(BYPASS)。
4. 配置HSE预分频值为2。
5. 配置HSI状态为开启。
6. 配置LSI状态为开启。
7. 配置PLL状态为开启。
8. 配置PLL时钟源为HSE。
9. 配置PLL倍频因子为12。
10. 调用HAL_RCC_OscConfig函数配置时钟,并检查返回值是否为HAL_OK,如果不是则调用Error_Handler函数进行错误处理。
11. 初始化CPU、AHB和APB总线时钟。
12. 配置系统时钟源为PLL时钟。
13. 配置AHB时钟分频系数为1。
14. 配置APB1时钟分频系数为2。
15. 配置APB2时钟分频系数为1。
16. 调用HAL_RCC_ClockConfig函数配置时钟,并检查返回值是否为HAL_OK,如果不是则调用Error_Handler函数进行错误处理。
17. 配置外设时钟:配置ADC外设时钟分频系数为6。
18. 调用HAL_RCCEx_PeriphCLKConfig函数配置外设时钟,并检查返回值是否为HAL_OK,如果不是则调用Error_Handler函数进行错误处理。
这个函数的作用是根据具体的系统需求配置系统时钟,确保各个外设能够正常工作。
阅读全文