Прикрутил я на STM32F051R8 (короче, на STM32F0Discovery) терминал. Всё работает под FreeRTOS760.
Работают очереди, передаются данные эхом от терминала и от задачки-дёргалки.
Работает буфер приёма - передачи, передаются в очередях ссылки на буферы и их длина. Всё нормально.
Двигаюсь дальше.
Делаю передачу USART1 через DMA, чтобы не отнимать у процессора время.
Вот инициализация канала DMA:
Код: Выделить всё
void vInit_dma (void)
{
RCC->AHBENR |= RCC_AHBENR_DMA1EN; // включить тактирование DMA1
SYSCFG->CFGR1 |= SYSCFG_CFGR1_USART1TX_DMA_RMP; // переключить запрос USART1 TXE на канал 4
DMA1_Channel4->CPAR = (__IO uint32_t)&(USART1->TDR); // адрес перифериии
DMA1_Channel4->CMAR = (__IO uint32_t)g.USART1_outbuf; // адрес памяти
DMA1_Channel4->CNDTR = DMA_CNDTR_NDT & g.usart1_outlen; // длина пересылки
DMA1_Channel4->CCR &= ~DMA_CCR_MEM2MEM; // не из памяти в память
DMA1_Channel4->CCR &= ~DMA_CCR_PL; // приоритет низкий
DMA1_Channel4->CCR |= DMA_CCR_PL_1; // приоритет высокий
DMA1_Channel4->CCR &= ~DMA_CCR_MSIZE; // размер данных 8 бит
DMA1_Channel4->CCR &= ~DMA_CCR_PSIZE; // размер периферии 8 бит
DMA1_Channel4->CCR |= DMA_CCR_MINC; // память инкрементировать
DMA1_Channel4->CCR &= ~DMA_CCR_PINC; // периферию не инкрементировать
DMA1_Channel4->CCR &= ~DMA_CCR_CIRC; // циркулярный режим выключен
DMA1_Channel4->CCR |= DMA_CCR_DIR; // направление от памяти в периферию
}Инициализация USART1 (только настройки, пины не выкладываю)
Код: Выделить всё
void vInit_usart (void)
{
USART1->CR1 &= ~USART_CR1_UE; //Выключаем USART1
RCC->CFGR3 &= ~RCC_CFGR3_USART1SW; // PCLK selected as USART1 clock
RCC->APB2ENR |= RCC_APB2Periph_USART1; //Включаем тактирование USART1
USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->BRR = (APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
USART1->CR1 |= USART_CR1_RE; //Включаем приемник USART1
USART1->CR1 |= USART_CR1_RXNEIE; //прерывание по приему данных
USART1->CR3 &= ~USART_CR3_DMAT; // запретить передачу через ДМА
USART1->ICR |= USART_ICR_ORECF;
}
Код: Выделить всё
void vUSART1_Send_DMA (uint32_t source, uint16_t len )
{
// использование ДМА для передачи строки в USART
USART1->CR1 &= ~USART_CR1_UE; //Выключаем USART1
DMA1_Channel4->CMAR = (__IO uint32_t)source; // адрес памяти буфера
DMA1_Channel4->CNDTR = DMA_CNDTR_NDT & len; // длина пересылки
DMA1->IFCR = DMA_IFCR_CGIF4; // сбросить флаги прерываний ДМА
USART1->CR3 |= USART_CR3_DMAT; // разрешить USART1 передачу через ДМА
USART1->CR1 |= USART_CR1_UE; //Включаем USART1
DMA1_Channel4->CCR |= DMA_CCR_EN; // разрешить DMA4
}
Регистры USART и DMA соответствуют программе, адреса в DMA правильные, а передача не происходит.
В инете есть примеры с использованием через функции SPL, и для 104 контроллера.
Вроде бы всё повторил, но где-то недосмотрел.
Если переключаю программу на вывод по ожиданию в цикле без ДМА, то всё отлично работает.
Где недосмотрел, подскажите.



