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.

[参考译文] RM46L852:ISR 和 N2HET

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1257443/rm46l852-isr-and-n2het

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

我有我自己的汇编程序、我可以通过 HET2选项卡中的高级配置模式使用它。
我有该程序的第二条指令 LO1、生成了一个 IRQ = ON 的中断。 (它是一个 ECMP)。
中断没有工作。 我已经在主代码中使用 hetREG2->intENAS = Phet_L01_1进行了配置、但仍然无法正常工作。
有人能帮忙吗?

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

    尊敬的 Nuno:

    很抱歉耽误你的时间。

    由于 RM46硬件无法正常工作、我将此线程转发给我的高级逻辑集。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Nuno:

    HETFLG 是否置位?

    您能将您的 N2HET 汇编代码与我们分享吗? 您可以使用 HET IDE 来测试您的 NHET 代码、并检查中断是否被生成。

     https://www.ti.com/tool/HET_IDE

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

    这是我的示例:

    ;简单 PWM
    l00 CNT{reg=A、IRQ=off、max= 10}
    L01 ECMP{en_pin_action=on、pin=0、action=PULSELO、reg=A、IRQ=on、data=5、hr_data=7};
    L02 BR{next= L00、COND_addr=L00、EVENT= NOCOND}

    当 REGA 的值= ECMP = 5中的数据时、一个中断被生成(HETFLG 的位1被置位)。

     即使 N2HET 中断使能设定寄存器(HETINTENAS)的相应位为0、HETFLG 也被置位。

    为了产生一个中断、在 N2HET 中断使能置位寄存器(HETINTENAS)中的相应位必须为1。

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

    是的,这是有帮助的,谢谢。
    但是我的问题是、将 HETINENAS 中的相应位设为1时、仍然不生成中断。
    为什么会这样呢?

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

    是否启用了 IRQ?

    在一个中断请求到达 CPU 前、有三个"栅极":

    • 产生中断请求的模块有一个寄存器来启用它可以生成的每个中断。   

           例如、设置  HETINENAS 中的位。

    • 向量中断管理器(VIM)具有寄存器、以便允许根据优先级方案(较低通道编号在前)将来自模块的中断请求转发给 CPU。

          

    • 最后、CPU 本身必须被配置为响应 VIM (IRQ 或 FIQ)发送的中断请求。

          _enable_IRQ ()

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

    问题是我已经做到了,它仍然不工作,我不知道为什么

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

    尊敬的 Nuno:

    您能否以汇编格式(即  L00 CNT{reg=a、IRQ=off、max= 10})与我共享您的 N2HET 代码?  

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

    尊敬的 Nuno:

    刚刚创建了一个示例、DMA 传输由从 N2HET2 RAM 运行的 N2HET 指令触发。

    1. DMA 将数据从一个缓冲区传输到位于 MCU SRAM 中的另一个缓冲区

    2. DMA 请求线24映射到 DMA 通道0。 请求行24是来自 N2HET 指令的请求编号6

      dmaReqAssign (DMA_CH0、  24 );

      一条 N2HET 指令能够通过编辑"reqnum"来选择8个请求线路中的一个、在这个示例中使用 reqnum=6。

      eCMP{reqnum= 6 ,请求= GENREQ ,en_pin_action=on、pin=8、action=PULSELO、reg=A、IRQ=on、data=5、hr_data=0};

    3。  N2HET 请求目的选择寄存器(HETREQDS)应该被配置成触发 DMA 通道、而不是 HTU 通道:

      hetREG2->REQDS = 0xFF;

      hetREG2->REQENS = 0xFF;

    4. hetRAM2->Instruction [1].Control |=(0x1<<27)|(0x1<<22));

      这是为了启用请求和引脚操作。

    我的测试显示数据通过 DMA 通道0传输到 RX_DATA 缓冲区。 DMA 中断、和 N2HET 中断被生成。

    RM46L852_N2HET_DMA.zip

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

    申请行24是否映射到通道20?

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




    不应该是为 CH_6请求第6行吗?

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

    您可以使用任何 DMA 通道、但请求编号是固定的:20、21、24、25

    [..]中突出显示的数字(4、5、6、7) 下表中是 HET 指令 ECAP 中定义的请求行。  

    如果 ECMP 中的请求行为4、您已经将请求20分配给 DMA 通道。

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

    为什么您的中断在 pwmnotification 中而不是 hetnotification 中?

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

     pwmnotification()是 HET 中断服务例程的一部分。 在一个 PWM 周期结束或占空比结束时调用它。

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

    是的、但是您使用的是您制作的 HET 代码。 所以你不能在 halcogen 中使用选项卡对吧?

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

    我不编写自己的 HET ISR。 当 ECMP 生成中断(我的示例代码中的指令1)时、将调用 HET ISR、然后调用您自己的 HET 通知功能。 在我的示例中、我使用 HAL 函数向您显示 INT 由 HET 代码生成。

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

    您是否需要启用主机中的位来调用 ISR?

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

    尊敬的 Nuno:

    这是一个好问题。 答案是肯定的: 必须设置相应的 hetantens 位。 必须满足以下两个条件才能生成中断

    1.设置 HET 指令的中断使能位:

    控制字段的第1位(第2个32位字)是中断启用/禁用位:

    2.设置 HETINENAS 中相应的位。

      在我的示例中,这是在 hetInit()中设置的。

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

    这只是为了澄清。 在满足这两个条件后、当调用 ISR 时、代码将跳转到 HetNotification 或 pwmNotification?

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

    因为它只中断一次、所以出现了一个问题。 我认为生成 DE ISR 的标志未正确复位

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    满足这两个条件后,当 ISR 被称为代码跳转到 HetNotification 或 pwmNotification?

    在中断生成后、VIM 控制器将 HET ISR 的地址提供给 CPU、然后 CPU 开始执行 ISR 指令。

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

    当接收到一个 IRQ 中断时、CPU 通过将 CPSR 位7置位来禁用其它 IRQ 中断。 ISR 执行完成后、CPU 将处理其他挂起的中断。 ISR 的第1条指令用于从 HETOFF1寄存器读取偏移值。 读取 HETOFF1将清除 HETFLG 中的相应标志、以便您可以获取下一个中断。  

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

    因此我按此方式设置 IRQ。 事情是在第一个中断之后、程序停止工作。 我是否需要其他配置?

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

    为什么要重复复位 CNT 指令的数据字段? 数据字段清零后、所选寄存器(在我的示例中的寄存器 A)也会在下一个 HET 环路分辨率时钟中清零。  

    此寄存器 (示例中的寄存器 A) 用于 ECMP 指令。 eCMP 将此寄存器(A)的值与 eCMP 数据字段的值进行比较。 如果所选寄存器(A)的值未达到 ECMP 数据域的值、则所选引脚不会切换、也不会产生中断。

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

    我为该行添加了注释并进行了测试。 问题是、当我进入调试模式时、代码卡在 vimParityErrorHandler 上。 我不知道为什么。

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

    尊敬的 Nuno:

    这是另一个问题。 您可以为这个 VIM 奇偶校验问题打开一个新主题吗? 谢谢

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

    好的、确定