我想在 TI 提供的计时器功能上编写一个包装器,以将 其作为类的一部分包括在内。 尽管 我似乎遵循了时间错误的示例中提供的配置,但有些事情仍然无法正常工作。 下面我附上了在空 TIRTOS 上运行的代码示例:
Timer.h
#ifndef USER_TIMER_H_
#define USER_TIMER_H_
#include <ti/drivers/Timer.h>
#include "User/defs.h"
#include "Debug/syscfg/ti_drivers_config.h"
class Timer
{
public:
Timer(uint_least8_t timerIndex);
virtual ~Timer();
Timer_Handle* getHandle();
void updateTimerParams(Timer_Params* newParams);
void updateTimerMode(Timer_Mode newMode);
void updateTimerPeriodUnit(Timer_PeriodUnits newPeriodUnit);
void updateTimerPeriod(uint32_t newPeriod);
void updateTimerCallback(Timer_CallBackFxn newCallback);
EPDStatus timerStart();
void timerStop();
bool isCounting();
private:
Timer_Handle handle;
Timer_Params timerParams;
Timer_PeriodUnits period;
Timer_Mode timerMode;
Timer_CallBackFxn callback;
uint_least8_t timerIndex;
bool isRunning;
void initialTimerSetup();
protected:
};
#endif /* USER_TIMER_H_ */
Timer.cpp
#include <Timer.h>
Timer::Timer(uint_least8_t timerIndex) :
timerIndex(timerIndex)
{
// TODO Auto-generated constructor stub
initialTimerSetup();
}
Timer::~Timer()
{
// TODO Auto-generated destructor stub
timerStop();
}
void Timer::initialTimerSetup()
{
Timer_init();
Timer_Params_init(&timerParams);
}
Timer_Handle* Timer::getHandle()
{
return &this->handle;
}
void Timer::updateTimerParams(Timer_Params *newParams)
{
if (nullptr == newParams)
{
return;
}
this->timerParams.periodUnits = newParams->periodUnits;
this->timerParams.period = newParams->period;
this->timerParams.timerMode = newParams->timerMode;
this->timerParams.timerCallback = newParams->timerCallback;
}
void Timer::updateTimerCallback(Timer_CallBackFxn newCallback)
{
this->timerParams.timerCallback = newCallback;
}
void Timer::updateTimerMode(Timer_Mode newMode)
{
this->timerParams.timerMode = newMode;
}
void Timer::updateTimerPeriodUnit(Timer_PeriodUnits newPeriodUnit)
{
this->timerParams.periodUnits = newPeriodUnit;
}
void Timer::updateTimerPeriod(uint32_t newPeriod)
{
if (newPeriod <= 0)
{
return;
}
this->timerParams.period = newPeriod;
}
EPDStatus Timer::timerStart()
{
this->handle = Timer_open(timerIndex, &timerParams);
if (NULL == this->handle)
{
return EPDStatus::EPD_FAILURE;
}
auto res = Timer_start(handle);
if (Timer_STATUS_SUCCESS == res)
{
isRunning = true;
}
return static_cast<EPDStatus>(res);
}
void Timer::timerStop()
{
Timer_stop(handle);
isRunning = false;
}
bool Timer::isCounting()
{
return Timer_getCount(handle) > 0;
}
定时器初始化和设置。 我在作为任务处理的 empty.c 的主线程中调用此项。
void timerTest(void);
void dummyFunc(Timer_Handle handle, int_fast16_t status);
void timerTest(void)
{
GPIO_init();
static Timer tim(CONFIG_TIMER_0);
Timer_Params timerParams;
timerParams.periodUnits = Timer_PERIOD_US;
timerParams.period = 10 * EPD_S;
timerParams.timerMode = Timer_CONTINUOUS_CALLBACK;
timerParams.timerCallback = dummyFunc;
tim.updateTimerParams(&timerParams);
EPDStatus res = tim.timerStart();
}
void dummyFunc(Timer_Handle handle, int_fast16_t status)
{
++count;
}
defs.h 仅包含一些简单的定义:
#include <cstdint>
#define EPD_MAX_BUFFER 2888
#define EPD_SEND_NO_DATA 0
#define EPD_MS 1000
#define EPD_S 1000000
#define EPD_PIN_HIGH 1
#define EPD_PIN_LOW 0
typedef struct pinType_t
{
uint_least8_t pin;
} pinType;
typedef enum
{
EPD_SUCCESS = 0, EPD_FAILURE = -1
} EPDStatus;
使用调试 器执行此代码后,我可以看到 updateTimerParams 工作正常,计时器参数结构已使用所需的值正确设置。 但是 ,Timer_open (timerIndex,&timerParams);返回 NULL,因此计时器无法启动。 上述错误的示例在测试时起作用,因此我的初始化步骤肯定有问题。 将 初始时间设置移动到时间启动也不起作用,因此我猜测打开计时器时出错了。
我们非常感谢您的帮助。