CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断
-
可以修改一下下面这个函数试试
platform\drivers\src\dma\dma_hw_access.c:void DMA_SetDmaRequestCmd(DMA_Type *base, uint8_t channel, bool enable) { /* Halt DMA before changing the REQEN register */ SDK_ENTER_CRITICAL(); base->CTRL |= 1 << 17u; int32_t timeout = 50; /* Wait DMA active done */ while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0) { timeout--; if (timeout <= 0) { break; } } if (enable) { base->REQEN |= (0x01UL << channel); } else { base->REQEN &= ~(0x01UL << channel); } /* Resume DMA */ base->CTRL &= ~(1 << 17u); SDK_EXIT_CRITICAL(); }
-
曹文勋 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:
我看你也是做了临界区的判断,这个是新的patch嘛,
请教一下下面的操作是做什么用处?
while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
{
timeout--;
if (timeout <= 0)
{
break;
}
}看描述的现象确实像临界区设置被重入出的问题。
这个修改主要是DMA REQEN 可以硬件清除,所以读 / 更改 / 写操作可能会导致错误地再次启用DMA通道。
如果是CAN的接收的话,可能会再次启动接收。
SDK 1_3_1 HOTFIX 版本中有做修复。如果不是这里的问题,可以再看看是不是其他地方临界区被重入了。
-
run 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:
曹文勋 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:
我看你也是做了临界区的判断,这个是新的patch嘛,
请教一下下面的操作是做什么用处?
while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
{
timeout--;
if (timeout <= 0)
{
break;
}
}看描述的现象确实像临界区设置被重入出的问题。
这个修改主要是DMA REQEN 可以硬件清除,所以读 / 更改 / 写操作可能会导致错误地再次启用DMA通道。
如果是CAN的接收的话,可能会再次启动接收。
SDK 1_3_1 HOTFIX 版本中有做修复。如果不是这里的问题,可以再看看是不是其他地方临界区被重入了。
收到,感谢
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...