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.

[参考译文] TMS570LC4357:RTI 最小中断间隔

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1507072/tms570lc4357-rti-minimum-interrupt-interval

器件型号:TMS570LC4357

工具/软件:

你好 gundavarapu  

我使用您的代码进行了测试、发现 RTI 延迟不像预期那样准确。

1. 延迟(1);

2. 示波器测试的实际值

3、 RTI 可以生成的中断之间的最小间隔是多少、它能否达到100ns 来生成中断?

4. 我尝试用比较通知函数来测试这个函数,得到450ns 的信号会产生中断。

5. 另一个问题,为什么我无法触发 RTI 比较0的溢出中断?

6、 我会在下面附上我的项目。

e2e.ti.com/.../TMS_5F00_57_5F00_Rti_5F00_Delay.rar

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

    您好、Sam、

    我的共享代码可能对于1us 之类的小延迟不起作用、

    因为大家可以看到、这些函数涉及许多其他函数调用、这里我也使用了基于中断的延迟。 这些都会影响配置的延迟、因此如果是小延迟、精度肯定会受到影响。

    如 TRM 中所述、中断标志也将在不取决于中断使能状态位的情况下设置、因此、我的建议是直接监测标志而不启用中断、而不是直接轮询标志、这样会在一定程度上降低延迟。

    此外、我建议您保持 GPIO 切换的时间在下方突出显示的行的上方和下方、看看会有多长时间延迟。

    此外、还要记住更改高于"RTI_TIMEOUT"标志、该标志使用中断方法直接轮询中断标志。

    --

    此致、
    Jagadish。

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

    这是我要做的吗?

    /* USER CODE BEGIN (0) */
    #include "HL_rti.h"
    #include "HL_gio.h"
    /* USER CODE END */
    
    /* Include Files */
    
    #include "HL_sys_common.h"
    
    /* USER CODE BEGIN (1) */
    void delayus(uint16 us);
    int io_state = 0;
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    /* USER CODE BEGIN (2) */
    volatile uint8_t RTI_TIMEOUT = 0;
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
        gioInit();
        rtiInit();
        gioSetDirection(gioPORTB, 0xFFFFFFFF);
        _enable_IRQ();
    
        while(1)
        {
            delayus(5);
            io_state == 0 ? (gioPORTB->DSET = (uint32)1U << 1) : (gioPORTB->DCLR = (uint32)1U << 1);
            io_state = !io_state;
    //        gioToggleBit(gioPORTB, 1);
    //        gioPORTB->DCLR = (uint32)1U << 1;
    //        delayus(1);
    //        gioPORTB->DSET = (uint32)1U << 1;
    //        delayus(1);
    //        gioToggleBit(gioPORTB, 7);
        }
    /* USER CODE END */
    
        return 0;
    }
    
    
    /* USER CODE BEGIN (4) */
    void delayus(uint16 us)
    {
    if (us == 0)
    return;
    
    
    else
    {
    //CHANGE THE INTERRUPT COMPARE VALUES (PERIOD OF INTERRUPT)
    //Setup compare 1 value.
    rtiREG1->CMP[1U].COMPx = 10*us; //10 ticks of clock per microsecond, so multiply by 10
    //Setup update compare 1 value.
    rtiREG1->CMP[1U].UDCPx = 10*us;
    
    //ENABLE THE NOTIFICATION FOR THE PERIOD WE SET
    //rtiEnableNotification(rtiREG1, rtiNOTIFICATION_COMPARE1);
    
    //START THE COUNTER
    rtiStartCounter(rtiREG1, rtiCOUNTER_BLOCK0);
    
    //WAIT IN LOOP UNTIL THE INTERRUPT HAPPENS (HAPPENS AFTER THE PERIOD WE SET)
    //WHEN INTERRUPT HAPPENS, RTI_NOTIFICATION GETS SET TO 1 IN THAT INTERRUPT
    //GO TO notification.c -> rtiNotification() to see where RTI_TIMEOUT is set to 1
    //while(RTI_TIMEOUT==0);
    while(!((rtiREG1->INTFLAG >> 1) & 0x1));
    //io_state == 0 ? (gioPORTB->DSET = (uint32)1U << 1) : (gioPORTB->DCLR = (uint32)1U << 1);
    //io_state = !io_state;
    //RESET THE VARIABLE TO 0, FOR THE NEXT TIME WE DO A DELAY
    //RTI_TIMEOUT = 0;
    
    //DISABLE THE INTERRUPT NOTIFICATION
    //rtiDisableNotification(rtiREG1, rtiNOTIFICATION_COMPARE1);
    
    //STOP THE COUNTER
    rtiStopCounter(rtiREG1, rtiCOUNTER_BLOCK0);
    
    //RESET COUNTER FOR THE NEXT TIME WE DO A DELAY
    rtiResetCounter(rtiREG1, rtiCOUNTER_BLOCK0);
    }
    
    }
    
    //void rtiNotification(rtiBASE_t *rtiREG, uint32 notification)
    //{
    //    if(notification == rtiNOTIFICATION_COMPARE1)
    //    {
    //        RTI_TIMEOUT = 1;
    //    }
    //}
    
    /* USER CODE END */

     rtiInit 函数的一部分如下所示:

    调用 delayus (5)的波形如下所示:

    该过程如下所示。

    e2e.ti.com/.../My_5F00_Delay_5F00_using_5F00_RTI_5F00_LC4357.rar

    您能帮助我看看我出了什么问题吗?

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

    你好 Gundavarapu

    如下所示、将时钟频率设置为50MHz。

    CPUCx 设置为1

    在 main 中使用计数器0的溢出中断标志位。

    测量的波形为2.6MHz。

    这应该被视为最小间隔中断、对吧?

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

    您好、Sam、

    对延迟的回复表示歉意、

    这应该被视为最小间隔中断、对吧?

    是的、这应该被视为最小间隔。

    请仅考虑脉冲宽度、而不是整个周期、因为您每次超时后都会切换该位。

    因此、在您的情况下、最小宽度为378/2 = 189ns。

    --
    此致、
    Jagadish。