我正在尝试将DMA用于我的UART Rx和Tx。直到现在我的freeRTOS版本的串行演示工作正常。它仍然可以正常工作。但是,现在我已经从示例项目中合并了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网站上使用MPLAB C30编译器的UART DMA Loopback示例在我的主板上工作正常。关于这个的任何指针?我无法在FreeRTOS论坛中找到有关如何将DMA用于UART的任何代码示例,但建议在生产代码中使用此方法以提高效率。
需要帮助。
谢谢和最诚挚的问候, 维沙尔
答案 0 :(得分:0)
行。我找到了罪魁祸首。是我。 :))。 设置DMA以接收UART中断时,不应在软件中单独使能UART中断。这就是我在做什么。另外,我有条件地从我的代码中编译了UART ISR !!!因此,实际上,只要UART引擎接收到一个字节,处理器就会对谁将提供此中断,DMA或应用程序代码感到困惑。我的PC将指向指定的UART RX ISR向量位置,处理器找不到任何东西,这导致重置。或者可能是DMA和处理器之间存在竞争条件,以便为此中断服务,从而导致重置。
现在我已经设置了UART,以便应用程序不单独启用中断,当DMA要为UART RX提供服务时,我的代码工作正常。我还没有使用二进制信号量将整个事件与FreeRTOS延迟中断处理集成,但我希望我不会在那里看到任何麻烦。
虽然......在Microchip手册和FreeRTOS示例中都没有太多记录。
另外,我发现当使用带UART的DMA时,根据手册,DMA从UART RX引擎接收WORDS,低字节有数据,高字节有状态。如果DMA也用于UART Tx,并且设置为将WORDS传输到UART TXREG,则两者智能地设置为仅发送较低数据字节。所以接收方仍然得到预期的字节。这也没有记录好。
我会尽力在这里为后代发布我的代码:))。