DSPIC33F UART DMA示例不工作



我正在尝试将DMA用于UART Rx和Tx。到目前为止,我的免费RTOS版本的串行演示运行良好。它仍然运行良好。然而,现在我已经从示例项目中引入了UART DMA示例。代码是有条件编译的,因此当开关_HAS_DMA==1时,只有DMA引擎才被配置,ram缓冲区被配置,并且FreeRTOS演示所需的默认UART ISR被删除。

在这一点上,每当我发送一个串行字节流时,正在运行的项目就会被重置。

我使用的是MPLAB IDE 8.92,XC16 v1.20,Explorer-16平台,dspic33fj256gp710部分。

包含的DMA代码不使用任何FreeRTOS API调用。我已经设置了该项目,以便使用FreeRTOS配置选项检测StackOverflow。但是代码没有到达Stackoverflow钩子函数。我还包含了U2ErrInterrupt ISR,以查看传入字节是否正常,但即使是该中断也无法达到。

以前有人面对过这种情况吗?

有趣的是,Microchip网站上的UART DMA环回示例使用了MPLAB C30编译器,在我的板上运行良好。

这个有什么线索吗?我在FreeRTOS论坛上找不到任何关于如何将DMA用于UART的代码示例,但为了提高效率,建议在生产代码中使用这种方法。

这里需要帮助。

谢谢并致以最良好的问候,Vishal

好。我找到了罪魁祸首。是我。:))。当设置DMA以接收UART中断时,不应在软件中单独启用UART中断。这就是我所做的。此外,我有条件地从我的代码中取消编译UART ISR!!!。因此,实际上,每当UART引擎接收到一个字节时,处理器就会混淆谁将为这个中断、DMA或应用程序代码提供服务。我认为PC会指向指定的UART RX ISR矢量位置,在那里处理器找不到任何东西,这导致了重置。或者DMA和处理器之间可能存在竞争条件设置,以服务于此中断,从而导致重置。

现在我已经设置了UART,这样中断就不会被应用程序单独启用,当DMA将为UART RX提供服务时,我的代码运行良好。我还没有将整个过程与使用二进制信号量的FreeRTOS延迟中断处理集成在一起,但我希望不会出现任何问题。

虽然没有太多关于这方面的文献。。。无论是在Microchip手册中还是在FreeRTOS示例中。

此外,我发现,根据手册,当将DMA与UART一起使用时,DMA从UART RX引擎接收WORDS,较低的字节具有数据,较高的字节具有状态。如果DMA也用于UART Tx,并且设置为将WORDS传输到UART TXREG,则这两个智能地管理仅发送较低的数据字节。因此,接收方仍然可以获得预期的字节。这也没有很好的记录。

不过,我会尝试在这里为子孙后代发布我的代码:)。

相关内容

  • 没有找到相关文章

最新更新