滴答定时器延时时间过长的原因

本文介绍了在STM32F4xx开发中,如何通过SetSysClock函数配置系统时钟,特别关注了使用25MHz到88MHz外部晶振的过程。

 system_stm32f4xx.c

SetSysClock();

 stm32f4xx.h

 25-->8 8为板子使用的外部晶振

### 关于滴答定时器延时函数的使用 #### 初始化配置 为了使用滴答定时器实现精确延时,首先需要初始化系统时钟并设置相应的参数。这一步骤通常由`sys_tick_init`完成: ```c void sys_tick_init(unsigned int tick) { // 配置SysTick定时器... } ``` 此函数接受一个参数`tick`,代表每次溢出的时间间隔[^1]。 #### 设置时钟源 接着要指定计数器使用的时钟源。对于STM32系列单片机而言,默认情况下可以选择APB1或HCLK作为输入频率。具体操作可通过调用如下接口实现: ```c SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 或者 SysTick_CLKSource_HCLK ``` 这里选择了CPU核心时钟除以八后的信号驱动计数逻辑[^2]。 #### 实现延迟功能 基于上述准备工作完成后,就可以编写具体的延时子程序了。一般会定义两个版本分别处理不同单位时间长度的需求: - **微秒级延时** ```c void Delay_us(__IO uint32_t nus) { unsigned long temp; SysTick->LOAD = (SystemCoreClock / 8000 * nus); SysTick->VAL = 0x00; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; do { temp = SysTick->CTRL; } while ((temp & 0x01) && !(temp & (1 << 16))); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0X00; } ``` 该段代码利用了硬件特性来达到亚毫秒级别的精度控制。 - **毫秒级延时** ```c volatile static __IO uint32_t TimingDelay; void Delay_ms(uint32_t ms) { TimingDelay = ms; while(TimingDelay != 0); } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } ``` 在此基础上还可以进一步优化性能表现以及提高抗干扰能力。 #### 控制流程说明 当执行至特定位置时触发一次性的倒计过程直至结束条件满足为止;期间允许其他任务并发运行而不受影响。值得注意的是,在多线程环境下应当考虑同步机制以免造成竞争状况发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值