登录/注册

STM32 空指令延时

STM32 空指令延时

更多

在STM32中,使用空指令(NOP)实现延时是一种简单的纯软件延时方法,适用于对精度要求不高的场景。以下是实现步骤和注意事项:


核心方法

使用ARM Cortex-M的__NOP()宏(定义在core_cmX.h中,如core_cm4.h),每个__NOP()对应1个时钟周期(具体时间由CPU主频决定)。

延时函数示例

#include "stm32f4xx_hal.h"  // 包含HAL库头文件(根据型号调整)
#include "core_cm4.h"       // 包含内核定义(如CM3/CM4)

// 微秒级延时(粗略估计)
void NOP_Delay_us(uint32_t us)
{
    // 计算所需的NOP指令数量(需考虑循环开销)
    uint32_t nop_count = us * (SystemCoreClock / 1000000) / 4; // 经验值:每4个NOP ≈ 1us(需校准)

    while (nop_count--)
    {
        __NOP(); // 执行空指令
    }
}

关键说明

  1. 时钟频率影响

    • 延时时间由SystemCoreClock(系统主频)决定。例如:
      • 72MHz时,1个__NOP() ≈ 13.9ns。
      • 需根据实际主频调整nop_count的计算。
  2. 循环开销

    • while循环本身消耗额外周期(每次循环约需2-4周期)。上述示例通过/4的经验值粗略补偿,精确值需实测校准。
  3. 精度问题

    • 此方法不精确(受中断、编译器优化影响),仅适用于LED闪烁等非敏感场景。
    • 高精度需求请使用硬件定时器(如HAL库的HAL_Delay()或TIM定时器)。

编译器优化问题

编译器可能优化掉空操作循环。解决措施:

void NOP_Delay_us(volatile uint32_t us) // 使用volatile防止优化
{
    while (us--)
    {
        __NOP(); __NOP(); __NOP(); __NOP(); // 手动展开循环
    }
}

替代方案(推荐)

  1. SysTick定时器(HAL库)
    使用标准阻塞延时:

    HAL_Delay(10); // 毫秒级延时(基于SysTick中断)
  2. 硬件定时器(精确延时)
    配置TIM定时器,通过计数器实现微秒级精确延时(不受中断影响)。


总结

方法 精度 适用场景
NOP空指令 低(±10%) 简单任务(如按键消抖)
HAL_Delay() 中(毫秒级) 通用延时(基于SysTick)
硬件定时器 高(微秒级) 时序敏感场景(PWM、通信)

提示:实际开发中优先选择硬件定时器或HAL库延时,NOP延时仅作为最后手段。

延时函数有几个指令周期?

; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } 其中实际上​定时为1ms。 定时器可以理解,但上面的延时函数说i=1时延时10us,对么? 一个

2023-11-06 06:53:42

STM32F429NIH6 一款STM32位控制MCU

1970-01-01 08:00:00 至 1970-01-01 08:00:00

STM32单片机的延时原理和延时函数方法

当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的

2023-08-09 09:13:00

STM32HAL库微秒延时(μs)

STM32HAL库微秒(μs)延时

资料下载 李志静 2022-01-18 10:39:24

STM32延时不同写法

对于STM32系列的延时函数有着不同的写法,本章将给大家带来最简单的延时到最精准延时

资料下载 陈霞 2022-01-14 12:49:15

STM32 us精确延时方式

STM32精确延时方式使用TIM定时器方式延时使用空代码方式

资料下载 尚文清 2021-11-24 18:36:06

使用单片机汇编跳转指令延时一秒的程序免费下载

本文档的主要内容详细介绍的是使用单片机汇编跳转指令延时一秒的程序免费下载。

资料下载 佚名 2019-07-30 17:35:00

如何进行51单片机延时子程序的编程

 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时

资料下载 凤毛麟角 2019-07-02 17:42:00

#define NOP() _nop_() /* 定义指令 */这个指令怎么用的啊?

#defineNOP() _nop_()/* 定义空指令 */ 这个空指令

2023-06-19 07:47:54

STM32延时函数的方法

STM32延时函数的方法 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番

2021-10-02 16:13:00

__NOP();延时函数 精选资料分享

不用系统时钟与通用外设时钟的延时函数介绍下__NOP();函数;它类似于汇编里的伪指令,也称作“空

2021-08-18 07:26:50

stm32延时函数粗延时的意思什么

1.stm32粗延时函数粗延时的意思就是延时时间不太准确,一般用在对

2021-08-11 06:33:32

STM32F0xx_ TIM基本延时配置详细过程

STM32F0xx_TIM基本延时配置详细过程

2020-04-08 09:13:31

STM32F4_TIM基本延时 (计数原理)

STM32F4_TIM基本延时(计数原理)

2020-04-07 11:05:24

关于STM32的计数与延时

关于STM32的计数和延时

2020-03-12 11:20:33

7天热门专题 换一换
相关标签