赞
踩
1、通过RT-Thread studio建好STM32F107的工程后,我们会发现,在drivers/drv_clk.c中系统默认使用的时钟源是内部高速时钟(HSI),如下图所示;
2、此处我们将HSI时钟源修改为HSE时钟源,首先找到board.h,在board.h中找到如下代码;
- #define BSP_CLOCK_SOURCE ("HSI")
- #define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)0)
- #define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)72)
3、将上面代码修改为如下代码(其实此处作用不大,可以通过源码查看,最后没有用到此单行);
- #define BSP_CLOCK_SOURCE ("HSE")
- #define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)8)
- #define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)72)
4、在STM32CubeMX下配置时钟源为外部时钟(注:没有此软件可以去stm32官网下载),也可以点击下列链接,然后进行相关软件下载;STM32微控制器软件 - 意法半导体STMicroelectronicshttps://www.st.com/zh/embedded-software/stm32-embedded-software.html5、下载好软件之后,然后新建工程(此处不描述新建过程),新建好工程之后,选中Clock Configuration选项,我们发现目前无法配置HSE;
6、切换到Pinout & Configuration选项配置RCC相关选项。
6.1 配置HSE和LSE引脚,首先根据原理图找出HSE和LSE引脚,如下图所示:(注:LSE是给RTC供电,如用不到也可不配置)
6.2 然后在STM32CubeMX中进行配置,可以根据原理图搜索对应的位置,然后点击相应引脚选择相应选项即可,如下图所示:
6.3 然后再配置RCC时钟,如下图所示:
7、 再回到Clock Configuration选项,此时HSE就可以进行配置了,此处我选择的外部晶振为25Mhz,你也可以选择8Mhz,根据你的单片机实际时钟确定,如果时钟树中框为红色,则代表超出实际时钟源,将其设置时钟源即可,然后点击第三步生成代码,如下图所示(注:此处配置要根据单片机实际情况配置,不能完全参照下图配置);
8、打开刚刚生成的代码工程,找到main.c中的SystemClock_Config函数,然后将SystemClock_Config中的所有代码复制,然后替换至rtthread studio 中 drv_clk.c的system_clock_config函数中,如下所示:
- void system_clock_config(int target_freq_Mhz)
- {
-
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
-
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_PLL2;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
- RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;
- RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL8;
- RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
- 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();
- }
- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
- PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
- {
- Error_Handler();
- }
- /** Configure the Systick interrupt time
- */
- __HAL_RCC_PLLI2S_ENABLE();
- }

9、配置此步之后,还需要配置一步,(很多示例没有标明此步,导致程序出现问题),在drivers文件夹下找到stm32f1xx_hal_conf.h文件,然后找到如下代码:
- #if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
- #endif /* HSE_VALUE */
将其修改之前配置的时钟源频率,此处我配置的25Mhz,因此需要修改为25hz,如下所示:
- #if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
- #endif /* HSE_VALUE */
10、修改完之后,下载程序验证成功。也可以在drv_clk.c中将#define DBG_LVL DBG_INFO修改为#define DBG_LVL DBG_LOG,就可以将drv_clk.c中clock_information函数中的时钟信息打印出来
- msh >[0m[D/board] System Clock information[0m
- [0m[D/board] SYSCLK_Frequency = 72000000[0m
- [0m[D/board] HCLK_Frequency = 72000000[0m
- [0m[D/board] PCLK1_Frequency = 36000000[0m
- [0m[D/board] PCLK2_Frequency = 72000000[0m
-
- \ | /
- - RT - Thread Operating System
- / | \ 4.0.2 build Jul 26 2023
- 2006 - 2019 Copyright by rt-thread team
- msh >
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。