英飞凌
直播中

早知

9年用户 1133经验值
擅长:光电显示 存储技术
私信 关注

如何在不同频率下设置不同的外设?

我想在不同频率下设置不同的外设。 但使用 SDL 7.9.0 我只能设置一个频率。 外设设置分频器和使能分频器,而分配分频器可以控制各自的时钟频率,但我无法做到这一点

分享相同的示例代码

外设源配置为 80Mhz,我将分频器设置为 0,基本上是除以 1,因此外设源为 80Mhz,而通过分配各 IP 块的分频器,分频器为 4,我希望分频器为 5,因此 80/5 = 16Mhz,但没有达到我的预期。

请告诉我,我的理解是否正确? 或建议我一种配置每个外设的方法,如 SPI 为 4Mhz,定时器为 16Mhz,I2C 为 2Mhz

另外,当我这样做时,工作正常,但用这种方法,我无法为不同的外设设置不同的工作频率。



为什么分配分频器中的非零分频器不能正常工作?


回帖(1)

刘芳

2024-5-29 16:19:04

1. 首先,您需要确定系统时钟源和可用的时钟频率。通常,这些信息可以在微控制器的数据手册中找到。

2. 接下来,您需要配置时钟树,以便为不同的外设提供所需的时钟频率。这通常涉及设置分频器、PLL(相位锁定环)和其他时钟管理组件。

3. 对于每个外设,您需要根据所需的时钟频率配置相应的分频器。这可以通过编程分频器寄存器来实现。

以下是一个简化的示例,展示了如何为 SPI、定时器和 I2C 配置不同的时钟频率:

```c
#include "stm32f1xx_hal.h"

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

  // 1. 配置系统时钟源
  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.PLLMUL = RCC_PLL_MUL9;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  // 2. 配置系统时钟
  RCC_ClkInitStruct.ClockType = (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;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  // 3. 配置外设时钟
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI1 | RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_I2C1;
  PeriphClkInitStruct.SPI1ClockSelection = RCC_SPI1CLKSOURCE_PLL_DIV2; // SPI1 时钟频率 = PLL / 2 = 4MHz
  PeriphClkInitStruct.TIM1ClockSelection = RCC_TIM1CLK_HCLK; // 定时器 1 时钟频率 = HCLK = 16MHz
  PeriphClkInitStruct.I2C1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK; // I2C1 时钟频率 = SYSCLK = 8MHz
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  // 初始化 SPI、定时器和 I2C 外设

  while (1)
  {
    // 执行外设操作
  }
}
```

请注意,这个示例使用了 STM32F1xx 系列微控制器。您需要根据您的具体硬件平台和开发环境进行相应的调整。

总之,要为不同的外设配置不同的时钟频率,您需要:

1. 确定系统时钟源和可用的时钟频率。
2. 配置时钟树,以便为不同的外设提供所需的时钟频率。
3. 为每个外设配置相应的分频器。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分