rt thread 如何使用STM32F103的外部晶振作为时钟源

本文详细指导如何使用8MHz外部晶振配置STM32F103微控制器,涉及`stm32f1xx_hal_conf.h`和`board.h`头文件修改,以及通过STM32CubeMX配置RCC_OSCILLATORTYPE_HSE。系统时钟频率设置和SystemClock_Config函数调整也一并讲解。
摘要由CSDN通过智能技术生成

以8MHz外部晶振配置STM32F103为例(结合STM32CubeMX)

1.打开  \drivers\stm32f1xx_hal_conf.h  修改其中的宏定义为外部晶振频率:

#define HSE_VALUE ((uint32_t)8000000U)

2.打开  \drivers\board.h 修改以下宏:

#define BSP_CLOCK_SOURCE      ("HSE")   //HSI:内部时钟源默认,  HSE:外部时钟源
#define BSP_CLOCK_SOURCE_FREQ_MHZ   ((int32_t)8)      //外部时钟参数:默认0,根据晶振实际设置
#define BSP_CLOCK_SYSTEM_FREQ_MHZ     ((int32_t)72)     //主频

3.采用STM32CubeMX配置时钟并得到SystemClock_Config()函数,打开rt-thread中 /drivers/drv_clk.c 找到system_clock_config函数,并修改该函数中和RCC_OscInitStruct相关的代码

  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;

STM32F103VBT6 HAL库中,配置系统时钟通常涉及到设置CPU主频和外设时钟。如果你想要使用8MHz外部晶振作为时钟,你需要初始化HSE(High-Speed External Oscillator)并启用HSI(Internal High Speed oscillator)作为分频器。以下是一个简单的示例代码: ```c #include "stm32f10x_hal.h" void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); // 先使能电管理时钟 // HSE(外部高速晶体振荡器)初始化 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启HSE RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 启用 PLL RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // 设置PLL为HSE RCC_OscInitStruct.PLL.PLLM = 8; // M因子设定为8,取决于你的8MHz频率 RCC_OscInitStruct.PLL.PLLN = 336; // N因子一般根据手册选择,这里假设336 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // P分频系数,通常为2 RCC_OscInitStruct.PLL.PLLQ = 7; // Q分频系数,根据你的需求调整 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // 处理错误 Error_Handler(); } // 系统时钟选择(使用HSI分频) RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用 PLL 输出作为系统时钟 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB 总线时钟分频1 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1 总线时钟分频4 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2 总线时钟分频2 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { // 处理错误 Error_Handler(); } } // 函数结束后的相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值