当前位置: 首页 > 后端技术 > PHP

STM32延时函数的四种使用方法

时间:2023-03-29 16:59:01 PHP

延时函数在单片机编程过程中经常用到,最常用的是微秒延时delay_us()和毫秒delay_ms()。本文介绍基于STM32F207以不同方式实现的四种延时功能。1.普通延时这种延时方式应该是大家在51单片机的时候接触到的最早的延时函数了。这个比较简单,让单片机做一些无关紧要的工作来打发时间,往往用循环实现,在某些编译器下,代码会被优化,导致精度降低,用于一般延时,在应用中对精度不敏感设想。//微秒级延时voiddelay_us(uint32_tdelay_us){volatileunsignedintnum;易失性无符号整型t;对于(num=0;numLOAD=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;//清除计数器}voiddelay_ms(uint16_tnms){uint32_ttemp;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;//清除计数器}4.如果系统硬件资源紧张,或者没有额外的定时器提供,而不要方法1的普通延时,可以用汇编指令延时,不会编译优化,延时准确STM32F207在IAR环境/*!*@briefsoftwaredelay*@paramulCount:delay时钟数*@returnnone*@noteulCount每次加1,这个函数加3个时钟*/voidSysCtlDelay(unsignedlongulCount){__asm("subsr0,#1n""bne.nSysCtlDelayn""bxlr");}这3个时钟指的是CPU时钟,即系统时钟。120MHZ,也就是说1s有120M个时钟,一个时钟就是1/120us,也就是周期是1/120us。3个时钟,因为执行了3条指令。使用此方法组织ms和us接口,在Keil和IAR环境下测试均通过。/*120Mhz时钟,当ulCount为1时,函数占用3个时钟,delay=3*1/120us=1/40us*//*SystemCoreClock=120000000us级延时,延时n微秒SysCtlDelay(n*(SystemCoreClock/3000000));ms级延迟,延迟n毫秒SysCtlDelay(n*(SystemCoreClock/3000));m级延迟,延迟n秒SysCtlDelay(n*(SystemCoreClock/3));*/#ifdefined(__CC_ARM)/*!