查看: 2601|回复: 5

[原创] LPC11U68开发板(七)SysTick

[复制链接]
  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2018-11-22 17:09:09 | 显示全部楼层 |阅读模式
           本次实验测试是利用系统滴答定时器“systick”产生微秒及毫秒定时,程序是参照网上资料修改,实际运行时还存在一些疑问
    一、实验资源
    1、LPC11U68(OM13058)开发板;
    2、KEIL V5.25.2.0;
    3、lpcopen_3_03_keil_iar_lpcxpresso_11u68;
    4、逻辑分析仪及配套软件;

    二、实验过程
    1、先看看修改的函数:
    1. static uint8_t  fac_us=0;                                                        //us延时倍乘数                          
    2. static uint16_t fac_ms=0;                                                        //ms延时倍乘数

    3. void delay_init()
    4. {       
    5.         SysTick_Config(SystemCoreClock);
    6.         fac_us = SystemCoreClock / 2000000;                               
    7.         fac_ms = (uint16_t)fac_us * 1000;                                  
    8. }                                                                    

    9. //延时nus                                                                                      
    10. void delay_us(uint32_t nus)
    11. {               
    12.         uint32_t temp;                     
    13.         SysTick->LOAD = nus * fac_us;                                                         //时间加载                           
    14.         SysTick->VAL = 0x00;                                                                        //清空计数器
    15.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;        //开始倒数          
    16.         do
    17.         {
    18.                 temp = SysTick->CTRL;
    19.         }while((temp&0x01)&&!(temp&(1<<16)));                                //等待时间到达   
    20.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
    21.         SysTick->VAL = 0X00;                                                                               //清空计数器         
    22. }

    23. //延时nms
    24. void delay_ms(uint16_t nms)
    25. {                                     
    26.         uint32_t temp;                  
    27.         SysTick->LOAD = (uint32_t)nms * fac_ms;                        //时间加载
    28.         SysTick->VAL = 0x00;                                                                                                //清空计数器
    29.         SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
    30.         do
    31.         {
    32.                 temp = SysTick->CTRL;
    33.         }while((temp&0x01)&&!(temp&(1<<16)));                                //等待时间到达   
    34.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
    35.         SysTick->VAL = 0X00;                                                                               //清空计数器                      
    36. }
    复制代码


    2、这是测试端口的函数及相关宏定义:
    1. #define LED_HIGH()    Chip_GPIO_WritePortBit(LPC_GPIO, 2, 17, 1); \
    2.                                   Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 1)
    3. #define LED_LOW()     Chip_GPIO_WritePortBit(LPC_GPIO, 2, 17, 0); \
    4.                                   Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 0)
    复制代码
    1. void LED_Port_Init(void)
    2. {
    3.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能  
    4.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 9, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));       
    5.         Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 17);//设置PIO2_17端口为输出
    6.         Chip_GPIO_SetPinDIROutput(LPC_GPIO, 1, 9);//设置PIO1_9端口为输出,用于测试采样。
    7. }
    复制代码


    3、下面测试主函数:
    1. int main(void)
    2. {
    3.         uint16_t time = 65535;
    4.         SystemCoreClockUpdate();
    5.         delay_init();
    6.         LED_Port_Init();
    7.         while(1)
    8.         {
    9.                 LED_HIGH();
    10.                 delay_us(time);
    11.                 //delay_ms(time);
    12.                 LED_LOW()
    13.                 delay_us(time);
    14.                 //delay_ms(time);
    15.         }
    16. }
    复制代码


    三、实验结果
    1、10毫秒:
    10ms.png

    2、699毫秒:
    699ms.png

    3、700毫秒:time>699后结果就不对了。
    QQ截图20181122163739.png

    4、10微秒
    10us.png

    5、100微秒
    100us (2).png

    6、500微秒
    500us.png

    7、5000微秒
    5000u.png

    8、再来个高值65535
    65535u.png

    从上面的实测数据看延时时间还能接受,但毫秒参数time>699就会出错;微秒延时在uint16_t time = 65535时也是正常的。

    四、实验总结
          之前测试到time=500,感觉还行就开始其它实验了,但实际应用时发现毫秒延时当time>699时会出问题。本次实验前也参阅了坛友“stm1024”的帖子(https://www.nxpic.org.cn/module/forum/thread-615231-1-1.html),希望同朋友们进一步交流。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1114

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7782

    热心会员

    最后登录
    2024-5-6
    发表于 2018-11-22 17:51:21 | 显示全部楼层
    本帖最后由 az158 于 2018-11-22 17:53 编辑

    同一个问题,滴答定时器是20位的,延时过大溢出了,其实滴答时钟定时这种写法并不是特别好,刚刚看了一下 https://www.nxpic.org.cn/module/forum/thread-615578-1-1.html 这个贴子的写法很好,参考一下这个
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2018-11-22 19:38:59 | 显示全部楼层
    az158 发表于 2018-11-22 17:51
    同一个问题,滴答定时器是20位的,延时过大溢出了,其实滴答时钟定时这种写法并不是特别好,刚刚看了一下 h ...

    谢谢,我去看看。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5396
    最后登录
    2021-12-22
    发表于 2018-11-22 21:24:21 | 显示全部楼层
    本帖最后由 okwh 于 2018-11-22 21:36 编辑

    fac_us = SystemCoreClock / 2000000;  
    请教
    这个2000000的依据是什么? 不是1000000?
    有些帖子写的 ms 是  SysTick->LOAD=ms*48000;   
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2018-11-23 16:31:31 | 显示全部楼层
    okwh 发表于 2018-11-22 21:24
    fac_us = SystemCoreClock / 2000000;  
    请教
    这个2000000的依据是什么? 不是1000000?

    要说依据只能说是蒙的,从其它程序移植过来也做了很多尝试,这个数能与延时函数的形参匹配。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5396
    最后登录
    2021-12-22
    发表于 2018-11-24 15:03:36 | 显示全部楼层
    lising 发表于 2018-11-23 16:31
    要说依据只能说是蒙的,从其它程序移植过来也做了很多尝试,这个数能与延时函数的形参匹配。 ...

    也许 可能 systick时钟是coreclock 二分频后的?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-8 22:37 , Processed in 0.146978 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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