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.

[参考译文] TMS320C6748:PRU 中断清除?

Guru**** 2614265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579129/tms320c6748-pru-interrupt-clear

器件型号:TMS320C6748

我尝试运行一个简单的测试循环、但很明显、我不会清除中断、因为 PRU 以全速运行。 设置 PRU 的代码是

/*峰化 PRU 实例。 *
PSCModuleControl (SOC_PSC_0_regs、HW_PSC_PRU、PSC_POWERDOMAIN_AYST_ON、
PSC_MDCTL_NEW_ENABLE);
HWREG (SOC_PRUCORE_0_regs)= 0;//停止 PRU0
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_CHANMAP0)= 3;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_CHANMAP1)= 12;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_HOSTMAP0)= 0x100;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_STATCLRINT0)=-1;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_HSTINTENIDXSET)= 0;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_HSTINTENIDXSET)= 1;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_GLBLEN)= 1;
HWREG (SOC_PRUINTC_0_regs + PRU_INTC_ENABLESET0)= 0x1008;
IRAM = SOC_PRUCORE_0_IRAM;
对于(i=0;i 

在 PRU 上加载(并运行)的代码如下:

*
* INTC 和定时器0中断的简单测试
*最终将与 SPI 一起使用以收集数据
*
.global main
.text

main:
LDI R1、0x4024 ;指向 STATIDXCLR
LDI R2的指针,3. ;定时器中断索引
LDI R3,30 ;要在 R31
LDI R4.w2、0x01c2中测试的位 ;定时器0
LDI R4.W0的高地址,0x0044 ;定时器0 INTCTLSTAT
LDI R5的低地址,2. ;要写入 INTCTLSTAT
的值开始:
qbbc start、R31、R3;R31中的位30是否置位?
Sbbo &R1、R2、0、4 ;将3写入 STATIDXCLR
sbbo &R4、R5、0、4 ;将2写入 INTCTLSTAT
XOR r30.B3、r30.B3、4;切换 GPIO 6-8
JMP 启动 ;并等待下一个计时器中断

.end

当我暂停处理器时、我可以通过直接写入 INTCTLSTAT 来清除中断、但 PRU 似乎不执行此操作。 我出了什么问题? Mike

编辑加法:

当我将0xffffffff 写入0x1c34200 (STATSETINT0)位置时、我 看到0xffffffff 结果(所有中断都被置位)。  然后、当我将0xffffffff 写入位置0x1c34280 (STATCLRINT0)时、位置0x1c34200会进入0x127ffff 而不是0x00000000。  PRU 是否有问题、或者这是否是其他寄存器未正确设置的良好线索??

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

    我已将此内容转发给软件专家。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我通过忽略 INTC 并直接查看 Timer0 INTCTLSTAT 发现了一个解决方法。 很高兴知道我是否错过了设置一些寄存器、或者 INTC 是否损坏。
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mike、

    我认为您的寄存器在汇编代码的参数中进行了混合。 最好先用 C 语言编写 PRU 代码并使其正常工作、然后根据需要优化汇编以使其最低限度地工作。

    听起来代码很简单、但在 CCS 中通过单步执行和手动更改寄存器中的值来尝试它、以查看真正的效果。 我们有关汇编语法的文档对我来说并不总是最清晰的、因此我尝试保留小示例代码、以便我可以引用自己的注释或测试简单的语法问题。

    此致、
    RandyP