查看: 4812|回复: 12

[分享] 【LPC824lite】systick延时

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15250
    最后登录
    1970-1-1
    发表于 2016-10-22 11:35:36 | 显示全部楼层 |阅读模式
    在ARM MCU中都有一个SYSTICK模块,可实现定时,用于操作系统的心跳,虽然属于cortex内核的部件,但不同公司的也会略有区别。
    比如LPC824的systick使用了24位,时钟选择可选系统时钟或系统时钟2分频。STM32中可选HCLK或HCLK8分频
    QQ截图20161022111351.png
    这是框图
    QQ截图20161022111418.png
    下面是内部寄存器
    QQ截图20161022111442.png
    我们在不适用操作系统时,可以把它当作普通的定时器,可中断使用,也可以查询方式。
    我这里把它作为延时使用,写了一个us、ms、s的延时函数,以便使用。例程中使用中断方式,我这里使用查询方式,其实主要想得到us级延时
    QQ截图20161022111612.png

    初始化,默认采用除2的方式
    QQ截图20161022111633.png
    us延时
    QQ截图20161022111653.png
    ms延时
    QQ截图20161022111709.png
    秒演示
    QQ截图20161022111719.png
    来个测试程序,延时1000ms的灯闪烁。
    QQ截图20161022111825.png
    演示效果就不上了。
    delay.h文件
    1. #ifndef DELAY_H_
    2. #define DELAY_H_

    3. #include "chip.h"

    4. void Delay_Init(uint32_t SYSCLK);
    5. void Delay_Ms(uint16_t nms);
    6. void Delay_Us(uint16_t nus);
    7. void Delay_S(uint16_t ns);

    8. #endif /* DELAY_H_ */
    复制代码
    delay.c文件
    1. #include "delay.h"

    2. static uint8_t  facUs=0;
    3. static uint16_t facMs=0;

    4. void Delay_Init(uint32_t SYSCLK)
    5. {
    6.     facUs=(uint8_t)(SYSCLK / 2 / 1000000);
    7.     facMs =(uint16_t)(SYSCLK / 2 / 1000);
    8. }

    9. void Delay_Us(uint16_t nus)
    10. {
    11.     uint32_t temp;
    12.     SysTick->LOAD = nus * facUs - 1;
    13.     SysTick->VAL = 0x00;
    14.     SysTick->CTRL = 0x01;
    15.     do
    16.     {
    17.          temp = SysTick->CTRL;
    18.     }
    19.     while(temp & 0x01 && !(temp & (1 << 16)));
    20.     SysTick->CTRL = 0x00;
    21.     SysTick->VAL = 0x00;
    22. }

    23. void Delay_Ms(uint16_t nms)
    24. {
    25.     uint32_t temp;
    26.     SysTick->LOAD = nms * facMs - 1;
    27.     SysTick->VAL=0x00;
    28.     SysTick->CTRL = 0x01;
    29.     do
    30.     {
    31.          temp = SysTick->CTRL;
    32.     }
    33.     while(temp & 0x01 && !(temp & (1 << 16)));

    34.     SysTick->CTRL = 0x00;
    35.     SysTick->VAL = 0x00;
    36. }

    37. void Delay_S(uint16_t ns)
    38. {
    39.         uint16_t i;
    40.         for (i = 0; i < ns; i ++)
    41.         {
    42.                 Delay_Ms(1000);
    43.         }
    44. }
    复制代码




    回复

    使用道具 举报

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

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15250
    最后登录
    1970-1-1
     楼主| 发表于 2016-10-22 11:36:56 | 显示全部楼层
    忘了说了,这里如果想要几秒钟延时,不要使用Delay_Ms延时。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3944
    最后登录
    2023-6-2
    发表于 2016-10-22 13:03:01 | 显示全部楼层
    今天看了下UM,觉得写的还是很好的~详细.
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-6 16:47
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    2

    主题

    318

    帖子

    0

    高级会员

    Rank: 4

    积分
    759
    最后登录
    2018-2-24
    发表于 2016-10-22 13:37:40 | 显示全部楼层
    感谢分享!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-21 22:51
  • 签到天数: 369 天

    [LV.9]以坛为家II

    7

    主题

    2716

    帖子

    7

    金牌会员

    Rank: 6Rank: 6

    积分
    1824
    最后登录
    2019-3-21
    发表于 2016-10-22 18:36:41 | 显示全部楼层
    学习到了~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15250
    最后登录
    1970-1-1
     楼主| 发表于 2016-10-22 20:05:23 | 显示全部楼层
    andrewz 发表于 2016-10-22 13:03
    今天看了下UM,觉得写的还是很好的~详细.

    是的,这个参考手册写的还是不错的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5382
    最后登录
    2021-12-22
    发表于 2017-1-29 13:52:48 | 显示全部楼层
    其实主要想得到us级延时  ???

    误差有多大? 如何调整??
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-29 09:14
  • 签到天数: 2 天

    [LV.1]初来乍到

    4

    主题

    100

    帖子

    0

    高级会员

    Rank: 4

    积分
    501
    最后登录
    1970-1-1
    发表于 2017-2-8 12:27:07 | 显示全部楼层
    这个定时不就是等待延时,中间不能干别的吧,mS级就不适用吧
    回复 支持 反对

    使用道具 举报

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

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15250
    最后登录
    1970-1-1
     楼主| 发表于 2017-2-8 20:50:24 | 显示全部楼层
    Aihe 发表于 2017-2-8 12:27
    这个定时不就是等待延时,中间不能干别的吧,mS级就不适用吧

    是滴,相当于软件延时
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-10-7 11:39
  • 签到天数: 2 天

    [LV.1]初来乍到

    25

    主题

    134

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    390
    最后登录
    2020-9-5
    发表于 2017-2-9 14:52:28 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 08:06 , Processed in 0.142174 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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