版本:2.5.1a
描述:使用DMA作为串口输出,HalUARTPollDMA会轮询DMA状态,但是以下代码中的decr计算发送延时有问题,因为dmaCfg.txShdw的值会跟着HalUARTPollDMA轮询周期进行刷新,导致ST0的值和刷新后的dmaCfg.txShdw的值一直达不到maCfg.txTick的要求,导致DMA触发发送有很长延迟。
if (dmaCfg.txShdwValid)
{
uint8 decr = ST0;
decr -= dmaCfg.txShdw;
if(decr > dmaCfg.txTick )
{
// No protection for txShdwValid is required
// because while the shadow was valid, DMA ISR cannot be triggered
// to cause concurrent access to this variable.
dmaCfg.txShdwValid = FALSE;
}
}
DMA中断函数中给了dmaCfg.txShdw初始值,但HalUARTPollDMA函数中在以下条件下会不停的刷新(通过调用HalUARTIsrDMA();)
if ((dmaCfg.txIdx[dmaCfg.txSel] != 0) && !HAL_DMA_CH_ARMED(HAL_DMA_CH_TX)
&& !HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX))
{
HAL_EXIT_CRITICAL_SECTION(his);
HalUARTIsrDMA();
}
该现象在低速率波特率下很明显,例如9600波特率经串口发送60个字节,连续发送4次,间隔20ms,240个字节有时候输出延时会到达8~10s,但由于缓存未溢出,倒是不会丢包。
VV:
你的发现是正确的,尤其在波特率低的时候,你需要调整这个值。
one Man:
回复 VV:
那要调为多少才没有延时啊?