⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 softtimer.c

📁 Ctoex内核的LM3S1138的例子
💻 C
字号:
#include  "SoftTimer.H"
#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_ints.h>
#include  <hw_sysctl.h>
#include  <hw_timer.h>
#include  <interrupt.h>
#include  <sysctl.h>
#include  <timer.h>


#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable


//  定义软件定时器结构
typedef  struct
{
    unsigned short  mLoadValue;     //  16位装载值
    unsigned short  mCounter;       //  16位计数器
    unsigned char   mRunFlag;       //  运行标志,0-关闭状态,1-正在计数
    unsigned char   mOverFlag;      //  溢出标志,0-尚未溢出,1-已经溢出
}tSoftT;


//  定义软件定时器
tSoftT  SoftTimer[SOFT_TIMER_NUM];


/***************************************************************************************************
功能:软件定时器初始化
参数:无
返回:无
***************************************************************************************************/
void  SoftTimerInit(void)
{
    unsigned long   value;
    unsigned short  i;

    for ( i = 0;  i < SOFT_TIMER_NUM;  i++ )
    {
        SoftTimer[i].mLoadValue  =  0;
        SoftTimer[i].mCounter    =  0;
        SoftTimer[i].mRunFlag    =  0;
        SoftTimer[i].mOverFlag   =  0;
    }

    value  =  SysCtlClockGet() / 100;
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER3);                     //  使能定时器模块
    TimerConfigure(TIMER3_BASE , TIMER_CFG_32_BIT_PER);         //  配置定时器为32位周期定时器
    TimerLoadSet(TIMER3_BASE , TIMER_A , value);                //  设置定时器初值,定时10ms
    TimerIntEnable(TIMER3_BASE , TIMER_TIMA_TIMEOUT);           //  使能定时器超时中断
    IntEnable(INT_TIMER3A);                                     //  使能定时器中断
    IntMasterEnable();                                          //  使能处理器中断
    TimerEnable(TIMER3_BASE , TIMER_A);                         //  使能定时器计数
}


/***************************************************************************************************
功能:设置指定的软件定时器的装载值
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
      value是16位装载值,取值1~65535
返回:无
***************************************************************************************************/
void  SoftTimerLoadSet(unsigned char  n ,  unsigned short  value)
{
    if ( n < SOFT_TIMER_NUM )
    {
        SoftTimer[n].mLoadValue  =  value;
    }
}


/***************************************************************************************************
功能:获取指定的软件定时器的装载值
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
返回:16位装载值,范围0~65535
***************************************************************************************************/
unsigned short  SoftTimerLoadGet(unsigned char  n)
{
    if ( n < SOFT_TIMER_NUM )
    {
        return(SoftTimer[n].mLoadValue);
    }
    else
    {
        return(0);
    }
}


/***************************************************************************************************
功能:启动指定的软件定时器(暂停计数、清除溢出标志、装载值复制到计数器,然后倒计数)
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
返回:无
***************************************************************************************************/
void  SoftTimerStart(unsigned char  n)
{
    if ( n < SOFT_TIMER_NUM )
    {
        SoftTimer[n].mRunFlag   =  0;                           //  停止计数
        SoftTimer[n].mOverFlag  =  0;                           //  清除溢出标志
        SoftTimer[n].mCounter   =  SoftTimer[n].mLoadValue;     //  加载初值
        SoftTimer[n].mRunFlag   =  1;                           //  启动计数
    }
}


/***************************************************************************************************
功能:停止指定的软件定时器(停止计数、清除溢出标志)
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
返回:无
***************************************************************************************************/
void  SoftTimerStop(unsigned char  n)
{
    if ( n < SOFT_TIMER_NUM )
    {
        SoftTimer[n].mRunFlag   =  0;                           //  停止计数
        SoftTimer[n].mOverFlag  =  0;                           //  清除溢出标志
    }
}


/***************************************************************************************************
功能:判断指定的软件定时器是否溢出
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
返回:0-尚未溢出,1-已经溢出
***************************************************************************************************/
unsigned char  SoftTimerIsOV(unsigned char  n)
{
    if ( n < SOFT_TIMER_NUM )
    {
        return(SoftTimer[n].mOverFlag);
    }
    else
    {
        return(0);
    }
}


/***************************************************************************************************
功能:获取指定软件定时器的当前值
参数:n为软件定时器的编号,取值0~SOFT_TTIMER_NUM-1
返回:无
***************************************************************************************************/
unsigned short  SoftTimerValueGet(unsigned char  n)
{
    if ( n < SOFT_TIMER_NUM )
    {
        return(SoftTimer[n].mCounter);
    }
    else
    {
        return(0);
    }
}


/***************************************************************************************************
功能:定时器的中断服务函数
参数:无
返回:无
***************************************************************************************************/
void  Timer3A_ISR(void)
{
    unsigned long   ulStatus;
    unsigned short  i;

    ulStatus  =  TimerIntStatus(TIMER3_BASE , true);            //  读取中断状态
    TimerIntClear(TIMER3_BASE , ulStatus);                      //  清除中断状态,重要!

    if ( ulStatus & TIMER_TIMA_TIMEOUT )                        //  如果是定时器超时中断
    {
        for ( i = 0;  i < SOFT_TIMER_NUM;  i++ )                //  依次处理每个软件定时器
        {
            if ( SoftTimer[i].mRunFlag )                        //  如果当前软件定时器是运行状态
            {
                SoftTimer[i].mCounter  -=  1;                   //  计数器减1

                if ( SoftTimer[i].mCounter  ==  0 )             //  如果计数器归0
                {
                    SoftTimer[i].mOverFlag  =  1;               //  溢出标志置位
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -