STM32的几种延时方法_第1页
STM32的几种延时方法_第2页
STM32的几种延时方法_第3页
STM32的几种延时方法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.STM32的几种延时方法(基于MDK固件库3.0,晶振8M)单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。/粗延时函数,微秒void delay_us(u16 time)u16 i=0;while(time-)i=10;/自己定义while(i-) ;/毫秒级的延时void delay_ms(u16 time)u16 i=0;while(time-)i=1200

2、0;/自己定义while(i-) ;2.SysTick 定时器延时CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32 的参考手册里面介绍的很简单,其详细介绍,请参阅Cortex-M3 权威指南。这里面也有两种方式实现:a.中断方式如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。volatile

3、unsigned long time_delay; / 延时时间,注意定义为全局变量/延时n_msvoid delay_ms(volatile unsigned long nms)/SYSTICK分频-1ms的系统时钟中断if (SysTick_Config(SystemFrequency/1000)while (1);time_delay=nms;/读取定时时间while(time_delay);SysTick-CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器/延时nusvoid delay_us(volatile unsigned long nus)/S

4、YSTICK分频-1us的系统时钟中断if (SysTick_Config(SystemFrequency/1000000)while (1);time_delay=nus;/读取定时时间while(time_delay);SysTick-CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器/在中断中将time_delay递减。实现延时void SysTick_Handler(void)if(time_delay)time_delay-;b.非中断方式主要仿照原子的STM32不完全手册。SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源

5、72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器,SysTick-CTRL位段名称类型复位值描述16COUNTFLAGR0如果在上次读本寄存器后systick已为0,则该位为1,若读该位自动清零2CLKSOURCERW00:外部时钟源 1:内部时钟1TICKINTRW00:减到0无动作;1:减到0产生systick异常请求0ENABLERW0systick定时器使能位SysTick- LOAD位段名称类型复位值描述23:0RELOADRW0减到0时被重新装载的值SysTick- VAL

6、位段名称类型复位值描述23:0CURRENTRW0读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG 标志SysTick- CALIB 不常用,在这里我们也用不到,故不介绍了。程序如下,相当于查询法。/仿原子延时,不进入systic中断void delay_us(u32 nus)u32 temp;SysTick-LOAD = 9*nus;SysTick-VAL=0X00;/清空计数器SysTick-CTRL=0X01;/使能,减到零是无动作,采用外部时钟源dotemp=SysTick-CTRL;/读取当前倒计数值while(temp&0x01)&(!(temp&(1CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器void delay_ms(u16 nms)u32 temp;SysTick-LOAD = 9000*nms;SysTick-VAL=0X00;/清空计数器SysTick-CTRL=0X01;/使能,减到零是无动作,采用外部时钟源dotemp=SysTick-CTRL;/读取当前倒计数值while(temp&0x01)&(!(temp&(1CTRL=0x00; /关闭计数器SysTick-VAL =0X00; /清空计数器三种方式各有利弊,第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论