📄 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
// 定义软件定时器结构
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 + -