ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
650747 Топик полностью
Antimouse (04.02.2016 12:01 - 12:05, просмотров: 131) ответил Лагунов на Ну значит будем искать что-то у меня в самом старте на передачу. Я в верхнем сообщении добавил свой пример настройки DMA для USART. А вот так хочу стартовать после подготовки посылки:
Вариант 
      
USART и DMA инициализированы и запущены заранее,
первичный запуск на передачу допустим 4 байт:
  FIFO_Out.Read( UART_TX_Data, 4); // вычитываем из fifo
  USART1_DMA_Restart( 4);          // запускам эту передачу

далее в теле функции, которая принимает решение на отправку данных:

  if( DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == SET) // заполняем буфер и запускаем DMA, если ДМА свободен, если UART свободен
  {
    if(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
    {
      N = FIFO_Out.GetOutQueue();
      if( N ) // отправка имеет смысл только если что-то есть в буфере
      {
        if( N>16 ) N = 16; // ограничение на длину UART_TX_Data (допустим 16 байт)
        FIFO_Out.Read( UART_TX_Data, N);
        USART1_DMA_Restart( N);
      }
    }
  }


void USART1_DMA_Restart(unsigned char Nom)
{
  DMA_Cmd(DMA2_Stream7, DISABLE);
  DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
  DMA2_Stream7->NDTR = Nom; // NDTR - для STM32F205, для других смотрите регистры и их хедер
  DMA_Cmd(DMA2_Stream7, ENABLE);
}