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; //关闭定时器
}
估计是 STM32F103 默认启动后,系统时钟已经被配置成 72MHz 了,你检查下 system_stm32f1xx.c 里的 SystemInit()。 你用的是什么开发环境?有些库,比如标准外设库(STD)或者 HAL,可能会自动配置时钟到 72MHz。 STM32F103 的启动文件 system_stm32f1xx.c 里默认会设置 PLL,把 8MHz 外部晶振倍频到 72MHz,你可以看看 SystemCoreClock 这个变量的值。 试试看 SystemCoreClockUpdate(); 然后打印 SystemCoreClock,看看是不是 72MHz。 你这个代码没有时钟初始化的部分,可能是在启动代码里已经默认启用了 HSE + PLL,所以 HCLK 直接是 72MHz。 SysTick->CTRL = 0x00000005; 这里选的是 HCLK 作为时钟源,所以 SysTick 计数基于 HCLK,如果 HCLK 是 72MHz,那就能直接用 72 计算 us 级延时。 你试过改 SysTick->LOAD 的值吗?如果时钟不是 72MHz,延时的实际效果会和预期不符。 你的工程是基于哪个库的?HAL、标准外设库还是裸机?不同库的时钟初始化方式可能不一样。 你可以在 main() 里手动调用 RCC_GetClocksFreq()(STD 库)或者 HAL_RCC_GetSysClockFreq()(HAL 库)来确认当前 HCLK 频率。 直接写 SysTick->LOAD = 72 * xus; 这种方式有点硬编码了,如果换个不同时钟配置的 F1 芯片,可能就会不准,建议用 SystemCoreClock 来计算。
页:
[1]