主题中讨论的其他器件: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
