主题中讨论的其他器件:C2000WARE
尊敬的 TI 专家:
我尝试使用三个 ISR 在我们的项目中执行。
ADCAISR 将每100us 执行一次。
Timer1将向外部器件传输数据、并每500us 执行一次。
SCIARXISR 将从外部器件接收数据。
我参考示例代码和 TI wiki (https://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x)来构建软件优先级。
当中断启动时、三个中断正常工作、但5秒后 SCIRXISR 将不会被触发
我们的设置是否有问题?
下图是 SCIRXISR 中的异常情况。
CH1:ADCAISR-100us
CH2:SCIARXISR
CH3:Timer1ISR-500us
CH4:SCIA RX 信号
相关代码如下:
#define INT1PL 1 //组1中断的全局优先 级#define INT2PL 0 //组2中断的全局优先 级#define INT3PL 0 //组3中断的全局优先 级#define INT4PL 0 //组4中断的全局优先 级#define INT5PL 0 //组5中断的全局优先 级#define INT6PL 0 //全局优先级 组6中断的优先级 #define INT7PL 0 //组7中断的全局优先 级#define INT8PL 0 //组8中断的全局优先 级#define INT9PL 2 //组9中断的全局优先 级#define INT10PL 0 //组10中断的全局优先 级#define INT11PL 0 //组11中断的全局优先 级#define INT12PL 0 //组12中断的全局优先 级#define INT13PL 3 // INT13的全局优先级(TINT1) #define INT14PL 0 // INT14的全局优先级(TINT2) #define INT15PL 0 //数据记录的全局优先 级#define INT16PL 0 // RTOSINT _中断写入 A1void (eGPIO); // 堆栈上保存 IER 寄存器 // volatile uint16_t tempPIEIER = HWREGH (PIECTRL_base + PIE_O_IER1); // 设置全局和组优先级以允许 CPU 中断 //具有更高优先级 // IER |= M_INT1; IER &= MINT1;//设置全局和组优先级以允许 CPU 中断// clearR1&PI_ACTRL ;// 清除中断1 (HW1) _asm (" NOP"); EINT; // //在此插入 ISR 代码 // if (true = ADC_getInterruptOverflowStatus (ADCA_BASE、ADC_INT_NUMBER1)) { ADC_clearInterruptOverberStatus (ADCA_BASE、ADC_INT_NUMBER1); }ADC_clearInterflowStatus (ADC_INT_BASE);ADCA_INT_NUMBER1;ADCA_INT_INT_NUMBER1 // //禁用中断并恢复寄存器已保存: // DINT; HWREGH (PIECTRL_BASE + PIE_O_IER1)= tempPIEIER; GPIO_writePin (6、0); } __interrupt void cpuTimer1ISR (void) { GPIO_writePin (12、1); // 将 GPIO/ INTR+设置为全局优先级 ; //将 Timere+代码设置为允许 Timere+计数;//将 TimereDP0+/ INTRI +计数设置为允许全局优先级;// // //禁用中断 // DINT; GPIO_writePin (12、0); } __interrupt void sciaRxISR (void) { GPIO_writePin (8、1); // 将 IER 寄存器保存在栈 上// volatile uint16_t INTIEIER = HWREGH (PIECTRL_base + PIE_O_R9) ;//设置为更高优先级的中断//全局优先级/9;//将 temp_INTIE9设置为更高的中断// IER &= MINT9; HWREGH (PIECTRL_BASE + PIE_O_IER9)&= MG9_1; // 启用中断 // Interrupt_clearACKGroup (0xFFFFFFU); __asm (" NOP"); EINT; // //在此处插入代码 // //启用中断// Interrupt_SCI_BASE (0xFFFFFF_PI_RESET_PIR);// RESET_RESET_RIC_RESET_REUST_REUST_REUSCI_RINT ( 8、PI_REUSCI_RESTRL);// RESET_RESET_IN_REUST_REUST_REUST_PRISI (0)寄存器+ PI_RESET_IN_RESET_IN_RESET_INTRI);// RESET_RESET_RESET_RESET_INTRI (8、PI_IN_RESTRL