ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
1205641 Топик полностью
IBAH (04.05.2022 21:15, просмотров: 330) ответил SciFi на Что делаем, если не секрет?
Да вот сделал, чего давно хотел... Потоковый вывод в УАРТ, через кольцевой буфер, через 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;
  }

*