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.

[参考译文] TMS570LC4357:冲突问题 b/w 偶数和奇数 HET PWM 捕获引脚

Guru**** 2864540 points

Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1631817/tms570lc4357-conflict-issue-b-w-even-and-odd-het-pwm-capturing-pins

器件型号: TMS570LC4357
主题中讨论的其他器件: HALCOGEN

HII 团队/Jagadish,

我想要的配置详细信息、使其适用于捕获两个 het 对的 PWM、het1 和 het2 中提供了这些信息。  

我面临的问题。
1) 启用 HR 共享时、Im 无法从 N+1 引脚捕获 PWM
2) 如果禁用了 HR 共享、Im 无法从任何引脚捕获 PWM
3) 如果 N 引脚分配给其他用途、则 Im 无法从 N+1 引脚捕获 PWM、o/p 引脚或 PWM o/p 引脚。 如何解决此问题?
3) Im 无法使用捕获配置从 N 引脚捕获 PWM、从 N+1 引脚进行基于边沿的中断+RTI 配置、同时 o/p 相互参照。

请尽快提供上述问题的解决方案。 谢谢你。

此致、
Sandeep Kalakota

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

    尊敬的 Sandeep:

    对延迟的回复表示歉意。

    HALCoGen、捕获代码的设计方式是、占空比捕获在第 N 个引脚上、然后相应的周期捕获在第 N+1 引脚上。 请参阅以下图片一次。

    因此、如果您要捕获单个信号占空比和周期、则需要执行以下任何操作:

    1.您可以禁用 HR 共享,并可以在两个引脚之间外部输入相同的信号。 也就是 N 和 N+1 引脚上的电压。

    2.您可以启用 HR 共享,并且只能在 N 处馈送,所以同样将被馈送至 N+1 结构,这将有助于计算信号的占空比和周期。

    因此、基本上需要两个引脚来捕获。 如果要仅使用一个引脚 (N) 捕获占空比和周期、并且要将其他引脚 (N+1) 用于其他用途(捕获其他信号)、则需要手动修改 HALCoGen 生成的代码。

    如下所示:

    如果我这样做、那么我可以使用 3 和 5 进行其他捕获、因为在这里捕获占空比和周期都是在同一个引脚(即 N)上进行的

    请记住、如果您在 HALCoGen 生成的代码中执行上述任何手动更改、那么如果您重新生成代码、它将覆盖您的更改。

    --
    此致、
    Jagadish。

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

    HII Jagadish,  
    我进行了上述更改并看到了结果、但仍然看到了两个引脚上的冲突和结果反射。
    我想做的是、N 引脚 im 尝试使用 htcapture 捕获 PWM、N+1 尝试使用边沿中断捕获 PWM。 在 HR 共享启用和 HR 共享禁用的情况下、这不能按预期工作。

    给我正确的解决方案来捕获 PWM individualally 为 HET 捕获对引脚,没有任何冲突,它应该能够单独捕获

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

    尊敬的 Sandeep:

    尝试以下来自我们内部 AI 工具的建议、如果这对您没有帮助、我将尝试在我这边重新创建示例

    #在 HET 引脚对上独立捕获 PWM 的解决方案 (TMS570LC4357)

    ##问题分析
    当尝试使用不同的方法同时在相邻的 HET 引脚 (N 和 N+1) 上独立捕获 PWM 时、您会遇到冲突。 这是由于 HET 架构在引脚对之间共享资源。

    ##根本原因
    -** HET 引脚已配对**(0-1、2-3、4-5 等)
    -** HR(高分辨率)共享逻辑会影响两种捕获方法**
    -**指令 RAM 冲突**当两个引脚尝试同时捕获时
    -*配对引脚之间的时基共享**

    ##**正确的解决方案:使用非相邻引脚**

    ### White check mark 推荐的方法

    ```c
    /*使用非相邻的 HET 引脚进行独立捕获*/

    //引脚配置 — 使用未配对的引脚
    #define HET_CAPTURE_PIN_A 0 //对于 hetCapture
    #define HET_CAPTURE_PIN_B 2 //针对边沿中断(非引脚 1)
    //或
    #define HET_CAPTURE_PIN_A 4 //对于 hetCapture
    #define HET_CAPTURE_PIN_B 6 //用于边沿中断(不是引脚 5)

    /*初始化 HET */
    void PWM_void (Capture_Init)

    hetInit();

    /*为 htCapture 配置引脚 A(例如,引脚 0)*/
    //在 HET RAM 中设置捕获指令
    htREG1->PINS =(1 << HET_CAPTURE_PIN_A);

    /*为边沿中断(例如引脚 2)配置引脚 B */
    gioInit();
    gioEnableNotification (hetREG1、(1 << HET_CAPTURE_PIN_B));

    //禁用两个引脚的 HR 共享
    hetREG1->HRSHARE = 0x00000000;
    }
    ```μ s

    ——

    ##**替代解决方案:如果必须使用相邻引脚**

    相邻引脚 (N 和 N+1) 的配置

    ```c
    /*相邻引脚的特殊配置*/

    void Adjacent_Pin_Capture_Init (void)

    hetInit();

    /*方法 1:仅将两者与 htCapture API 一起使用*/
    //配置引脚 N 的捕获
    hetCAPTURE_Config_t capConfig_N ={
    .pin = 0、//引脚 N
    .CAPTURE_MODE = hetCAPTURE_RISING_EDGE、
    .capture_type = hetCAPTURE_PERIOD_MODE
    };

    //配置引脚 N+1 的捕获
    hetCAPTURE_Config_t capConfig_N1 ={
    .pin = 1、//引脚 N+1
    .CAPTURE_MODE = hetCAPTURE_RISING_EDGE、
    .capture_type = hetCAPTURE_PERIOD_MODE
    };

    /*严重:正确配置 HR 共享*/
    //选项 1:完全禁用 HR 共享
    hetREG1->HRSHARE = 0x00000000;

    /*在 HET RAM 中使用单独的指令槽*/
    //确保说明至少相隔 4 个插槽
    //在 HET 程序中配置(HET 组装)
    }
    ```μ s

    ——

    ##**最佳实践实施**

    ###完整的工作示例

    ```c
    #include “het.h"</s>“
    #include “Gio.h"</s>“
    #include “sys_common.h"</s>“

    /*引脚定义 — 非相邻引脚*/
    #define PWM_HETCAP_PIN 0 // HET[0]用于 hetCapture
    #define PWM_EDGE_INT_PIN 2 // HET[2]、用于边沿中断

    /*捕获变量*/
    易失性 uint32_t hetcap_period = 0;
    易失性 uint32_t hetcap_DUTY = 0;
    易失性 uint32_t EDGE_TIMESTAMP[2]={0};
    易失性 uint8_t edge_index = 0;

    /* HET 捕获初始化*/
    void HET_void (Capture_Init)

    hetInit();

    /*使用 HET 指令配置 HET[0]以进行捕获*/
    //这应该在 HET 程序中完成

    /*禁用 HR 共享以防止冲突*/
    hetREG1->HRSHARE = 0x00000000;

    /*将引脚方向设置为输入*/
    htREG1->DIR &=~(1 << PWM_HETCAP_PIN);

    /*启用 HET */
    htREG1->GCR = 0x01000001;
    }

    /*边沿中断初始化*/
    void Edge_Interrupt_Init (void)

    gioInit();

    /*将 HET[2]配置为边沿中断的 GIO */
    hetREG1->DIR &=~(1 << PWM_EDGE_INT_PIN);//输入

    /*在两个边沿上启用中断*/
    gioEnableNotification (hetPORT1、(1 << PWM_EDGE_INT_PIN);
    gioNotification (hetPORT1、(1 << PWM_EDGE_INT_PIN);

    /*为两个边线配置*/
    htREG1->INTPOL &=~(1 << PWM_EDGE_INT_PIN);//两个边沿
    }

    /* HET 捕获 ISR 或轮询*/
    void GET_HET_void (Capture_Data)

    //从 HET RAM 读取捕获数据
    //实施取决于您的 HET 计划
    hetCAP_PERIOD = hetRAM1->Instruction[CAP_INST_NUM].Data;
    }

    /*边沿中断 ISR */
    void gioNotification(gioPORT_t *端口、Uint32 位)

    if (port == htPORT1 &&(位&(1 << PWM_EDGE_INT_PIN))

    /*读取当前时间*/
    EDGE_TIMESTAMP[EDGE_INDEX]= hetREG1->CNT;
    EDGE_INDEX =(EDGE_INDEX + 1)% 2;

    /*如果需要、计算期间*/
    if (EDGE_INDEX = 0)

    uint32_t period = EDGE_TIMESTAMP[1]- EDGE_TIMESTAMP[0];
    //处理期间
    }
    }
    }

    /*主函数*/
    void main (void)

    _enable_irq();

    Capture_Init ();
    Edge_Interrupt_Init ();

    while (1)

    get_get_get_het_ Capture_Data ();

    //独立处理两个捕获
    // HetCAP_PERIOD 和 EDGE_TIMESTAMP 是独立的
    }
    }
    ```μ s

    ——

    ##** HET 程序配置(HET 组装)**

    ```组件
    ;PIN 0 捕获的 HET 程序
    ;确保指令间距正确

    CAP_0:电容

    NEXT_PROGRAM_ADDRESS = NEXT_INST;
    引脚= 0;
    CAPTURE_Condition =上升;
    CAPTURE_mode =周期;
    INTERRUPT_ENABLE =开启;
    }

    ;保留插针对指令之间的间隙
    nop{next_program_address = NOP2;}
    NOP2 { next_program_address = NOP3;}
    NOP3 { next_program_address = next_section;}

    NEXT_SECTION:
    ;继续执行其它说明
    ```μ s

    ——

    ##**关键配置核对表**

    ```c
    /*将这些设置应用于无冲突操作*/

    void Apply_Critical_Settings (void)

    /* 1. 禁用 HR 共享*/
    hetREG1->HRSHARE = 0x00000000;

    /* 2. 将引脚配置为输入*/
    htREG1->DIR &=~((1 << PWM_HETCAP_PIN)|(1 << PWM_EDGE_INT_PIN));

    /* 3. 如果不需要、则禁用拉取控制*/
    htREG1->PULDIS |=((1 << PWM_HETCAP_PIN)|(1 << PWM_EDGE_INT_PIN));

    /* 4. 设置正确的引脚多路复用*/
    htREG1->Fun &=~(1 << PWM_EDGE_INT_PIN);// EDGE INT 引脚的 GIO 模式
    htREG1->Fun |=(1 << PWM_HETCAP_PIN);// HET 模式用于捕捉引脚

    /* 5. 清除任何挂起的中断*/
    htREG1->FLG = 0xFFFFFFFF;
    gioREG->FLG = 0xFF;
    }
    ```μ s

    ——

    ##**摘要**

    ### White check mark **推荐的解决方案:**
    1.**使用非相邻 HET 引脚**(0 和 2、4 和 6 等)
    2.**完全禁用 HRSHARE**
    3.**正确配置引脚功能**(HET 与 GIO)
    4.**如果可能、使用单独的时基**

    ### Warning️**如果需要相邻引脚:**
    1.使用**两个插针、仅使用 hetCapture **(非混合方法)
    2.确保**HET 指令间距**(4 个以上插槽分开)
    3.**禁用 HR 共享**
    4.考虑**硬件限制**-可能无法正常工作

    **冲突发生的原因是配对的引脚共享硬件资源。 使用非相邻引脚可以完全消除这一问题。**

    --
    此致、
    Jagadish。