搜索
bottom↓
回复: 0

LPC1766 SYSTICK 延迟函数设计 遇到的疑问 请教大家 :)

[复制链接]

出0入0汤圆

发表于 2013-12-14 21:31:02 | 显示全部楼层 |阅读模式
大家好,想利用 systick 开发一个ms级的定时器 发现 LPC1766只能支持 最小为10ms计时单位的 延迟程序 。
其实 10ms级别也可以接受 但是以下参考代码 看着好像有点问题 。

#include "LPC17xx.h"
#include "type.h"
#include "systick.h"
#include "nvic.h"

#define SYSTICK_ENABLE              0                                          /* Config-Bit to start or stop the SysTick Timer                         */
#define SYSTICK_TICKINT             1                                          /* Config-Bit to enable or disable the SysTick interrupt                 */
#define SYSTICK_CLKSOURCE           2                                          /* Clocksource has the offset 2 in SysTick Control and Status Register   */
#define SYSTICK_MAXCOUNT       ((1<<24) -1)                                    /* SysTick MaxCount                                                      */
  
volatile uint32 TimeTick = 0;


//********************************************************
//功能:           系统Tick中断程序,中断时间为每1MS
//输入:           NONE
//输出:                NONE
//********************************************************
void SysTick_Handler(void)
{
          TimeTick++;
}

//********************************************************
//功能:           系统Tick初始化配置
//输入:           NONE
//输出:                NONE
//********************************************************
uint32 SysTick_Config(uint32 ticks)
{
        if (ticks > SYSTICK_MAXCOUNT)  return (1);  
        NVIC_ST_RELOAD = (ticks & SYSTICK_MAXCOUNT) - 1;

        NVIC_SYS_H_PRI15 = 0x48;
        NVIC_ST_CURRENT = 0x00;
        NVIC_ST_CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT);
        return 0;
}

//********************************************************
//功能:           延时Ticd ms
//输入:           NONE
//输出:                NONE
//********************************************************
void Delay (uint32 tick)
{
          uint32 systickcnt;
         
          systickcnt = TimeTick;
          while ((TimeTick - systickcnt) < tick);
}

void delaySysTick(uint32 tick)
{
          uint32 timetick;
         
          /* Enable the SysTick Counter */
          SysTick_CounterCmd(SysTick_Counter_Enable);
         
          timetick = TimeTick;
          while ((TimeTick - timetick) < tick);
         
          /* Disable SysTick Counter */
          SysTick_CounterCmd(SysTick_Counter_Disable);
         
          /* Clear SysTick Counter */
          SysTick_CounterCmd(SysTick_Counter_Clear);
}


我分析,在 Delay函数中 ,实参为 TimeTick是全局变量初始化为0,在Systick的中断服务函数中每次加1,。因此进入Delay 函数后,systickcnt赋值为0,而后在While语句中,不断进入systick中断服务,Timetick不断加1,TimeTick和Systickcnt的差值不断增大,直到中断延时到达延迟参考比较值。

参考代码似乎可行,但感觉 Systickcnt 似乎有点多余,各位高手看呢?

谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 21:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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