ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
9 мая
1428741 Топик полностью
IBAH (21.04.2024 21:51 - 22:37, просмотров: 64) ответил Mty1 на Ага, спасибо. Про буфер согласен полностью. Спасибо всем, прояснили в голове туман. А что за 2 прерывания при передаче строки?
Контроллер ДМА можно презагружать только в прерывании "буфер ДМА закончился". Соответственно два вызова прерывания, на первый символ и на последний. Длинна строки контроллеру ДМА не известна на момент записи первого символа. Что на строку, что на один символ будет два прерывания, отличии от буфера по прерыванию, там на каждый символ по прерыванию. 
//обработчик прерывание DMA
void DMA1_Channel2_3_IRQHandler(void);
void DMA1_Channel2_3_IRQHandler(void)
  {
  //if((DMA1->ISR)&DMA_ISR_TCIF2)
    {
    if(TxHead==TxTail) 
      { //запрещаем прерывания
      DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
                         (LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
                         (LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
                         (LL_DMA_MODE_NORMAL)|(0)|(DMA_CCR_EN);
      return;
      }
    //передача 
    DMA1->IFCR=DMA_IFCR_CTCIF2;
    DMA1_Channel2->CCR=0;
    DMA1_Channel2->CMAR=((unsigned long)TxFifo) + TxTail;
    if(TxHead>TxTail)
      {
      DMA1_Channel2->CNDTR=TxHead-TxTail;
      TxTail=TxHead;
      }
    else
      {
      DMA1_Channel2->CNDTR=FifoTxBuf-TxTail;
      TxTail=0;
      }
    DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
                       (LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
                       (LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
                       (LL_DMA_MODE_NORMAL)|(DMA_CCR_TCIE)|(DMA_CCR_EN);
    }  
  return;
  }

//Function: положить байт в ФИФО 
//Argument: передаваемый байт   
void PutFifo1(unsigned char data)
  {
  TxFifo[TxHead]=data;//кладем на голову
  TxHead=(TxHead+1)&(FifoTxBuf-1);
  DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
                     (LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
                     (LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
                     (LL_DMA_MODE_NORMAL)|(DMA_CCR_TCIE)|(DMA_CCR_EN);
  return;
  }