Подскажите, кто знает... 10 раз уже всё проверял. Вроде всё правильно, а передача не стартует. Камень stm32f407
Инициализирую RCC
Код
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |
RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP,
ENABLE);
прерывания...
Цитата
// Прерывание по завершению DMA при передаче с USART 1
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Получаю пакет обычным способом, разбираю его и формирую ответ ... После чего пытаюсь отправить ответ посредством DMA следующим образом ...
CODE
// Передача в nCOM. nCOM = 0, 1, 2.
// Через DMA
void vUSARTTransmit(uint32_t nCom)
{
DMA_Stream_TypeDef *DMA_Stream;
uint32_t tmp;
// Выбрать канал DMA
// Остановить его на всякий случай
// Очистить флаги
// Выбрать канал
// Инициализировать адрес периферии в DMA контроллере
if(nCom == 1)
{
DMA_Stream = DMA1_Stream2;
//DMA_Stream->CR &= ~DMA_SxCR_EN;
DMA1->LIFCR = DMA_LIFCR_CTCIF2 | DMA_LIFCR_CHTIF2 | DMA_LIFCR_CTEIF2 | DMA_LIFCR_CDMEIF2 | DMA_LIFCR_CFEIF2;
tmp = DMA_SxCR_CHSEL_1; // канал 2
DMA_Stream->PAR = (uint32_t)&USART2->DR; // USART 2
StatusCom->usart2rd = 1;
USART2->CR3 |= USART_CR3_DMAT; // разрешить передачу
USART2->SR = (uint16_t)~USART_SR_TC;
}
else if(nCom == 2)
{
DMA_Stream = DMA1_Stream3;
//DMA_Stream->CR &= ~DMA_SxCR_EN;
DMA1->LIFCR = DMA_LIFCR_CTCIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTEIF3 | DMA_LIFCR_CDMEIF3 | DMA_LIFCR_CFEIF3;
tmp = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0; // канал 3
DMA_Stream->PAR = (uint32_t)&USART3->DR; // USART 3
StatusCom->usart3rd = 1;
USART3->CR3 |= USART_CR3_DMAT; // разрешить передачу
USART3->SR = (uint16_t)~USART_SR_TC;
}
else
{
DMA_Stream = DMA1_Stream1;
//DMA_Stream->CR &= ~DMA_SxCR_EN;
DMA1->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 | DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1;
tmp = DMA_SxCR_CHSEL_0; // канал 1
DMA_Stream->PAR = (uint32_t)&USART1->DR; // USART 1
StatusCom->usart1rd = 1;
USART1->CR3 |= USART_CR3_DMAT; // разрешить передачу
USART1->SR = (uint16_t)~USART_SR_TC;
}
// FIFO is full
DMA_Stream->FCR = DMA_SxFCR_FTH;
// CR Memory & Peripheral single transfer, Priority level Medium, Peripheral increment PSIZE, Memory & Peripheral data size = byte
// Memory increment, Peripheral no increment, не повторять, Memory-to-peripheral, Transfer complete interrupt enable,
tmp |= DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0 | DMA_SxCR_TCIE;
DMA_Stream->CR = tmp;
// Загрузить длину пакета
DMA_Stream->NDTR = ComData[nCom].Tx.Ptr;
// Указать буфер
DMA_Stream->M0AR = (uint32_t)ComData[nCom].Tx.buf;
// Запретить FIFO mode
DMA_Stream->FCR = 0;
// Разрешить работу DMA
DMA_Stream->CR |= DMA_SxCR_EN;
}
Все регистры DMA заполняются верно - я это вижу в отладчике. А передача не стартует...
В чём я не прав? Чёто всю голову сломал...