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.

[参考译文] AM13E23019:序列发生器禁用行为

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1636760/am13e23019-sequencer-disabling-behaviour

部件号: AM13E23019

AM13e2x TRM(修订版 A)有关复位 SEQENABLE 标志行为的信息非常有限。

我们想了解在转换过程中复位 SEQENABLE 标志时序列发生器的行为:

  • 正在进行的序列是否完成/暂停/中止?
  • 如果序列未立即中止、DMA 触发会发生什么情况?
  • 它如何影响相邻序列发生器?

背景:在我们的用例中、我们希望在任何时候调用“停止“例程、之后、即使发生了硬件触发、也不要接收到来自此序列的任何新测量值。 之后、可以调用“启动“例行程序来接收新的测量值。

目前、停止例程如下所示:

  • DL_ADC_disableSequencer
  • DL_ADC_disableDMAInterrupt
  • 禁用 DMA 通道

并启动例程:

  • 复位并启用 DMA 通道以接受新序列(地址和大小)
  • DL_ADC_clearDMAInterruptStatus
  • DL_ADC_enableDMAInterrupt
  • DL_ADC_enableSequencer

这些程序按预期运行、能够在我们的测试期间停止并重新启动该序列。 但是、我们仍然想了解有关 SEQENABLE 标志行为的更详细信息、以分析特定时序下临界情况下的例程稳健性

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

    尊敬的 Oleksandr:

    感谢您提出详细问题并分享您的停止/启动程序。  

    AM13E230x TRM(修订版 A)没有明确记录在转换过程中清除 SEQENABLE 时会发生的情况。

    关键见解来自序列发生器如何处理抢占。 即使在最激进的抢占模式下、硬件也被明确设计为**从不中止已在进行中的单个 SOC 转换**。 该规范规定:

    “正在进行的序列将被放弃**在完成任何正在进行的转换之后**、仲裁将切换到更高优先级的序列。“

    此模式在架构中记录的所有抢占模式中保持一致。 硬件等待当前 SOC 转换到达 EOC、然后再执行任何状态更改。 这意味着、当 SEQENABLE 在转换过程中被清除时、最可能的行为是:

    -**当前活动的单个 SOC 转换将完成**、其结果将被存储
    -**此序列发生器在该点之后不会启动新的 SOC 转换**
    -**在 SEQENABLE 被清除后到达的新外部触发器将不被禁用的序列发生器接受**

    从中间转换的角度来看、这对应于一种情况:飞行中转换完成、然后序列发生器停止、而不是立即硬中止。


    DMA 触发含义

    这是实施方案的重要临界情况。 ADCWRAPPER 架构在转换结束 (EOC) 时生成 DMA 中断:

    “ ADCWRAPPER 仅在上一次转换的转换结束 (EOC) 后生成 DMA 中断。“

    这意味着**调用`DL_ADC_disableSequencer`后、一个剩余的 DMA 触发器仍可能触发**、对应于已在进行中的转换的 EOC。 您的当前停止例程可以正确处理此问题、因为您可以立即使用`DL_ADC_disableDMAInterrupt`禁用序列发生器、然后完全禁用 DMA 通道、从而针对任何过时的数据传输提供三个独立的保护层。


    对邻近序列发生器的影响

    根据序列发生器仲裁体系结构、禁用一个序列发生器应该**对相邻序列发生器没有破坏性影响**。 仲裁器只是将禁用的序列发生器从优先级链中删除:

    - SEQ1→SEQ2→SEQ3→SEQ4 优先级排序仅在**启用**序列发生器中保持
    -禁用的序列发生器不会阻塞、预先干扰或干扰其他有源序列发生器的转换流程
    -溢出标志逻辑是每个序列发生器,因此禁用一个序列发生器不会影响其他序列发生器的溢出状态

    值得注意的一个交互:如果您的禁用序列发生器**当前正在由仲裁器**提供服务、仲裁器将完成该序列发生器的当前 SOC、然后在下一个仲裁周期中按优先级顺序移动到下一个启用的序列发生器。


    评估您的停止/启动程序

    您的日常工作结构良好。 以下是详细的评估/细分:

    停止例程:

    步骤 安全 评估
    `dL_ADC_disableSequencer` 阻止新触发器启动新序列 正确的第一步—立即阻止新工作  
    `dL_ADC_disableDMAInterrupt` 阻止来自飞行 EOC 的残留 DMA 触发 关键步骤—捕获一个可能的残余触发器
     禁用 DMA 通道   阻止任何过时的数据传输   传送带和悬架保护

    启动例程:

    步骤 安全 评估
    复位并启用 DMA 通道 全新的寻址和传输大小 正确 — 确保没有过时的 DMA 状态
    `dL_ADC_clearDMAInterruptStatus` 从残留 EOC 清除任何挂起的中断 重要订购—必须在重新启用之前清除
     `dL_ADC_enableDMAInterrupt` DMA-ARMS Re 触发 没错
    `dL_ADC_enableSequencer` Re 启用触发器接受 正确的最后一步—序列发生器仅在 DMA 完全就绪后重新准备就绪

    在您的启动程序中进行排序特别重要。 清除 DMA 中断状态**之前**重新启用中断和序列发生器可确保来自已停止序列的任何残留 EOC 事件不会立即触发过时数据的虚假 DMA 传输。


    通过可选增强功能实现更大程度的稳健性

    如果要完全消除残留飞行中转换的任何时序不确定性、可以在停止例程中的序列发生器禁用和 DMA 中断禁用步骤之间添加一个**状态轮询**:

    DL_ADC_disableSequencer(...);
    
    // Optional: poll until sequencer is no longer actively converting
    // Check busy/active status flag if available on AM13e2x
    while (DL_ADC_isSequencerActive(...)) { } // confirm in-flight SOC has completed
    
    DL_ADC_disableDMAInterrupt(...);
    DL_ADC_disableDMAChannel(...);

    此致、

    Zackary Fleenor

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

    您好  Zackary!
    非常感谢您提供的详细细分。 这对我们有很大帮助!

    BR、
    Oleksandr