Да вот сделал, чего давно хотел... Потоковый вывод в УАРТ, через
кольцевой буфер, через DMA. Потормозил немножко с DMA. Но это
оказалось совсем не больно. Мне нравится. *
void PutFifo0(unsigned char data)
{
TxFifo[TxHead]=data;//кладем на голову
//если UART свободен
if(LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_7)==0)
{//сразу запускаем передачу 1 символа
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_7);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_7, 1);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_7, ((unsigned long)TxFifo) + TxTail);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_7);
TxTail=(TxTail+1)&(FifoTxBuf-1);
}
TxHead=(TxHead+1)&(FifoTxBuf-1);
return;
}
void DMA1_Channel4_5_6_7_IRQHandler(void);
void DMA1_Channel4_5_6_7_IRQHandler(void)
{
//if(LL_DMA_IsActiveFlag_TC7(DMA1))
{
LL_DMA_ClearFlag_TC7(DMA1);
if(TxHead==TxTail) {return;}
if(TxHead>TxTail)
{
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_7);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_7, TxHead-TxTail);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_7, ((unsigned long)TxFifo) + TxTail);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_7);
TxTail=TxHead;
}
else
{
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_7);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_7, FifoTxBuf-TxTail);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_7, ((unsigned long)TxFifo) + TxTail);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_7);
TxTail=0;
}
}
return;
}
*