查看: 4022|回复: 0

[原创] 【LPC11U68开发板】4.systick时钟的使用

[复制链接]
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 1806 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    54

    主题

    4455

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    9331
    最后登录
    2025-8-27
    发表于 2018-11-16 15:33:41 | 显示全部楼层 |阅读模式
    本帖最后由 morphlings2014 于 2018-11-16 15:40 编辑

    滴答时钟的使用其实和ST芯片是一样的,设置也比较简单
    调用SysTick_Config(SystemCoreClock / n);就可以直接配置固定时常的定时中断,比如n = 1000,就是1ms中断
    /**
    * @brief    Handle interrupt from SysTick timer
    * @return    Nothing
    */
    void SysTick_Handler(void)
    {

    }

    中断函数里面可以放一些标志位的设置,就完成了定时中断的功能。

    利用systick设置延时函数,也是比较常规的使用。
    以下是我的延时函数实现,在不重置systick的情况下达到延时的效果

    初始化的时候我还是调用了库函数,开启了100ms的定时中断,设置了us延时时systick需要走过的时钟周期数
    void delay_init(uint8_t sysclk)
    {
            SysTick_Config(SystemCoreClock / 10);
            us_ticks = sysclk;
    }        

    us延时函数,ticks表示延时nus,systick需要走过的时钟周期数,start_tick是延时开始时的时钟周期数,cur_tick是当前的时钟周期数,total_tick是延时开始之后总的时钟周期数,当total_tick >= systick,表示延时时间到,ms延时是基于us延时实现的。void delay_us(uint32_t nus)
    {
            uint32_t ticks;
            uint32_t start_tick, cur_tick, total_tick = 0;
            uint32_t reload_tick = SysTick->LOAD;
            
            ticks = nus * us_ticks;
            start_tick = SysTick->VAL;

            while (1)
            {
                    cur_tick = SysTick->VAL;
                   
                    if (cur_tick != start_tick)
                    {
                            if (cur_tick < start_tick)
                                    total_tick += start_tick - cur_tick;
                            else
                                    total_tick += reload_tick - cur_tick + start_tick;
                            start_tick = cur_tick;
                            if (total_tick >= ticks)
                                    break;
                    }
            }
    }

    void delay_ms(uint16_t nms)
    {
            uint16_t i;
            
            for (i = 0; i < nms; i++)
                    delay_us(1000);
    }

    这样写延时就不会影响systick中断的使用,比较理想。


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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-31 06:39 , Processed in 0.089327 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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