本文将介绍STM32F4时钟配置的操作步骤、并对比时钟配置前后LED外设闪烁的快慢以及对应代码的讲解
一、使用默认时钟配置去执行代码、获取LED闪烁的周期
如下图所示我们默认使用的是HSI(内部高速时钟)且不进行任何配置
最后我们系统时钟、以及外设获得的时钟频率为16MHz
主函数中的代码如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
printf("this is clock system test2\\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
mydelay(20);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
printf("TogglePin\\n");
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
自己写的延时函数如下:
void mydelay(uint8_t time)
{
uint8_t i;
uint16_t j;
for(i= 0; i < time; i++)
{
for(j = 0; j < 5000; j++)
{
}
}
}
实际测得LED闪烁的周期是在30ms左右
对STM32F4时钟进行配置后执行代码、获取LED闪烁的周期
如下图所示我们对时钟进行配置:
由于时钟频率168MHz是16MHz 10.5倍,我们将mydelay(20)改为mydelay(210)
实际测得LED闪烁的周期是在30ms左右
比对时钟配置前后、LED闪烁周期的区别
由上可知LED闪烁周期相同,但相同的延时周期内、配置后的168MHz系统时钟,运行的延时函数内的空指令数量是默认配置的10.5倍,综上时钟配置后使得指令运行的速度是原来的10.5倍
时钟部分的代码解析
SystemClock_Config();函数中就是我们在时钟树中设置的内容
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** 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.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
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_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
led
+关注
关注
237文章
22449浏览量
645875 -
时钟
+关注
关注
10文章
1479浏览量
130306 -
函数
+关注
关注
3文章
3868浏览量
61308 -
代码
+关注
关注
30文章
4555浏览量
66766 -
STM32F4
+关注
关注
3文章
192浏览量
27676
发布评论请先 登录
相关推荐
STM32F4时钟系统的知识
STM32F4时钟系统的知识在《STM32F4中文参考手册》第六章复位和时钟控制章节有非常详细的讲解,网上关于时钟系统的讲解也有很多,讲不出
发表于 08-13 08:11
STM32F4使用库函数配置外部中断的步骤
转自“STM32F4外部中断入口和外部中断线 - Justice_Gao的日志 单片机论坛并根据自身体会修改目录简介使用库函数配置外部中断的步骤。1) 使能IO口时钟,初始化IO口为输
发表于 08-13 07:59
STM32F4的通用定时器配置步骤
00. 目录文章目录00. 目录01. 通用定时器简介02. 通用定时器时钟03. 定时器配置步骤04. 硬件设计05. 程序示例06. 附录07. 声明01. 通用定时器简介STM32F4
发表于 08-18 07:43
【STM32】STM32F4时钟系统
00. 目录文章目录00. 目录01. STM32F4时钟系统概述02. STM32F4时钟系统图03. STM32F4
发表于 11-25 20:06
•46次下载
评论