工具/软件:
你好 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。