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.

AM6442: 如何获取定时器的数值

Part Number: AM6442

您好!TI工程师

        我使用的AM64,我想要去读取一个定时器的数值,我该如何读取,我使用了_t TimerP_getCount(uint32_t baseAddr)这个API,但是读出来的数据是乱的,我该如何处理现在这个问题?

   while(1)
    {
        GPIO_pinWriteHigh(gpioBaseAddr, pinNum);

        /* Sleep for user specified usecs */
        ClockP_usleep(delayuSec);
        NowTime = TimerP_getCount(gTimerBaseAddr[CONFIG_TIMER0]);

        DebugP_log("NowTime = %d!!\r\n",NowTime);

        /* Set gpio output low level */
        GPIO_pinWriteLow(gpioBaseAddr, pinNum);

        /* Sleep for user specified usecs */
        ClockP_usleep(delayuSec);
    }

  • 看样子可能是由于您的代码存在其他问题,例如读取的地址不正确或值,而且还可能是由于你没有正确初始化定时器或者没有正确配置定时器的时钟源。

  • 确认您的定时器已经正确初始化并配置了时钟源。 确认您的TimerP_getCount()函数的参数base

  • void TimerP_init()
    {
        TimerP_Params timerParams;
    
        /* set timer clock source */
        SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MAIN, 2);
        *(volatile uint32_t*)AddrTranslateP_getLocalAddr(CONFIG_TIMER0_CLOCK_SRC_MUX_ADDR) = CONFIG_TIMER0_CLOCK_SRC_CLK_12M_RC;
        SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MAIN, 2);
    
        gTimerBaseAddr[CONFIG_TIMER0] = (uint32_t)AddrTranslateP_getLocalAddr(CONFIG_TIMER0_BASE_ADDR);
    
        TimerP_Params_init(&timerParams);
        timerParams.inputPreScaler = CONFIG_TIMER0_INPUT_PRE_SCALER;
        timerParams.inputClkHz     = CONFIG_TIMER0_INPUT_CLK_HZ;
        timerParams.periodInNsec   = CONFIG_TIMER0_NSEC_PER_TICK;
        timerParams.oneshotMode    = 0;
        timerParams.enableOverflowInt = 0;
        timerParams.enableDmaTrigger  = 0;
        TimerP_setup(gTimerBaseAddr[CONFIG_TIMER0], &timerParams);
    
    
        TimerP_start( gTimerBaseAddr[CONFIG_TIMER0] );
    
    }
    时钟源和定时器都已经配置和打开

  •  这是错误的输出

  • 您好,

    1. 确保您正确地初始化了定时器。在使用定时器之前,您需要先初始化定时器,以确保它正在运行并且处于正确的状态。您可以使用 `TimerP_Params_init()` 函数来初始化 `TimerP_Params` 结构体,然后使用 `TimerP_create()` 函数来创建定时器。例如:

    TimerP_Params timerParams;
    TimerP_Params_init(&timerParams);
    timerParams.period = 1000000; // 定时器周期为1秒
    TimerP_Handle timerHandle = TimerP_create(TimerP_ANY, timerCallback, &timerParams);

    2. 确保您正确地配置了定时器的时钟源。定时器的时钟源可能是内部时钟或外部时钟,具体取决于您的硬件平台和应用程序需求。您可以使用 `TimerP_setTimerClockSource()` 函数来设置定时器的时钟源。例如:

    TimerP_setTimerClockSource(timerHandle, TimerP_CLOCK_SOURCE_INTERNAL);

    3. 确保您正确地读取了定时器计数值。您可以使用 `TimerP_getCount()` 函数来读取定时器的计数值,但是请注意,您需要按照定时器的时钟源和分频器来计算实际的时间。例如,如果您的定时器时钟源是内部时钟,分频器是 64,那么您可以使用以下示例代码来计算实际的时间:

    uint32_t timerCount = TimerP_getCount(timerHandle);
    uint32_t timerClockFreq = ClockP_getTimerFreq();
    uint32_t timerPeriod = TimerP_getPeriod(timerHandle);
    uint32_t actualTime = (timerPeriod - timerCount) * 64 / timerClockFreq;

    在上面的代码中,我们使用 `ClockP_getTimerFreq()` 函数来获取定时器时钟频率,使用 `TimerP_getPeriod()` 函数来获取定时器的周期,然后使用以上公式计算实际的时间。

  • 有没有关于这样的demo?我想看下

  • 因为我在"TimerP.h"文件里面并没有看到你说的TimerP_Handle timerHandle = TimerP_create(TimerP_ANY, timerCallback, &timerParams);,只有一个void TimerP_setup(uint32_t baseAddr, TimerP_Params *params);但是他不返回handle,我不知道怎么获取到定时器的时间

  • 您好,已咨询工程师,正值美国感恩节回复可能有些延迟,谢谢!

  • 您好,

    您能否与我分享其中包含计时器代码片段的项目文件?

    这样我就可以在本地 AM64x 套件上重现此问题。

  • /**
     *  \file    led_flash_a53ss_nortos.c
     *
     *  \brief   Example application main file. This application will toggle the led.
     *           The led toggling will be done inside an callback function, which
     *           will be called by Interrupt Service Routine. Interrupts are
     *           triggered manually and no external source is used to trigger
     *           interrupts.
     *
     *  \version 1.0
     */
    
    #include <stdlib.h>
    #include <drivers/gpio.h>
    #include <kernel/dpl/AddrTranslateP.h>
    #include <kernel/dpl/DebugP.h>
    #include <kernel/dpl/ClockP.h>
    #include "ti_drivers_config.h"
    #include "ti_board_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    
    int main()
    {
        uint32_t    delayuSec = 500000;
        uint32_t    gpioBaseAddr1, pinNum1, gpioBaseAddr2, pinNum2;
    
        /* Init SOC specific modules */
        System_init();
        Board_init();
    
        /* Open drivers to open the UART driver for console */
        Drivers_open();
        Board_driversOpen();
    
        DebugP_log("GPIO LED Flash Application\r\n");
    
        /* Get address after translation translate */
        gpioBaseAddr1 = (uint32_t) AddrTranslateP_getLocalAddr(GPIO_LED1_BASE_ADDR);
        pinNum1       = GPIO_LED1_PIN;
        gpioBaseAddr2 = (uint32_t) AddrTranslateP_getLocalAddr(GPIO_LED2_BASE_ADDR);
        pinNum2       = GPIO_LED2_PIN;
    
        /* Set gpio direction */
        GPIO_setDirMode(gpioBaseAddr1, pinNum1, GPIO_LED1_DIR);
        GPIO_setDirMode(gpioBaseAddr2, pinNum2, GPIO_LED2_DIR);
    
        ;
    
        while(1)
        {
            /* Set gpio output high level */
            GPIO_pinWriteHigh(gpioBaseAddr1, pinNum1);
            GPIO_pinWriteHigh(gpioBaseAddr2, pinNum2);
    
            /* Sleep for user specified usecs */
            ClockP_usleep(delayuSec);
    
            DebugP_log("TimerNum = %u\r\n",TimerP_getCount(gTimerBaseAddr[CONFIG_TIMER0]));
    
            /* Set gpio output low level */
            GPIO_pinWriteLow(gpioBaseAddr1, pinNum1);
            GPIO_pinWriteLow(gpioBaseAddr2, pinNum2);
    
            /* Sleep for user specified usecs */
            ClockP_usleep(delayuSec);
        }
    
        /* Close drivers */
        Board_driversClose();
        Drivers_close();
    
        /* Deinit SOC specific modules */
        Board_deinit();
        System_deinit();
    
        return 0;
    }
    
    led_flash_r5fss_nortos.syscfg我只是这里两个文件有修改,我希望TimerP_getCount(gTimerBaseAddr[CONFIG_TIMER0])的结果是从0开始的,到了最大值之后重新为0,并重新计数,但是现在的结果如图片所展示的。 如果还确哪些文件您告诉我,我给您提供,谢谢!

  • 您好,已跟进

  • 您好,

    感谢您的代码。

    我可能会在这里错过一些东西,比如您正在使用的 MCU PLUS SDK 版本等等。

    您能否给我发送整个项目的 zip 文件,这样我就可以将所有必要的文件放在一个地方。

    我已经给您发邮件了,请检查并回复该项目的 zip 文件。

    谢谢!