查看: 3163|回复: 7

[原创] 【LPC11U68】4. Systick延时

[复制链接]
  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
    发表于 2018-11-2 09:28:13 | 显示全部楼层 |阅读模式
    本帖最后由 stm1024 于 2018-11-2 11:10 编辑

    Systick作为核内外设,不同的MCU上使用上其实是一样的,但是在LCP11U68中, 测试出现这样的问题:
    1. void Delay_ms(uint32_t ms)
    2. {
    3.     uint32_t temp;
    4.     SysTick->CTRL=0;//disable   
    5.         SysTick->LOAD=ms*48000;   
    6.     SysTick->VAL=0;
    7.     //CLKSOURCE=1,时钟=主时钟
    8.         SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_ENABLE_Msk;
    9.         do
    10.         {
    11.                 temp=SysTick->CTRL;
    12.         }while((temp&0x01)&&(!(temp&(1<<16))));
    13.         SysTick->CTRL=0;//disable
    14.         SysTick->VAL=0;
    15. }
    复制代码
    调用这个函数,不管提供什么样的参数,刷新时间间隔都是200ms左右,有测试过的网友吗,说说啥情况?
    1. int main()
    2. {
    3.     char buff[64]="";
    4.     Board_Init();
    5.     SystemCoreClockUpdate();
    6.     Board_UARTPutSTR("333\r\n");
    7.     sprintf(buff,"SystemCoreClock=%d\r\n",SystemCoreClock);
    8.     Board_UARTPutSTR(buff);
    9.     while(1)
    10.     {
    11.         Board_UARTPutSTR(buff);
    12.         Delay_ms(10000);
    13.     }
    14. }
    复制代码

    2018-11-02_092634.png

    问题分析与解决,见三楼。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
     楼主| 发表于 2018-11-2 11:09:26 | 显示全部楼层
    本帖最后由 stm1024 于 2018-11-2 20:44 编辑

    LPC11U68的12MHz晶振,在内部被PLL提升到了48MHz,因此,如果需要延时1秒,则需要48000000个tick。
    但是,Systick的LOAD中,只有24位,而不是32位,0xffffff=16777215,也就是说,即使把LOAD寄存器填满,最大的延时也就是:16777216/48000000=349.5ms,所以,单次的1000ms是不可能的。
    但是我就是要延时更长时间,怎么办?
    1. 把Systick的时钟源调低一点。
    看手册(The Definitive Guide to ARM Cortex-M0 and Cortex-M0+ Processors,2e),p247:
    2018-11-02_111250.png
    如果CLKSOURCE=1,则Systick使用的就是CPU时钟,或者系统时钟。如果是0,就要看MCU是如何设计的了。

    再看手册“LPC11U6x User manual”,p422:
    2.png
    LPC11U6x的设计上,是使用的系统时钟的2分频。
    所以,原则上,我们可以把延时延长为原来的2倍,但是也就650ms左右。
    似乎还是不够?

    2.反复调用
    这个就是存软件层面的方法了。既然一次搞不定,那就再来几次。直接丢代码:
    1. void Delay_ms(uint32_t ms)
    2. {
    3.     uint32_t temp;
    4.     uint16_t m, n, i;
    5.     SysTick->CTRL = 0; //disable
    6.     m = ms / 100; //100ms数
    7.     n = ms % 100; //不足100ms数
    8.     //m*100 ms
    9.     for(i = 0; i < m; i++)
    10.     {
    11.         SysTick->LOAD = 4800000-1;
    12.         SysTick->CTRL = 5;
    13.         do
    14.         {
    15.             temp = SysTick->CTRL;
    16.         } while((temp & 0x01) && (!(temp & (1 << 16))));
    17.     }
    18.     //n ms(n<100)
    19.     if(n==0)return;
    20.     SysTick->LOAD = 48000*n-1;
    21.     do
    22.     {
    23.         temp = SysTick->CTRL;
    24.     } while((temp & 0x01) && (!(temp & (1 << 16))));
    25.     SysTick->CTRL = 0; //disable
    26.     SysTick->VAL = 0;
    27. }
    复制代码



    测试结果:
    1111.png
    实际延时大概是1300ms左右。



    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
     楼主| 发表于 2018-11-2 09:39:41 | 显示全部楼层
    问题已解决,一会发详细说明。

    点评

    好的  发表于 2018-11-2 10:41
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.7]常住居民III

    92

    主题

    1114

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7784

    热心会员

    最后登录
    2024-5-6
    发表于 2018-11-2 10:53:29 | 显示全部楼层
    延时时间太大了,滴答定时器一共才24位,你可以写个定时1ms的然后循环调用来延时
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
     楼主| 发表于 2018-11-2 11:44:03 | 显示全部楼层
    az158 发表于 2018-11-2 10:53
    延时时间太大了,滴答定时器一共才24位,你可以写个定时1ms的然后循环调用来延时 ...

    感谢回复,我也是按了一下计算器之后发现这个问题的,以前用STM32,使用的是没有PLL的时钟源,所以没这个问题,当时也没太在意
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-5 11:15
  • 签到天数: 1061 天

    [LV.10]以坛为家III

    29

    主题

    1517

    帖子

    31

    金牌会员

    Rank: 6Rank: 6

    积分
    4972
    最后登录
    2024-4-21
    发表于 2018-11-2 15:53:56 | 显示全部楼层
    学习了,在以后的程序中注意
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93126
    最后登录
    2024-5-8
     楼主| 发表于 2019-4-6 10:55:05 | 显示全部楼层
    all the same
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-9 06:34 , Processed in 0.160815 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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