我是靠谱客的博主 正直大象,最近开发中收集的这篇文章主要介绍尝试使用CubeMX做stm32开发之八:RCC配置一、配置参数二、生成代码三、小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        参考《STM32中文参考手册_V10》,研究CubeMX中有关RCC的配置。

        RCC主要指stm32f103的时钟配置,主要系统时钟SYSCLK设置和3条总线时钟设置——AHB、APB2、APB1。

        AHB分频因子决定HCLK;

        APB2分频因子决定PCLK2;

        APB1分频因子决定PCLK1;

        一般来说,标准的时钟配置为:

        PCLK2=HCLK=SYSCLK=PLLCLK=72MHz

        PCLK1=HCLK/2=36MHz

一、配置参数

HSE:

        HSE是高速的外部时钟信号,可以由两种时钟源产生:HSE外部晶体/陶瓷谐振器;HSE用户外部时钟。

        最常用的外部晶振是8MHz的无源晶振,这里选择Crystal/Geramic Resonator。

LSE:

        LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器,一般应用中不太采用。

Master Clock Output:

        用来选择是否使能 MCO引脚时钟输出(PA8引脚的复用功能)。

HSI Calibration Value:

        对应时钟控制寄存器RCC_CR中的HSITRIM[4:0]位,对内部高速时钟进行调整,其值被叠加在HSICAL[5:0]上,目的是让用户可以输入一个调整数值,根据电压和温度的变化调整内部HSI RC振荡器的频率。默认值为16。

二、生成代码

void SystemClock_Config(void)
{
  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;// 使能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();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

HSE Startup Timout Value(ms)设置为100: 

#if !defined  (HSE_STARTUP_TIMEOUT)
  #define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */
#endif /* HSE_STARTUP_TIMEOUT */

 LSE Startup Timout Value(ms)设置为5000: 

#if !defined  (LSE_STARTUP_TIMEOUT)
  #define LSE_STARTUP_TIMEOUT    5000U   /*!< Time out for LSE start up, in ms */
#endif /* LSE_STARTUP_TIMEOUT */

 Prefetch Buffer设置为Enable:

#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()    (FLASH->ACR |= FLASH_ACR_PRFTBE)

三、小结

        通过CubeMX配置时钟树,可以较大地简化程序开发过程,尤其是在“Clock Configuration”中,通过图形化方法,可以很方便地对stm32的时钟树进行设置,还是很好用的。

最后

以上就是正直大象为你收集整理的尝试使用CubeMX做stm32开发之八:RCC配置一、配置参数二、生成代码三、小结的全部内容,希望文章能够帮你解决尝试使用CubeMX做stm32开发之八:RCC配置一、配置参数二、生成代码三、小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部