千家信息网

STM32延时函数的方法有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下STM32延时函数的方法有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级d
千家信息网最后更新 2026年11月02日STM32延时函数的方法有哪些

小编给大家分享一下STM32延时函数的方法有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。

1、普通延时

这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。

//微秒级的延时void delay_us(uint32_t delay_us){  volatile unsigned int num;  volatile unsigned int t;  for (num = 0; num < delay_us; num++)  {    t = 11;    while (t != 0)    {      t--;    }  }}//毫秒级的延时void delay_ms(uint16_t delay_ms){  volatile unsigned int num;  for (num = 0; num < delay_ms; num++)  {    delay_us(1000);  }}

上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/02-Template

2、定时器中断

定时器具有很高的精度,我们可以配置定时器中断,比如配置1ms中断一次,然后间接判断进入中断的次数达到精确延时的目的。这种方式精度可以得到保证,但是系统一直在中断,不利于在其他中断中调用此延时函数,有些高精度的应用场景不适合,比如其他外设正在输出,不允许任何中断打断的情况。

STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍:

初始化SysTick 定时器:

/* 配置SysTick为1ms */RCC_GetClocksFreq(&RCC_Clocks);SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);

中断服务函数:

void SysTick_Handler(void){  TimingDelay_Decrement();}void TimingDelay_Decrement(void){  if (TimingDelay != 0x00)  {    TimingDelay--;  }}

延时函数:

void Delay(__IO uint32_t nTime){  TimingDelay = nTime;  while(TimingDelay != 0);}

3、查询定时器

为了解决定时器频繁中断的问题,我们可以使用定时器,但是不使能中断,使用查询的方式去延时,这样既能解决频繁中断问题,又能保证精度。

STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍。

STM32的CM3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

SYSTICK的时钟固定为HCLK时钟的1/8,在这里我们选用内部时钟源120M,所以SYSTICK的时钟为(120/8)M,即SYSTICK定时器以(120/8)M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。

▼CTRL:控制和状态寄存器

▼LOAD:自动重装载除值寄存器

▼CALIB:校准值寄存器

使用不到,不再介绍

示例代码

void delay_us(uint32_t nus){  uint32_t temp;  SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus;  SysTick->VAL=0X00;//清空计数器  SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源  do  {    temp=SysTick->CTRL;//读取当前倒计数值  }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达  SysTick->CTRL=0x00; //关闭计数器  SysTick->VAL =0X00; //清空计数器}void delay_ms(uint16_t nms){  uint32_t temp;  SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms;  SysTick->VAL=0X00;//清空计数器  SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源  do  {    temp=SysTick->CTRL;//读取当前倒计数值  }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达  SysTick->CTRL=0x00; //关闭计数器  SysTick->VAL =0X00; //清空计数器}

上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/04-Delay

4、汇编指令

如果系统硬件资源紧张,或者没有额外的定时器提供,又不想方法1的普通延时,可以使用汇编指令的方式进行延时,不会被编译优化且延时准确。

STM32F207在IAR环境下

/*! *  @brief     软件延时 *  @param    ulCount:延时时钟数 *  @return none *    @note     ulCount每增加1,该函数增加3个时钟 */void SysCtlDelay(unsigned long ulCount){    __asm(">

这3个时钟指的是CPU时钟,也就是系统时钟。120MHZ,也就是说1s有120M的时钟,一个时钟也就是1/120 us,也就是周期是1/120 us。3个时钟,因为执行了3条指令。

使用这种方式整理ms和us接口,在Keil和IAR环境下都测试通过。

/*120Mhz时钟时,当ulCount为1时,函数耗时3个时钟,延时=3*1/120us=1/40us*//*SystemCoreClock=120000000us级延时,延时n微秒SysCtlDelay(n*(SystemCoreClock/3000000));ms级延时,延时n毫秒SysCtlDelay(n*(SystemCoreClock/3000));m级延时,延时n秒SysCtlDelay(n*(SystemCoreClock/3));*/#if defined   (__CC_ARM) /*!< ARM Compiler */__asm voidSysCtlDelay(unsigned long ulCount){    subs    r0, #1;    bne     SysCtlDelay;    bx      lr;}#elif defined ( __ICCARM__ ) /*!< IAR Compiler */voidSysCtlDelay(unsigned long ulCount){    __asm("    subs    r0, #1\n"       "    bne.n   SysCtlDelay\n"       "    bx      lr");}#elif defined (__GNUC__) /*!< GNU Compiler */void __attribute__((naked))SysCtlDelay(unsigned long ulCount){    __asm("    subs    r0, #1\n"       "    bne     SysCtlDelay\n"       "    bx      lr");}#elif defined  (__TASKING__) /*!< TASKING Compiler *//*无*/#endif /* __CC_ARM */

看完了这篇文章,相信你对"STM32延时函数的方法有哪些"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

时钟 定时器 函数 寄存器 方式 计数器 精度 也就是 方法 单片机 指令 系统 配置 普通 频繁 仓库 代码 动作 工程 常用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 什么是科技互联网 互联网科技公司经营范围 深圳恒合互联网络科技有限公司 A股互联网金融科技公司 疫情对互联网科技公司影响 互联网扶贫科技 科技与互联网发展 深圳互联网络科技有限公司 安徽鑫晟辉互联网科技 银优互联网科技有限公司 沃里互联网科技 成都仁贤领冠互联网科技有限公司 厦门比较好的科技互联网公司 上海科技产业互联网平台 互联网公司高科技产品 广东鹅鹅鹅互联网科技有限公司 陕西九四连强互联网科技有限公司 互联网对科技影响 互联网科技创业有什么好项目 广州淘业互联网络科技 互联网科技财经 互联网核心科技是什么 互联网科技社 深圳国际航运科技和互联网 成都互联网科技公司工作好不好 四川慕妮娅互联网科技有限公司 杭州披云加互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 福州德业互联网科技
0