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.

[参考译文] CCS/TMDS570LS31HDK:_enable_interrupt_();在执行之前改变行为。

Guru**** 2611325 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/767992/ccs-tmds570ls31hdk-_enable_interrupt_-alters-behaviour-before-it-is-executed

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

工具/软件:Code Composer Studio

HALCogen 04.07.00

CCS 8.2.0.7

SPI2将256 16位写入 SPI4、作为从器件的主器件。

在 SPI4上设置 DMA、帧计数为256、元素计数为1.e2e.ti.com/.../5633.CAN_5F00_1_5F00_2.zip

我发送256 16位、然后将 RTI 设置为1ms 并进入无限循环。

为了使 RTI 正常工作、我从 sys_core.h 中调用_enable_interrupts_

我在 RTI 初始化之前添加了一个长延迟。 我在 rtiInit()处放置一个断点;

如果没有_enable_interrupts 行并在 rtiInit()处停止、则 DMA 会成功。

使用_enable_interrupts 行并在 rtiInit()处停止、DMA 不是-或至少显示零。

这似乎是一种奇怪的抢先式错误。 这是 sys_main.c 代码的末尾:

对于(k=0;k<100;k++)延迟();

rtiInit();

rtiEnableNotification (1);//仅启用比较0通知

rtiStartCounter (0);

_enable_interrupt_();//包含此内容,即使代码在 rtiInit()处停止

//在 SPI4上接收到的数据的 DMA 显示没有接收到任何数据。 删除此内容

//并在同一位置停止显示数据 dma'd 正常

/*用户代码结束*/

while (1);


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了一个解决方案。 我更改了 DMA_Enable、使其忽略挂起而不是停止。
    我在阅读处理器勘误表 DMA#27后执行了此操作。
    由于我添加的延迟、这本身不会成为我发送的代码/项目的问题。
    我想延迟时间不够长、或者已经过优化、所以我在 DMA 完成之前暂停。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢更新!

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

    我上面的解决方案不是真正的解决方案。 我现在有一个更具体的问题。 我每200us 以10Mbaud 的速率将52 * 16位数据从 SPI2传输到 SPI4。   SPI4上的硬件触发 DMA 会将该数据传输到 RAM 中。 DMA 请求24 (SPI4)被分配给 DMA 请求线路0。这一切适用于以100us 运行的 RTI。 此外、CAN1在一次关闭测试 中写入 CAN2。

    然后我只需在 spiInit() 和 DMA 配置之前在 sys_main 中添加对 mibSPIinit()的调用。 mibSPIinit()由 HALCogen 设置,以初始化多缓冲的 mibSPI1。

    这会停止 DMA 正常工作。 为什么?

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

    我有答案。

    spiDAT1_t 数据通信 fi_tp;

    当声明为指针时、其地址设置为0。 不幸的是、0是程序存储器、而不是 RAM。

    很难进行跟踪、因为0处的数据是正确的、足以使结构中的数据正常工作。

    当程序大小改变时、这些值不够好、这说明了奇怪的行为。

    在0处 是代码、提示 Jump to cinit00 and cinit00 moved as the program size changed!

    当我声明指针时、如何使指针指向 RAM 而不这么做?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很傻。 指针被放置在 RAM 上的第一个可用位置。 它们必须在代码中进行初始化。