Вот работающий код. Скорости и форматы передачи не здесь - настраиваются ДО вызова stream_initialize.
Скорость передачи по COM должна быть больше скорости заполнения.
CODE
#define DMAUSART1BUFFSIZE8 128
static uint_fast8_t txbuffphase;
static unsigned txbufflevel;
static uint8_t txbuff [2] [DMAUSART1BUFFSIZE8];
void stream_putchar(uint_fast8_t c)
{
txbuff [txbuffphase] [txbufflevel] = c;
if (++ txbufflevel >= DMAUSART1BUFFSIZE8)
{
DMA2->HIFCR = DMA_HIFCR_CTCIF7; // сбросил флаг от Stream7 - DMA готово начинать с начала
// Запуск передачи заполненного буфера
DMA2_Stream7->M0AR = (uint32_t) & txbuff [txbuffphase] [0];
DMA2_Stream7->CR |= DMA_SxCR_EN; // перезапуск DMA
// Буфер заполнился - переключаемся на следующий буфер
txbuffphase = ! txbuffphase;
txbufflevel = 0;
}
}
// Инициализация DMA по передаче USART1
void stream_initialize(void)
{
/* USART1_TX - Stream7, Channel4 */
/* DMA для передачи по USART1 */
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; // включил DMA2
__DSB();
DMA2_Stream7->PAR = (uint32_t) & USART1->DR;
DMA2_Stream7->FCR &= ~ DMA_SxFCR_DMDIS; // use direct mode
DMA2_Stream7->CR =
(0 * DMA_SxCR_MBURST_0) | // 0: single transfer
(0 * DMA_SxCR_PBURST_0) | // 0: single transfer
(4 * DMA_SxCR_CHSEL_0) | //канал 4
(1 * DMA_SxCR_DIR_0) | //направление - память - периферия
(1 * DMA_SxCR_MINC) | //инкремент памяти
(0 * DMA_SxCR_MSIZE_0) | //длина в памяти - 8 bit
(0 * DMA_SxCR_PSIZE_0) | //длина в USART_DR - 8 bit
(0 * DMA_SxCR_CIRC) | //циклический режим не требуется при DBM
(2 * DMA_SxCR_PL_0) |
(0 * DMA_SxCR_CT) | // M0AR selected
(0 * DMA_SxCR_DBM) | // double buffer mode seelcted
0;
DMA2_Stream7->NDTR = (DMA2_Stream7->NDTR & ~ DMA_SxNDT) |
(DMAUSART1BUFFSIZE8 * DMA_SxNDT_0) |
0;
USART1->CR3 |= USART_CR3_DMAT; /*!< DMA Enable Transmitter */
}
Сообщение отредактировал IgorKossak - Aug 21 2014, 07:58
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!