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.
工具与软件:
您好!
我将在F28379D
微控制器中使用嵌套中断。 启用嵌套中断后、优先级顺序设置如下:
所有中断具有设定的优先级。 不过、当 ePWM12设置为156 µs 时、在每个周期中会观察到±2 µs 偏移。 但在仅使用 ePWM12时、它会保持稳定的156 µs。 以下是用于中断和 ePWM12初始化的代码:
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//要写入 EALLOW 保护的寄存器、需要执行此操作
PieVectTable.EPWM12_INT =&epwm12_ISR;//控制 ISR
PieVectTable.EPWM1_INT =&epwm1_ISR;// ePWM 1 ISR
PieVectTable.EPWM11_INT =&epwm11_FastISR;// DAC
PieVectTable.XINT1_INT =&XINT1_ISR;// XINT 1.
PieVectTable.XINT2_INT =&XINT2_ISR;// XINT 2.
PieVectTable.ADCD1_INT =&adcd1_ISR;// ADC D1 ISR
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;//计时器0
PieVectTable_Timer1_INT =&CPU_Timer1_ISR;// I2T 协议
PieVectTable.TIMER2_INT =&CPU_timer2_ISR;//计时器2
PieVectTable.SCIA_RX_INT =&sciaRxFifoIsr;// SCI - A RX ISR
PieVectTable.SCIB_RX_INT =&scibRxFifoIsr;// SCI - B RX ISR
PieVectTable.CANB0_INT =&canbISR;// CAN - B RX ISR
EDIS;//这是禁用对 EALLOW 保护寄存器的写入所必需的
//启用 PIE 中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;// Enable PIE (启用 PieCtrlRegs.PIECTRL.bit.ENPIE)
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;// Enable XINT 1 interrupt (启用 XINT 1中断)
PieCtrlRegs.PIEIER1.bit.INTx5 = 1;// Enable XINT 2 interrupt (启用 XINT 2中断)
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;// Enable ADC interrupt (启用 ADC 中断)
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;// Enable Timer0 interrupt (启用 Timer0中断)
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;// Enable ePWM1 interrupt (启用 ePWM1中断)
PieCtrlRegs.PIEIER3.bit.INTx11 = 1;// Enable ePWM11 interrupt (启用 ePWM11中断)
PieCtrlRegs.PIEIER3.bit.INTx12 = 1;// Enable ePWM12 interrupt (启用 ePWM12中断)
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;// Enable SCI-A interrupt (启用 SCI-A 中断)
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;// Enable SCI-B interrupt (启用 SCI-B 中断)
PieCtrlRegs.PIEIER9.bit.INTx7 = 1;// Enable CAN-B interrupt (启用 CAN-B 中断)
IER |= M_INT3;//启用组3中断
IER |= M_INT1;//启用组1中断
IER |= M_INT9;//启用组9中断
IER |= M_INT13;//启用计时器1中断
IER |= M_INT14;//启用计时器2中断
PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;
PieCtrlRegs.PIEIFR3.all = ISRs_group2;
PieCtrlRegs.PIEIFR9.all = ISRs_Group3;
EINT;//启用全局中断 INTM
ERTM;
ePWM12初始化
//
//设置 TBCLK
//
EPwm12Regs.TBPRD = 7812;// 78.125us 执行时间12.8KHz
EPwm12Regs.TBPHS.bit.TBPHS = 0x0000;// Phase 为0
EPwm12Regs.TBCTR = 0x0000;//清除计数器
//
//设置比较值
//
EPwm12Regs.CMPA.bit.CMPA = 2000;//设置比较一个值
EPwm12Regs.CMPB.bit.CMPB = 2000;// Set Compare B value (设置比较 B 值)
//
//设置计数器模式
//
EPwm12Regs.TBCTL.bit.CTRMODE = tb_count_updown;//向上计数和向下计数
EPwm12Regs.TBCTL.bit.PHSEN = TB_DISABLE;// Disable phase loading (禁用相位加载)
EPwm12Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm12Regs.TBCTL.bit.CLKDIV = TB_DIV1;//时钟除以1
//
//设置隐藏
//
EPwm12Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;// SHADOW A mode
EPwm12Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// SHADOW B mode
EPwm12Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在零加载 A
EPwm12Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//加载 B mode zero
//
//设置操作
//
EPwm12Regs.AQCTLA.bit.CAU = AQ_clear;//针对事件 A 设置 PWM1A、以向上计数设置
EPwm12Regs.AQCTLA.bit.CAD = AQ_SET;//在事件 A 上清除 PWM1A、在向下计数时清除
EPwm12Regs.AQCTLB.bit.CBU = AQ_Clear;//对事件 B 设置 PWM1B、在向上计数时设置
EPwm12Regs.AQCTLB.bit.CBD = AQ_SET;//针对事件 B 清除 PWM1B、在向下计数时清除
// Interrupt (中断)、其中我们将更改 Compare (比较)值
EPwm12Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在发生归零事件时选择 INT
EPwm12Regs.ETSEL.bit.INTEN = 1;// Enable INT (启用 INT)
EPwm12Regs.ETPS.bit.INTPRD = ET_1ST;//在发生第1个事件时生成 INT
CPU 时钟为200MHz
此致、
Aditya
尊敬的 Aditya:
我们是不是在使用 ePWM12、ADCD1、计时器0、SCIA、SCIB、 CANB 中断组合在一起? 根据 ePIE 表(无嵌套)、这些中断的硬件配置优先级为:
ADCD1 (最高优先级)
2. TIMER0
3. EPWM12
4. SCIA_RX
5. SCIB_RX
6. CANB_0 (最低优先级)
您正在根据以下方案更改优先级、对吗?
1. EPWM12 (最高优先级)
2. ADCD1.
3. TIMER0
4. SCIA_RX
5. SCIB_RX
6. CANB_0 (最低优先级)
如果是这样、根据进入 中断的时序、如果 EPWM12中断与 ADCD1或 TIMER0中断同时进入、CPU 将首先向具有更高硬件优先级的中断分支、然后实际进入 EPWM12中断的 ISR 。 例如、假设当 CPU 刚刚完成前一个 ISR 时、TIMER0和 EPWM12中断都处于挂起状态。 CPU 将:
所有这些 ISR 分支都需要时钟周期用于矢量获取、上下文保存/恢复和屏蔽指令。 这可能就是您看到这一转变的原因。 如果 ADCD1中断同时挂起、还需要更多分支。 减少发生嵌套量的一种方法是改为使用 Timer1或 TIMER2中断、前提是您对具有最低优先级的定时器中断没问题。 这样一来、EPWM12就不需要嵌套在其中。
请对对您有帮助的任何回答投赞成票
此致、
Delaney