打印
[STM32F1]

stm32f103延时函数时钟频率

[复制链接]
168|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 这个变量的值。

使用特权

评论回复
5
童雨竹| | 2025-3-24 08:21 | 只看该作者
试试看 SystemCoreClockUpdate(); 然后打印 SystemCoreClock,看看是不是 72MHz。

使用特权

评论回复
6
万图| | 2025-3-24 08:22 | 只看该作者
你这个代码没有时钟初始化的部分,可能是在启动代码里已经默认启用了 HSE + PLL,所以 HCLK 直接是 72MHz。

使用特权

评论回复
7
Wordsworth| | 2025-3-24 08:23 | 只看该作者
SysTick->CTRL = 0x00000005; 这里选的是 HCLK 作为时钟源,所以 SysTick 计数基于 HCLK,如果 HCLK 是 72MHz,那就能直接用 72 计算 us 级延时。

使用特权

评论回复
8
Bblythe| | 2025-3-24 08:25 | 只看该作者
你试过改 SysTick->LOAD 的值吗?如果时钟不是 72MHz,延时的实际效果会和预期不符。

使用特权

评论回复
9
Pulitzer| | 2025-3-24 08:26 | 只看该作者
你的工程是基于哪个库的?HAL、标准外设库还是裸机?不同库的时钟初始化方式可能不一样。

使用特权

评论回复
10
Uriah| | 2025-3-24 08:27 | 只看该作者
你可以在 main() 里手动调用 RCC_GetClocksFreq()(STD 库)或者 HAL_RCC_GetSysClockFreq()(HAL 库)来确认当前 HCLK 频率。

使用特权

评论回复
11
Clyde011| | 2025-3-24 08:29 | 只看该作者
直接写 SysTick->LOAD = 72 * xus; 这种方式有点硬编码了,如果换个不同时钟配置的 F1 芯片,可能就会不准,建议用 SystemCoreClock 来计算。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

1384

帖子

0

粉丝