#Eugene 0 29 апреля, 2019 Опубликовано 29 апреля, 2019 (изменено) · Жалоба Привет! При отправке данных через 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 ничего не пришло. Изменено 29 апреля, 2019 пользователем #Eugene Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 29 апреля, 2019 Опубликовано 29 апреля, 2019 · Жалоба Посмотрите вот здесь. Этот вариант у меня работает стабильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться