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.

C6748基于starterware的64位定时器问题请教

C6748基于starterware的64位定时器。仿照starterware中的例程timer。试了低32位有效,高32为无效,请问对应的寄存器该怎么配置

  • 检查一下模式配置寄存器

    Select 64-bit mode (TIMMODE in TGCR).

  • 你好,按照这个配置了,没有用。TI  starterware 例程  timer 也是没有用

  • 这不是配置成的64bit吗?怎么个没用啊?

    timerCounter.c:

    int main(void)
    {
    /* Set up the UART2 peripheral */
    UARTStdioInit();

    /* Set up the Timer2 peripheral */
    TimerSetUp64Bit();

    /* Set up the AINTC to generate Timer2 interrupts */
    TimerIntrSetUp();

    /* Enable the timer interrupt */
    TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    #ifndef _TMS320C6X
    /* Switch to non privileged mode; This is done for demonstration purpose */
    CPUSwitchToUserMode();
    #endif

    /* Send the first String */
    UARTPuts("\r\nTencounter: 0", -1);

    /* Start the timer. Characters from cntArr will be sent from the ISR */
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);

    ** Setup the timer for 64 bit mode

    */
    static void TimerSetUp64Bit(void)
    {
    /* Configuration of Timer */
    TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
    *(unsigned int *)(SOC_TMR_2_REGS + 0x4) |=1; //add to enable JTAG debug.

    /* Set the 64 bit timer period */
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
    }

  • 您好,我拿示波器操作GPIO口试过了。超过18秒   也就是 4*1024*1024*1024/228000000 = 18    超过18秒,高位就被丢弃了。不知道为什么。我的GPIO操作肯定是没有问题的。

  • 不太明白你的意思。你是怎么配置的?怎么判断丢弃了?

  • // 64位 定时器 / 计数器周期
    // 定时时间 1 秒
    // 低32位
    #define TMR_PERIOD_LSB32 (0x0D970100)
    // 高32位 0
    #define TMR_PERIOD_MSB32 (0x3)

    /****************************************************************************/
    /* */
    /* 定时器 / 计数器初始化 */
    /* */
    /****************************************************************************/
    void TimerInit(void)
    {
    // 配置 定时器 / 计数器 2 为 64 位模式
    TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);

    // 设置周期
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);

    // 使能 定时器 / 计数器 2
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER_BOTH, TMR_ENABLE_CONT);
    }

    /****************************************************************************/
    /* */
    /* 定时器 / 计数器中断初始化 */
    /* */
    /****************************************************************************/
    void TimerInterruptInit(void)
    {
    // 注册中断服务函数
    IntRegister(C674X_MASK_INT4, TimerIsr);

    // 映射中断到 DSP 可屏蔽中断
    IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);

    // 使能 DSP 可屏蔽中断
    IntEnable(C674X_MASK_INT4);

    // 使能 定时器 / 计数器 中断
    TimerIntEnable(SOC_TMR_2_REGS, 0x00020000);
    }

    /****************************************************************************/
    /* */
    /* 中断服务函数 */
    /* */
    /****************************************************************************/
    void TimerIsr(void)
    {
    // 禁用定时器 / 计数器中断
    TimerIntDisable(SOC_TMR_2_REGS, 0x00020000);

    // 清除中断标志
    IntEventClear(SYS_INT_T64P2_TINTALL);
    TimerIntStatusClear(SOC_TMR_2_REGS, 0x00020000);

    // 改变 LED 状态
    GPIOPinWrite(SOC_GPIO_0_REGS, 109, Flag);
    Flag=!Flag;
    GPIOPinWrite(SOC_GPIO_0_REGS, 110, Flag);

    // 使能 定时器 / 计数器 中断
    TimerIntEnable(SOC_TMR_2_REGS, 0x00020000);
    }以上是我设置的64位定时器,我想设置的是每57s触发一次中断,但是现在出现的现象是每18s触发一次中断,高位没有被舍弃,但是每当低位计数到0xffffffff时会触发一次中断,这个是什么原因呢?

  • 我看原代码是

    /* Start the timer. Characters from cntArr will be sent from the ISR */
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);

    你为什么要改成:

    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER_BOTH, TMR_ENABLE_CONT);

  • 您好,我改成了TMR_TIMER12也是没有用的。您可以试一试看一下~~谢谢

  • C6748 中TimerIntEnable等相关函数的原型怎么找不到

  • 我感觉你根本没去找就来问了:

    C:\ti\OMAPL138_StarterWare_1_10_03_03\drivers\timer.c

    void TimerIntEnable(unsigned int baseAddr, unsigned int intFlags)
    {
    /* Enable the mentioned interrupts. One or more interrupts are enabled */
    HWREG(baseAddr + TMR_INTCTLSTAT) |= intFlags;
    }

  • 在创龙的demo里没有找到这个文件,官网下载才找到的,另外再请教您一个问题。对于多个中断的程序。有没有历程?

  • 在创龙的demo里没有找到这个文件,官网下载才找到的,另外再请教您一个问题。对于多个中断的程序。有没有例程?

  • 中断程序之间没有任何关系,如果你能实现一个,那就可以实现你想要的个数。

  • 我想表达的是多个不同的中断怎么处理,比如定时器和串口,可以嵌套吗?初始化怎么处理,开关中断会不会有影响

  • yang gao8 说:
    比如定时器和串口,可以嵌套吗?

    硬件本身不支持嵌套,嵌套是软件实现的,而且实现比较麻烦。你需要嵌套吗?

    yang gao8 说:
    初始化怎么处理,开关中断会不会有影响

    开关中断是在进入和退出中断ISR时自动进行的,不需要你处理。千万不要随意在ISR里操作开关中断。

  • 我的程序是通过规划时间运行的,所以定时精度要求比较高,不能让其他程序打断,但是我又要求和其他芯片通过uart通信,我想也用中断,uart的优先级低,会被定时器打断。

  • 你的意思是想要UART中断可以被timer中断打断,也就是实现在UART中断嵌套timer中断吗?

    如果你实在想要实现这个功能,你就参考文档sprufe8b的 5.6.2 Nested Interrupts

    目前我不知道有谁真正实现过,都是问问就不了了之了。

    我也一直想自己实现一下,但一直没时间~~~

  • 那这么说,c6000的如果要实现不同的中断,只能设置相同的优先级了?或者用实时系统?

  • yang gao8 说:
    那这么说,c6000的如果要实现不同的中断,只能设置相同的优先级了

    这个结论是怎么推断出来的?

    yang gao8 说:
    或者用实时系统?

    用什么系统与中断又是什么关系?

  • 如果低优先级的服务函数正在进行那么,高优先级的中断产生了,是不是等低优先级的处理完,才能进入高优先级的? 不会抢断?   如果抢断,是不是要自己保护现场?  一般中断处理函数都尽量要很短?

  • yang gao8 说:
    如果低优先级的服务函数正在进行那么,高优先级的中断产生了,是不是等低优先级的处理完,才能进入高优先级的? 不会抢断?

    是的,不会抢断。

    yang gao8 说:
    如果抢断,是不是要自己保护现场?  一般中断处理函数都尽量要很短?

    关键是保护返回地址。中断处理是否要短跟中断频率有关, 如果中断间隔很长,那ISR长又能有什么关系呢?

  • 你好,请问当时高位丢失的问题解决了吗? 我最近也遇到了这个问题,例程中的定时器高位设置不起作用。

  • 请问您的问题解决了吗? 我也遇到了这个问题,可以交流一下吗? Q791981374
  • 你解决了吗?交流一下啊,我也遇到了
  • C:\ti\OMAPL138_StarterWare_1_10_03_03\drivers\timer.c

    void TimerIntEnable(unsigned int baseAddr, unsigned int intFlags)
    {
    /* Enable the mentioned interrupts. One or more interrupts are enabled */
    HWREG(baseAddr + TMR_INTCTLSTAT) |= intFlags;
    }
  • 没明白发这个是什么意思

  • timer 64高位问题请参考贴子:

    把对TGCR的配置改成下面就没有问题了。

    static void TimerSetUp64Bit(void)
    {
    /* Configuration of Timer */
    // TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
    TimerConfigure(SOC_TMR_2_REGS, 3);

    /* Set the 64 bit timer period */
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
    }

    也就是new timer plus feature好像有点问题,那就先disable new timer feature吧。