工具与软件:
您好!
我将在F28379D微控制器中使用嵌套中断。 启用嵌套中断后、优先级顺序设置如下:
- 最高优先级: ePWM12 (Pievector 组3)
- 下一优先级: Pievector 组1代表 ADC 和计时器0
- 最低优先级: Pievector 组9适用于 SCI-A、SCI-B 和 CAN-B
所有中断具有设定的优先级。 不过、当 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