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.

[参考译文] TMS320F280049:使用 ADC/SCI RX/ Timer1 ISR 时嵌套中断不起作用

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/904097/tms320f280049-nesting-interrupts-are-not-working-using-adc-sci-rx-timer1-isr

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

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

    您好!

    我正在研究这个问题。 此外、请参阅"C2000Ware_3_01_00_00\driverlib\f28004x\examples\interrupt"下最新 C2000Ware 软件包中的"interrupt_ex2_sw_Prioritization "示例、以正确配置 ISR 以启用中断嵌套。

    谢谢

    Vasudha

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

    Vasudha、您好!

    感谢您的快速回复。

    我已经检查了"interrupt_Ex2_SW_Prioritization "示例并使嵌套中断代码。

    但中断条件仍然有问题。

    请帮助解决该问题

    谢谢

    卡斯珀

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

    Vasudha、您好!

    我发现这种情况可以避免该问题的发生。

    在该设置中、ADC 的 SOC 将由 PWM 触发。

    如果我将 ADC 的触发源从 PWM 更改为软件、问题就会消失。

    如果您需要任何高级信息、请告诉我。

    谢谢

    卡斯珀