cashrwood 发表于 2025-3-23 13:39

stm32f103延时函数时钟频率


这是江协科技的延时函数,
//SysTick->LOAD = 72 * xus;      
这条函数用的是72M的频率,只有8Mhz的外部晶振,但在程序里没有配置时钟频率的代码,为什么可以直接用72相乘?
void Delay_us(uint32_t xus)
{
      SysTick->LOAD = 72 * xus;                              //设置定时器重装值
      SysTick->VAL = 0x00;                                        //清空当前计数值
      SysTick->CTRL = 0x00000005;                              //设置时钟源为HCLK,启动定时器
      while(!(SysTick->CTRL & 0x00010000));      //等待计数到0
      SysTick->CTRL = 0x00000004;                              //关闭定时器
}

公羊子丹 发表于 2025-3-24 08:17

估计是 STM32F103 默认启动后,系统时钟已经被配置成 72MHz 了,你检查下 system_stm32f1xx.c 里的 SystemInit()。

周半梅 发表于 2025-3-24 08:19

你用的是什么开发环境?有些库,比如标准外设库(STD)或者 HAL,可能会自动配置时钟到 72MHz。

帛灿灿 发表于 2025-3-24 08:20

STM32F103 的启动文件 system_stm32f1xx.c 里默认会设置 PLL,把 8MHz 外部晶振倍频到 72MHz,你可以看看 SystemCoreClock 这个变量的值。

童雨竹 发表于 2025-3-24 08:21

试试看 SystemCoreClockUpdate(); 然后打印 SystemCoreClock,看看是不是 72MHz。

万图 发表于 2025-3-24 08:22

你这个代码没有时钟初始化的部分,可能是在启动代码里已经默认启用了 HSE + PLL,所以 HCLK 直接是 72MHz。

Wordsworth 发表于 2025-3-24 08:23

SysTick->CTRL = 0x00000005; 这里选的是 HCLK 作为时钟源,所以 SysTick 计数基于 HCLK,如果 HCLK 是 72MHz,那就能直接用 72 计算 us 级延时。

Bblythe 发表于 2025-3-24 08:25

你试过改 SysTick->LOAD 的值吗?如果时钟不是 72MHz,延时的实际效果会和预期不符。

Pulitzer 发表于 2025-3-24 08:26

你的工程是基于哪个库的?HAL、标准外设库还是裸机?不同库的时钟初始化方式可能不一样。

Uriah 发表于 2025-3-24 08:27

你可以在 main() 里手动调用 RCC_GetClocksFreq()(STD 库)或者 HAL_RCC_GetSysClockFreq()(HAL 库)来确认当前 HCLK 频率。

Clyde011 发表于 2025-3-24 08:29

直接写 SysTick->LOAD = 72 * xus; 这种方式有点硬编码了,如果换个不同时钟配置的 F1 芯片,可能就会不准,建议用 SystemCoreClock 来计算。
页: [1]
查看完整版本: stm32f103延时函数时钟频率