реклама на сайте
подробности

 
 
> STM32F4Discovery DMA1, I2S и USART3
Vladislav_Minsk
сообщение Dec 6 2012, 08:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 7-08-12
Пользователь №: 73 054



Добрый день...
Попробовал запустить I2S и USART3 через DMA1...
Судь в следующем:
снимаю данные по I2S с микрофона (частота 1 МГц) 4 раза по 16 бит (8 по 8 не получается) в DMA1 Stream3 channel0... Предварительно создал массив на 8 байт...
Данные записываются исправно, в отладчике видно... Отключаю третий поток, чтобы остановить меняющиеся данные, включаю четвёртый поток и начинаю передавать в USART3 8 байт...
И вроде всё хорошо, данные передаются правильно, но в регистре флагов DMA high interrupt status register (DMA_HISR) вылезает флаг ошибки FIFO, а именно FEIF4 (A FIFO error event occurred on stream 4)...
Перепроверял последовательности в памяти и те которые выводятся в терминале, всё совпадает... И хоть флаг можно сбросить, но как-то мне кажется не очень красиво получается...
Это куски с настройками DMA1:
CODE
unsigned char buf[8]; // 0x00

/* DMA1 Stream3 configuration */
DMA1_Stream3->CR = 0x00000000; // DMA1 stream3 channel 0 SPI2/RX configuration clear
DMA1_Stream3->CR = 0x00002D10; // DMA1 stream3 channel 0 SPI2/RX configuration set
DMA1_Stream3->NDTR = 4; // number of data items
DMA1_Stream3->PAR = (uint32_t) &SPI2->DR; // peripheral address register
DMA1_Stream3->M0AR = (uint32_t) &buf[0]; // memory address register

/* DMA1 Stream4 configuration */
DMA1_Stream4->CR = 0x00000000; // DMA1 stream4 channel 7 USART3/TX configuration clear
DMA1_Stream4->CR = 0x0E000550; // DMA1 stream4 channel 7 USART3/TX configuration set
DMA1_Stream4->NDTR = 8; // number of data items
DMA1_Stream4->PAR = (uint32_t) &USART3->DR; // peripheral address register
DMA1_Stream4->M0AR = (uint32_t) &buf[0]; // memory address register

Ind:
CODE
/* DMA1 Stream3 receive part */
DMA1_Stream3->CR |= (1<<0); // DMA1 On
for(;((DMA1->LISR & 0x08000000) == 0x00000000)wink.gif
{
}
DMA1_Stream3->CR &= ~(1<<0); // DMA1 Stream3 Off
DMA1->LIFCR |= ((1<<27) | (1<<26)); // clear flags TCIF3 and HTIF3
/* DMA1 Stream4 receive part */
DMA1_Stream4->CR |= (1<<0); // DMA1 Stream4 On
for(;((DMA1->HISR & 0x00000020) == 0x00000000)wink.gif
{
}
DMA1_Stream4->CR &= ~(1<<0); // DMA1 Stream4 Off
DMA1->HIFCR |= ((1<<5) | (1<<4)); // clear flags TCIF4 and HTIF4
goto Ind; // return Ind
return(0); // END programm
}
Этот флаг явно показывает, что что-то не так... Читал в документации, что возможно возникновение флага при переполнении...
Но как, где и в каком промежутке выполнения программы возникает...

Сообщение отредактировал IgorKossak - Dec 6 2012, 10:03
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01315 секунд с 7
ELECTRONIX ©2004-2016