Перейти к содержанию
    

STM32F407: USART - передача через DMA срабатывает только 1 раз

Привет! При отправке данных через USART2, используя DMA1 транзакция срабатывает только один раз и перезапуск DMA не помогает. 

Что самое интересное - большинство примеров представляют из себя одиночный старт транзакции после резета, что на практике бесполезно. 

Кому-нибудь удалось это запустить?

Буферы:

#define UART_RX_BUFF_SIZE 128
#define UART_TX_BUFF_SIZE 1024

unsigned char uart_tx_buff[UART_TX_BUFF_SIZE];
unsigned char uart_rx_buff[UART_RX_BUFF_SIZE];

Настройки USART и DMA1:

  USART_InitTypeDef usart;
  usart.USART_BaudRate = 600000;
  usart.USART_Parity = USART_Parity_No;
  usart.USART_StopBits = USART_StopBits_1;
  usart.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  usart.USART_WordLength = USART_WordLength_8b;
  usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_Init(USART2, &usart);
  
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  
  //NVIC_EnableIRQ(USART2_IRQn);
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
  
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2->DR);
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) uart_rx_buff;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = UART_RX_BUFF_SIZE;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA1_Stream5, &DMA_InitStructure);
  DMA_Cmd(DMA1_Stream5, ENABLE); 
    
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) uart_tx_buff;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = UART_TX_BUFF_SIZE;
  DMA_Init(DMA1_Stream6, &DMA_InitStructure);
  
  USART_DMACmd(USART2, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
  
  USART_Cmd(USART2, ENABLE);

 

Отправка через DMA1:

 

void usart_write(unsigned char * data, int length){

  for(int i = 0; i < length; i++) uart_tx_buff[i] = data[i];
  
  DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TC);
  DMA_Cmd(DMA1_Stream6, DISABLE);
  DMA1_Stream6->M0AR = (uint32_t) uart_tx_buff;
  DMA1_Stream6->NDTR = length;
  DMA_Cmd(DMA1_Stream6, ENABLE);
    
}

После первого запуска регистр DMA1_Stream6->NDTR равен нулю.

После последующих запусков там не ноль -> транзакция не была запущена и в UART ничего не пришло.

Изменено пользователем #Eugene

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...