This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-CC2652RB:为什么我配置的计时器无法启动?

Guru**** 2549090 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1083939/lp-cc2652rb-why-does-my-configured-timer-not-start

“线程:sysconfig”中讨论的其它部分

我想在 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,因此计时器无法启动。  上述错误的示例在测试时起作用,因此我的初始化步骤肯定有问题。 将 初始时间设置移动时间启动也不起作用,因此我猜测打开计时器时出错了。

我们非常感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,V,

    在哪里初始化 CONFIG_TIMER _0?  请再次参考时间错误的示例,该示例配置 sysconfig 计时器实例,该实例在构建以生成文件后,将填充 ti_drivers_config.c 文件中的计时器配置。  否则,您可以逐步调试并检查变量/寄存器内容,以确保参数初始化和计时器实例符合预期。

    此致,
    瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,瑞安,

    我已经检查 了这两 个配置文件,可以确认我的存在并且似乎是正确的;除了我使用了16位计时器。 如何进一步调试? 如果我在  Timer_init()上设置了断点 ,并进入代码,则我会被抛出代码中与函数没有任何关系的部分。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以直接将<SDK directory\sources\ti\drivers 中的 TimerCC26XX.c/h 和<SDK directory\sources\ti\drivers\timers 中的 TimerCC26XX.c/h 添加到项目中,以绕过预构建的库来调试 Timer API。

    此致,
    瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,瑞安,对我迟到的回复感到抱歉。  
    已经花了更多的时间来调试每一个可能的错误原因, 并找到了此问题的可能原因。 下面的片段是 TimerCC26xx.c 中 Timer_open 的摘录

        if (params->timerMode != Timer_FREE_RUNNING) {
            /* Set Timer Period and Units */
            status = Timer_setPeriod(handle, params->periodUnits, object->period); // last reachable line using the debugger
            if (status != Timer_STATUS_SUCCESS) {
                Timer_close(handle);
                return (NULL);
            }
    
            /* Create the semaphore for blocking mode */
            if (params->timerMode == Timer_ONESHOT_BLOCKING) {
                object->semHandle = SemaphoreP_constructBinary(&(object->semStruct), 0);
    
                if (object->semHandle == NULL) {
                    Timer_close(handle); // however, debugger jumps here and returns NULL
                    return (NULL);
                }
            }

    我觉得奇怪的是,第一个 inner if 子句无法访问,然后代码跳到标有注释的行。 也看不到 Timer_setPeriod 的结果。 object->semHandle 显然是 NULL,但  object->semHandle = SemaphoreP_constructBinary(&(object->semStruct), 0); 似乎不会以任何方式执行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以删除 Arm Compiler Optimizations (Arm 编译器优化)以改进调试行为,并将工作时间错误示例的操作与您的进行比较,以确定导致问题的初始化参数。  您还需要比较.cfg 文件,以确定您的示例是否禁用了信号灯操作或类似操作。

    此致,
    瑞安