在线时间74 小时
UID3323317
注册时间2016-10-25
NXP金币60
TA的每日心情 | 慵懒 2019-7-22 13:56 |
---|
签到天数: 38 天 [LV.5]常住居民I
金牌会员
- 积分
- 1654
- 最后登录
- 2020-10-13
|
本帖最后由 邹姆斯特朗 于 2016-11-18 19:08 编辑
软件平台:keil5.14
硬件平台:LPC824Lite
目的:利用LPC824的SysTick定时器实现精准延时。
.
STC89C51
在51单片机中,常用的延时有三种:
一是for循环或while循环,利用大量次数的的单一执行语句来实现程序的延时,这种延时一般用于对延时精度要求不严格的地方。
二是nop();语句,系统执行一次语句,需要一个指令周期,这个延时用在延时精度要求高但是延时时间很短的场合。
三利用定时器进行延时,精度较高,但是会消耗单片机定时器资源(51就三个定时器)。
LPC824
由于SysTick是一个简单的独立的定时器,他的运行与主系统无关,可以利用这个定时器来产生中断,后进行精准的延时。
ms级延时主要思路:
使能SysTick定时器,选择30M系统时钟作为时钟源,不开启中断,LOAD填充29999。开始while延时,当计时1ms后VAL中的计数为0,CTRL中的COUNTFLAG标志位置1,延时结束。有了相对精准的1ms延时,再利用While结构,即可得到多毫秒延时函数。
us级延时主要思路:
方法基本同上,只不过LOAD中的数值换成29。
- /******************** Copyright(C) 2016, Lab1209 of UJN **********************
- * 文件名 :delay.c
- * 描述 :利用SysTick的精准延屎
- * 软件平台 :Keil5.14
- * 硬件平台 :LPC824
- * 作者 :邹姆斯特朗
- * 修改时间 :2016/11/16
- * 补充 :
- ******************************************************************************/
- #include "delay.h"
- /**************************************************************
- ** 名称 :systick_delay
- ** 描述 :延时time个节拍
- ** 参数 :
- **
- ** 返回值 : 无
- ***************************************************************/
- void systick_delay(uint32_t time)
- {
- if(time > 0xffffff) //24位计数器
- {
- return;
- }
- SysTick->CTRL = 0x00; //先关了 systick ,清标志位
- SysTick->LOAD = time-1; //设置延时时间
- SysTick->VAL = 0x00; //清空计数器
- SysTick->CTRL = 0x05; //使能 systick,时钟源系统时钟,不使用中断
-
- /*Bit16 :COUNTFLAG
- 为计数为 0 标志位,若 STK_VAL 计数至 0,此标志位会被置 1*/
- while( !(SysTick->CTRL & (1<<16))); //等待时间到,
- }
- /**************************************************************
- ** 名称 :SysTick_Handler(void)
- ** 描述 :ms级别延时
- ** 参数 :
- **
- ** 返回值 : 无
- ***************************************************************/
- void systick_delay_ms(uint32_t ms)
- {
- while(ms--)
- {
- systick_delay(30000);
- }
- }
- /**************************************************************
- ** 名称 :systick_delay_us
- ** 描述 :us级延时
- ** 参数 :
- **
- ** 返回值 : 无
- ***************************************************************/
- void systick_delay_us(uint32_t us)
- {
- systick_delay(us * 30);
- }
复制代码
附件程序
delay.zip
(1.4 KB, 下载次数: 30)
|
-
|