STM32的几种延时方法

上传人:宝路 文档编号:14909718 上传时间:2017-11-02 格式:DOCX 页数:3 大小:33.30KB
返回 下载 相关 举报
STM32的几种延时方法_第1页
第1页 / 共3页
STM32的几种延时方法_第2页
第2页 / 共3页
STM32的几种延时方法_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《STM32的几种延时方法》由会员分享,可在线阅读,更多相关《STM32的几种延时方法(3页珍藏版)》请在金锄头文库上搜索。

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

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

3、e_delay,从而实现延时。volatile 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(

4、volatile unsigned long nus)/SYSTICK 分频-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 不完全手册 。SYS

5、TICK 的时钟固定为 HCLK 时钟的 1/8,在这里我们选用内部时钟源 72M,所以 SYSTICK 的时钟为 9M,即SYSTICK 定时器以 9M 的频率递减。SysTick 主要包含CTRL、LOAD、VAL 、CALIB 等 4 个寄存器,SysTick-CTRL位段 名称 类型 复位值描述16 COUNTFLAG R 0 如果在上次读本寄存器后 systick 已为 0,则该位为 1,若 读该位自动清零2 CLKSOURCE RW 0 0:外部时钟源 1:内部时钟1 TICKINT RW 0 0:减到 0 无动作;1:减到 0 产生 systick 异常请求0 ENABLE RW

6、 0 systick 定时器使能位 SysTick- LOAD位段 名称 类型 复位值 描述23:0 RELOAD RW 0 减到 0 时被重新装载的值SysTick- VAL位段 名称 类型 复位值 描述23:0 CURRENT RW 0 读取时返回当前倒计数的值,写则清零,同时还会清除在 systick 控制及状态寄存器中的COUNTFLAG 标志SysTick- CALIB 不常用,在这里我们也用不到,故不介绍了。程序如下,相当于查询法。/仿原子延时,不进入 systic 中断void delay_us(u32 nus)u32 temp;SysTick-LOAD = 9*nus;SysT

7、ick-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; /清空计数器三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号