延时函数实现记录

使用空指令进行延时

STM32F103中,不使用中断而使用空循环(NOP指令)来实现延时,需要根据时钟频率计算出每个NOP指令的执行时间。

计算NOP指令时间

  • 时钟频率:72MHz
  • 每个NOP指令执行时间:1个时钟周期
  • NOP指令执行时间:1 / 72MHz ≈ 13.89ns

微秒级延时

void Delay_us(uint32_t us) {
    uint32_t count = us * 72 / 5; // 估算循环次数
    while (count--) {
        __NOP();  // 空操作,防止优化
    }
}

在 STM32 使用的这段延时代码中,uint32_t count = us * 72 / 5; 是用来估算延时所需的循环次数。下面是这一估算的原理:

1. 72 MHz 时钟频率

STM32 通常运行在 72 MHz 的系统时钟频率下(假设使用的是常见的 STM32F1 系列)。这意味着每秒钟处理器可以执行 72,000,000 个时钟周期。为了方便计算,假设每个时钟周期大约能执行一条指令。

2. 时间单位换算

1 微秒 (us) = 1,000,000 分之一秒,因此在 72 MHz 的时钟频率下,1 微秒内可以执行约 72 个时钟周期。

因此,对于给定的 us 微秒的延时,我们大概需要等待 us * 72 个时钟周期,才能达到期望的延时时间。

2. 为何除以 5?

代码中的 count = us * 72 / 5 并不是直接使用 us * 72,而是对其进行了除以 5 的操作。这个除以 5 的操作是为了补偿循环中其他指令(例如,while (count--) 的减法操作和循环判断等)所消耗的额外时钟周期。

毫秒级延时

void Delay_ms(uint32_t ms) {
    while (ms--) {
        Delay_us(1000);  // 调用微秒延时
    }
}
  • 这种方法简单但不精确,受编译器优化和其他因素影响。
  • 在精度要求高的场合,建议使用定时器实现延时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值