?? softtimer.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
// 定義軟件定時器結(jié)構
typedef struct
{
unsigned short mLoadValue; // 16位裝載值
unsigned short mCounter; // 16位計數(shù)器
unsigned char mRunFlag; // 運行標志,0-關閉狀態(tài),1-正在計數(shù)
unsigned char mOverFlag; // 溢出標志,0-尚未溢出,1-已經(jīng)溢出
}tSoftT;
// 定義軟件定時器
tSoftT SoftTimer[SOFT_TIMER_NUM];
/***************************************************************************************************
功能:軟件定時器初始化
參數(shù):無
返回:無
***************************************************************************************************/
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); // 使能定時器計數(shù)
}
/***************************************************************************************************
功能:設置指定的軟件定時器的裝載值
參數(shù):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;
}
}
/***************************************************************************************************
功能:獲取指定的軟件定時器的裝載值
參數(shù):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);
}
}
/***************************************************************************************************
功能:啟動指定的軟件定時器(暫停計數(shù)、清除溢出標志、裝載值復制到計數(shù)器,然后倒計數(shù))
參數(shù):n為軟件定時器的編號,取值0~SOFT_TTIMER_NUM-1
返回:無
***************************************************************************************************/
void SoftTimerStart(unsigned char n)
{
if ( n < SOFT_TIMER_NUM )
{
SoftTimer[n].mRunFlag = 0; // 停止計數(shù)
SoftTimer[n].mOverFlag = 0; // 清除溢出標志
SoftTimer[n].mCounter = SoftTimer[n].mLoadValue; // 加載初值
SoftTimer[n].mRunFlag = 1; // 啟動計數(shù)
}
}
/***************************************************************************************************
功能:停止指定的軟件定時器(停止計數(shù)、清除溢出標志)
參數(shù):n為軟件定時器的編號,取值0~SOFT_TTIMER_NUM-1
返回:無
***************************************************************************************************/
void SoftTimerStop(unsigned char n)
{
if ( n < SOFT_TIMER_NUM )
{
SoftTimer[n].mRunFlag = 0; // 停止計數(shù)
SoftTimer[n].mOverFlag = 0; // 清除溢出標志
}
}
/***************************************************************************************************
功能:判斷指定的軟件定時器是否溢出
參數(shù):n為軟件定時器的編號,取值0~SOFT_TTIMER_NUM-1
返回:0-尚未溢出,1-已經(jīng)溢出
***************************************************************************************************/
unsigned char SoftTimerIsOV(unsigned char n)
{
if ( n < SOFT_TIMER_NUM )
{
return(SoftTimer[n].mOverFlag);
}
else
{
return(0);
}
}
/***************************************************************************************************
功能:獲取指定軟件定時器的當前值
參數(shù):n為軟件定時器的編號,取值0~SOFT_TTIMER_NUM-1
返回:無
***************************************************************************************************/
unsigned short SoftTimerValueGet(unsigned char n)
{
if ( n < SOFT_TIMER_NUM )
{
return(SoftTimer[n].mCounter);
}
else
{
return(0);
}
}
/***************************************************************************************************
功能:定時器的中斷服務函數(shù)
參數(shù):無
返回:無
***************************************************************************************************/
void Timer3A_ISR(void)
{
unsigned long ulStatus;
unsigned short i;
ulStatus = TimerIntStatus(TIMER3_BASE , true); // 讀取中斷狀態(tài)
TimerIntClear(TIMER3_BASE , ulStatus); // 清除中斷狀態(tài),重要!
if ( ulStatus & TIMER_TIMA_TIMEOUT ) // 如果是定時器超時中斷
{
for ( i = 0; i < SOFT_TIMER_NUM; i++ ) // 依次處理每個軟件定時器
{
if ( SoftTimer[i].mRunFlag ) // 如果當前軟件定時器是運行狀態(tài)
{
SoftTimer[i].mCounter -= 1; // 計數(shù)器減1
if ( SoftTimer[i].mCounter == 0 ) // 如果計數(shù)器歸0
{
SoftTimer[i].mOverFlag = 1; // 溢出標志置位
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -