工具/软件:
你好 gundavarapu
我使用您的代码进行了测试、发现 RTI 延迟不像预期那样准确。
1. 延迟(1);

2. 示波器测试的实际值

3、 RTI 可以生成的中断之间的最小间隔是多少、它能否达到100ns 来生成中断?
4. 我尝试用比较通知函数来测试这个函数,得到450ns 的信号会产生中断。
5. 另一个问题,为什么我无法触发 RTI 比较0的溢出中断?
6、 我会在下面附上我的项目。
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.
工具/软件:
你好 gundavarapu
我使用您的代码进行了测试、发现 RTI 延迟不像预期那样准确。
1. 延迟(1);

2. 示波器测试的实际值

3、 RTI 可以生成的中断之间的最小间隔是多少、它能否达到100ns 来生成中断?
4. 我尝试用比较通知函数来测试这个函数,得到450ns 的信号会产生中断。
5. 另一个问题,为什么我无法触发 RTI 比较0的溢出中断?
6、 我会在下面附上我的项目。
您好、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
您能帮助我看看我出了什么问题吗?
您好、Sam、
对延迟的回复表示歉意、
这应该被视为最小间隔中断、对吧?
是的、这应该被视为最小间隔。
请仅考虑脉冲宽度、而不是整个周期、因为您每次超时后都会切换该位。
因此、在您的情况下、最小宽度为378/2 = 189ns。
--
此致、
Jagadish。