[STM32F1] stm32f103延时函数时钟频率

[复制链接]
 楼主| cashrwood 发表于 2025-3-23 13:39 | 显示全部楼层 |阅读模式

这是江协科技的延时函数,
//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 来计算。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

1536

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

25

主题

1536

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部