嵌入式开发系列004-时钟

一、单片机时钟特点:

1.系统都需要时钟--本质用于同步

2.高级单片机中存在不同频率的时钟---系统支持时钟分频、倍频,以及开关时钟的功能

二、STM32时钟树

STM32F103系列时钟最高可达72MHz。系统时钟包含内部时钟、外部时钟。

内部时钟是在芯片内部集成的,无需额外的硬件就可以使用,降低成本,但缺点是时钟精度要差一点。

外部时钟需要在芯片外部添加一个外部时钟电路,成本要高一点,精度会高一点,但会占据PCB面积。

低速时钟通常用于:RTC,看门狗,它们不需要很快速率。

高速时钟为系统提供时钟。

注:倍频只能产生倍频器中倍频数。

三、时钟源

Stm32的4个时钟源:

HSE:高速外部时钟,如4~16M Hz时钟源

HSI:高速内部时钟,如8M Hz时钟源

LSE:低速外部时钟,如32.768k Hz时钟源

LSI:低速内部时钟,如40K Hz时钟源

1)高速时钟:

我们可以使用HSE或者HSI高速时钟源作为系统时钟源。

如果由内部HSI作为时钟源,系统SYSCLK最高只能达到64MHz;

如果由外部HSE作为时钟源,系统SYSCLK最高只能达到72MHz。

2)低速时钟:

如果没有配置LSE,即OSC32_IN/OUT引脚悬空,则工具上LSE就配置成disable,这样就要用上LSI,它为RT、WATCHDOG提供时钟源。

3)外设中线之APB1&APB2

APB1的时钟频率限定最高频率为36Mhz, APB2的时钟最高频率可达72Mhz。

四、时钟配置源码

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

step1:时钟源的配置

  /** 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;  //打开HSE

  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;  // HSE的分频值,这里是1分频

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;              // HSI状态,默认是打开,但我们没有用它

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;         // PLL倍频器打开

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL对HSE倍频

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;       // 9倍倍频。8Mx9=72Mhz

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  // 正式设置上述配置让其生效

  {

    Error_Handler();

  }

step2:各总线(时钟使用者)配置

  /** Initializes the CPU, AHB and APB buses clocks  */   //使用时钟

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

//对HCLK,SYSCLK,PCLK1, PCLK2进行设置

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  //时钟源72Mhz

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  // 1分频

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;   //2分频

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;   //1分频

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)  // 正式设置上述配置让其生效

  {

    Error_Handler();

  }

}

[参考:百问网(www.100ask.net)]

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值