查看: 4667|回复: 29

[原创] 【从51到M0+】 Delay

[复制链接]
  • TA的每日心情
    慵懒
    2019-7-22 13:56
  • 签到天数: 38 天

    [LV.5]常住居民I

    20

    主题

    644

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1654
    最后登录
    2020-10-13
    发表于 2016-11-17 16:27:04 | 显示全部楼层 |阅读模式
    本帖最后由 邹姆斯特朗 于 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。
    1. /******************** Copyright(C) 2016, Lab1209 of UJN **********************
    2. * 文件名       :delay.c
    3. * 描述         :利用SysTick的精准延屎
    4. * 软件平台     :Keil5.14
    5. * 硬件平台     :LPC824
    6. * 作者         :邹姆斯特朗
    7. * 修改时间     :2016/11/16
    8. * 补充         :
    9. ******************************************************************************/
    10. #include "delay.h"


    11. /**************************************************************
    12. ** 名称   :systick_delay
    13. ** 描述   :延时time个节拍      
    14. ** 参数   :   
    15. **                              
    16. ** 返回值 :   无
    17. ***************************************************************/
    18. void systick_delay(uint32_t time)
    19. {
    20.     if(time > 0xffffff)   //24位计数器
    21.     {
    22.         return;
    23.     }

    24.     SysTick->CTRL = 0x00;                        //先关了 systick ,清标志位
    25.     SysTick->LOAD = time-1;                     //设置延时时间
    26.     SysTick->VAL = 0x00;                        //清空计数器
    27.     SysTick->CTRL = 0x05;                       //使能 systick,时钟源系统时钟,不使用中断
    28.                
    29.         /*Bit16 :COUNTFLAG
    30.     为计数为 0 标志位,若 STK_VAL 计数至 0,此标志位会被置 1*/
    31.     while( !(SysTick->CTRL & (1<<16)));   //等待时间到,

    32. }

    33. /**************************************************************
    34. ** 名称   :SysTick_Handler(void)
    35. ** 描述   :ms级别延时      
    36. ** 参数   :   
    37. **                              
    38. ** 返回值 :   无
    39. ***************************************************************/
    40. void systick_delay_ms(uint32_t ms)
    41. {
    42.     while(ms--)
    43.     {
    44.         systick_delay(30000);
    45.     }
    46. }

    47. /**************************************************************
    48. ** 名称   :systick_delay_us
    49. ** 描述   :us级延时      
    50. ** 参数   :   
    51. **                              
    52. ** 返回值 :   无
    53. ***************************************************************/
    54. void systick_delay_us(uint32_t us)
    55. {
    56.    systick_delay(us * 30);
    57. }
    复制代码



    附件程序 delay.zip (1.4 KB, 下载次数: 30)
    延时70ms电平翻转.jpg
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-23 10:20
  • 签到天数: 45 天

    [LV.5]常住居民I

    4

    主题

    689

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1346
    最后登录
    2019-2-13
    发表于 2016-11-17 17:38:37 | 显示全部楼层
    感谢分享
    dfdfdfdfdfdfdfd dsfa222
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-3 10:27
  • 签到天数: 131 天

    [LV.7]常住居民III

    19

    主题

    519

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1560
    最后登录
    2022-6-26
    发表于 2016-11-17 18:36:59 | 显示全部楼层
    豪做友
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15371
    最后登录
    1970-1-1
    发表于 2016-11-17 18:48:31 | 显示全部楼层
    支持一个
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
    发表于 2016-11-17 19:38:37 | 显示全部楼层
    学习一下
    签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-4-28 22:47
  • 签到天数: 233 天

    [LV.7]常住居民III

    0

    主题

    623

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1431
    最后登录
    2022-10-20
    发表于 2016-11-17 19:47:19 | 显示全部楼层
    我在折腾新唐8051的芯片,内心苦啊,每次烧写都要拔下来,还不能仿真,与ARM的体验差远了。
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-2-21 09:26
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    0

    主题

    59

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    258
    最后登录
    2022-9-7
    发表于 2016-11-17 21:02:11 | 显示全部楼层
    挺好的,后面能写个PIT的定时器和FTM定时器的用法吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-17 08:07
  • 签到天数: 273 天

    [LV.8]以坛为家I

    74

    主题

    2338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7361
    最后登录
    2021-8-30
    发表于 2016-11-18 08:10:54 | 显示全部楼层
    精品之作啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-16 12:20
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    12

    主题

    653

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1667
    最后登录
    2022-5-2
    发表于 2016-11-18 08:20:07 | 显示全部楼层
    学习了                 
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-11-18 11:19:29 | 显示全部楼层
    谢谢分析                          
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-13 01:54 , Processed in 0.165230 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表