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.

[参考译文] UCD3138:故障中断例程

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/604023/ucd3138-fault-interrupt-routine

器件型号:UCD3138

您好!

在 UCD3138数字电源控制器上设置中断时遇到困难。 我正在尝试设置 一个故障引脚(故障2引脚)来触发快速中断。 但是、我无法在 FIQ 中断例程中设置故障以触发。

我的目标是设置故障2引脚以生成栅极驱动器中断例程、并立即关闭 PWM。  

有人能帮我解决这个问题吗?

这是我的代码初始化(我还设置了 PWM 2中断)

GioRegs.FAULTIN.bit.FLT2_IN = 0;//为栅极驱动器故障输入设置 Faul2引脚
杂项 AnalogRegs.GLBIOVAL.bit.fault2_IO_value = 2;

FaultMuxRegs.EXTFAULTCLL.bit.fault2_POL=1;//在下降沿检测到故障2
FaultMuxRegs.EXTFAULTCLL.bit.fault2_INT_EN = 1;
FaultMuxRegs.EXTFAULTCLL.bit.fault2_DET_EN = 1;//FAULT[2]引脚检测使能

disable_interrupt ();
disable_fast_interrupt ();//确保禁用快速中断
WRITE_REQMASK (CIMINT_All_DPWM2 | CIMINT_All_PWM2_COMP | CIMINT_All_FAULT_PIN);//启用 pwm2cmp 和 DPWM0中断(第16个周期结束)(int-priority29)
WRITE_FIRQpr (CIMINT_All_DPWM2 | CIMINT_All_FAULT_PIN);// DPWM0中断(第16个周期结束)映射到 FIQ
enable_fast_interrupt ();
enable_interrupt ();

void fast_interrupt (void)

寄存器 Int32 Fiq_number、interrupt_bits;
Fiq_number = CimRegs.FIQIVEC.ALL;//读取时清除
INTERRUPT_BITS = FaultMuxRegs.FAULTMUXINTSTAT.ALL;//读取时清除

/*
易失性 uint32 read_s废 品;

*

GateDriveFault = 1;


IF (FIQ 数字= 30)//故障引脚中断

if (interrupt_bits & 0x400)// if fault2

杂项 AnalogRegs.GLBION.ALL |= 0xFF;
GateDriveFault = 1;z

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果要使用 FAULT 引脚停止 DPWM、则需要使用故障多路复用器将 FAULT 引脚链接到 DPWM。 这将为您提供基本的瞬时关闭、而不涉及固件延迟。 您可能只需要在标准中断中轮询、因为它将为您关闭。 如果使用硬件关闭、我们建议您使用 DPWM 故障位进行中断和/或轮询。 很好的一段时间后、我们看到 DPWM 关闭、相应的故障多路复用器中断位没有锁存。 它们是有些不同的逻辑链、因此必须只需正确的时间、一个逻辑链便可捕捉到它、另一个逻辑链便可错过它。

    要查看您的代码:

    GioRegs.FAULTIN.bit.FLT2_IN 是一个只读位、显示了引脚上的值
    2。MiscAnalogRegs.GLBIOVAL.BIT.BIFAULT2_IO_VALUE 是一个寄存器、仅当您将故障2引脚作为 GLBIO 引脚启用并将其作为输出时才可控制其值。 不要这样做、因为无论你试图从外面驱动 fault2、你都将遇到一场战争。
    3.就 GIO 和 GLBIO 寄存器而言、默认值是正确的。 请将其单独保留。
    4.FaultMuxRegs.EXTFAULTCLL.bit.FAULT2_POL -将它设置为1实际上意味着上升边沿、而不是下降边沿。 这是默认值
    5.接下来的两行都很好。 设置 int_en 和 det_en
    6、之后看起来不错、直到你到达快速中断
    7、FIQIVEC 实际上会将中断编号加1、因此您需要31、而不是30。 0表示没有激活的中断
    8.我们的文档有误,CIM 寄存器(包括 FIQIVEC)在读取时不清楚。 但是、当您读取 FAULTMUXINTSTAT 时、您应该同时清除这两个位。
    9、所以我希望如果你把30更改为31、它应该按照你希望的方式工作。
    但为了避免罕见的间歇性故障、其中 DPWM 会关闭、但不会发生中断(并实现快速关断)、我建议使用故障多路复用器直接关闭 DPWM、并使用 DPWM 中断进行响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢、我终于让它工作了...通过检查 GioRegs.FAULTINTPEND.bit.FLT2_INT_PEND 标志。
    我还将 GPIO 设置为生成故障...因此对于任何其他遇到困难的人、这里是我的设置。

    //设置故障2引脚以生成故障
    GioRegs.FAULTINTENA.bit.FLT2_INT_EN = 1;
    GioRegs.FAULTDIR.bit.FLT2_DIR = 0;
    GioRegs.FAULTIN.bit.FLT2_IN = 0;//1 -故障引脚必须驱动为高电平。 0 -驱动为低电平以触发中断
    GioRegs.FAULTINTPOL.bit.FLT2_INT_POL = 0;//将在1 =上升沿、0 =下降沿上生成中断

    disable_interrupt ();
    disable_fast_interrupt ();//确保禁用快速中断
    //write_reqmask (CIMINT_All_DPWM2 | CIMINT_All_PWM2_COMP);//启用 pwm2cmp 和 DPWM0中断(第16个周期结束)(int-priority29)
    //write_firqpr (CIMINT_All_DPWM2);// DPWM0中断(第16个周期结束)映射到 FIQ
    WRITE_REQMASK (CIMINT_All_DPWM2 | CIMINT_All_PWM2_COMP | CIMINT_All_FAULT_PIN);//启用 pwm2cmp 和 DPWM0中断(第16个周期结束)(int-priority29)
    WRITE_FIRQpr (CIMINT_All_DPWM2 | CIMINT_All_FAULT_PIN);// DPWM0中断(第16个周期结束)映射到 FIQ
    enable_fast_interrupt ();
    enable_interrupt ();