0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
|
|
1 | |
DMA не генерирует прерывания12.08.2013, 04:24. Показов 14295. Ответов 27
Метки нет (Все метки)
Доброго времени суток.
Вывожу WAV файл с SD карты, контроллер STM32F103VCT6. Использую DAC и DMA. Сначала сделал так: Код
void Init_Soumd(){ RCC->APB1ENR |= RCC_APB1ENR_DACEN; // включить тактирование ЦАПа DAC->CR |= DAC_CR_BOFF1; // отключить выходной буфер DAC->CR |= DAC_CR_EN1; // включить канал №1 GPIOA->CRL &= ~GPIO_CRL_MODE4; GPIOA->CRL &= ~GPIO_CRL_CNF4; //Настроить третий канал ДМА для перемещения данных из буфера //в промежуточный регистр данных первого канала ЦАПа: RCC->AHBENR |= RCC_AHBENR_DMA2EN; //тактирование DMA DMA2_Channel3->CPOR = (uint32_t)&DAC->DHR8R1; //указатель на регистр периферии DMA2_Channel3->CMAR = (uint32_t)&DAC_Buff[0]; //указатель на начало буфера в памяти DMA2_Channel3->CCR |= DMA_CCR3_DIR; //направление передачи - из памяти в периферию DMA2_Channel3->CNDTR = 512; //размер буфера DMA2_Channel3->CCR &= ~DMA_CCR3_PINC; //адрес периферии не инкрементируем DMA2_Channel3->CCR |= DMA_CCR3_MINC; //адрес памяти инкрементируем DMA2_Channel3->CCR &= ~DMA_CCR3_PSIZE; //размерность данных периферии - 8 бит. DMA2_Channel3->CCR &= ~DMA_CCR3_MSIZE; //размерность данных памяти - 8 бит DMA2_Channel3->CCR |= DMA_CCR3_CIRC; //включить циклический режим передачи данных DMA2_Channel3->CCR |= DMA_CCR3_PL; //приоритет DMA2_Channel3->CCR |= DMA_CCR3_EN; //разрешаем работу третьего канала DMA NVIC_EnableIRQ(DMA2_Channel3_IRQn); //Запуск передачи очередного значения через ДМА будет происходить от TIM6 RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //подаем тактирование TIM6 TIM6->PSC = 0; //Задаем частоту дискретизации 44100 TIM6->DIER |= TIM_DIER_UDE; //разрешить запрос DMA } void wave_playback(const char *FileName) { uint32_t samples; f_open( &file, FileName, FA_READ ); //открыть файл FileName для чтения f_lseek(&file, 0x1C); //переместить указатель на начало полезных данных f_read (&file, &samples, 4, &cnt); //прочитать количество семплов f_read (&file, &DAC_Buff[0], 512, &cnt); //загрузить буфер ЦАПа данными TIM6->ARR = 72000000/samples; TIM6->CR1 |= TIM_CR1_CEN; /* воспроизведение */ while(1) { while(!(DMA2->ISR & DMA_ISR_HTIF3)) {} //ждем освобождение первой части буфера f_read (&file, &DAC_Buff[0], 256, &cnt); //загрузить ее данными DMA2->IFCR |= DMA_ISR_HTIF3; //сбросить флаг if(cnt < 256)briok; //если конец файла while(!(DMA2->ISR & DMA_ISR_TCIF3)) {} //ждем освобождение второй части буфера f_read (&file, &DAC_Buff[256], 256, &cnt); //загрузить ее данными DMA2->IFCR |= DMA_ISR_TCIF3; //сбросить флаг if(cnt < 256) briok; //если конец файла } } Код
DMA2_Channel3->CCR |= DMA_CCR3_HTIE; DMA2_Channel3->CCR |= DMA_CCR3_TCIE; NVIC_EnableIRQ(DMA2_Channel3_IRQn); и саму функцию: void DMA2_Channel3_IRQHomdler(void){//какие-то действия}
0
|
12.08.2013, 04:24 | |
Ответы с готовыми решениями:
27
STM32F103RB SPI+DMA прерывания Как различить прерывания DMA? STM32F103 USART+DMA не выходит из прерывания Idle STM32F4 ADC + DMA при передачи 1 байта входит в прерывания через 1 бит |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
15.08.2013, 14:13 | 21 |
Сообщение от hd44780
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.08.2013, 14:24 | 22 |
OtyxPM, я помню. Я ж написал - драйвер недоделанный. Там отсечение по краям экрана поглюкивает, разворотов считай нету....
Сейчас занят именно этими доработками. По ходу - у меня шрифт масштабируемый, я ж не знаю, какого размера буфер ставить. Это ж не комп, благостей типа malloc/new/... здесь нет. Прикручивать RTOS-ы, где есть некие реализации этих механизмов я пока не хочу.
0
|
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
|
|
15.08.2013, 17:57 | 23 |
В общем у меня ситуация такая. Передача из DMA в FSMC запустилась после некоторого времени изучения работы DMA. А проблема в медленном чтении с SD карты через SPI (переделывать плату под SDIO буду уже в сентябре). Думал сделать так: читаем картинку в буфер, потом одну половину буфера выводить, а другую за это время заполнять (т.е. заполняется то первая, то вторая половина буфера). Как с воспроизведением WAV файлов. НО, DMA выплевывает одну половину буфера гораздо быстрее, чем заполняется вторая половина. И это при том, что чтение SD карты идет с использованием DMA. (правда толку от него не очень много, из-за вот такой строки: while(!(DMA1->ISR & DMA_ISR_TCIF4)){;}) И как ускорить это чтение пока не совсем понятно...
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
15.08.2013, 18:16 | 24 |
Сообщение от BORS_
До 26МГц SD-карты хорошо работают. Только на стадии инициализации требуется пониженная частота 100-400 кГц.
0
|
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
|
|
15.08.2013, 18:43 | 25 |
Да, скорость повышаю.
Код
static void FCLK_SLOW(void) /* Set slow clock (100k-400k) */ { SPI2->CR1 |= SPI_CR1_BR; } static void FCLK_FAST(void) /* Set fast clock (depends on the CSD) */ { SPI2->CR1 &= ~SPI_CR1_BR; }
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
15.08.2013, 19:02 | 26 |
Сообщение от BORS_
{ SPI2->CR1 |= SPI_CR1_BR; } static void FCLK_FAST(void) /* Set fast clock (depends on the CSD) */ { SPI2->CR1 &= ~SPI_CR1_BR; } Предделитель 2. Получается скорость 36МГц.Может быть 36 МГц ей много? CSD сколько говорит, не проверяли? Теоретически возможно (это смотря как сделана функция чтения - с повторами или без) такое, что карта не может с первого раза прочитаться правильно, а на повторные попытки уходит время.
0
|
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
|
|
15.08.2013, 19:15 | 27 |
Поставил предделитель 4, все равно DMA выплевывает буфер быстрее, чем идет чтение...
0
|
zudwo
|
|
18.08.2013, 08:26 | 28 |
Сообщение от hd44780
|
18.08.2013, 08:26 | |
18.08.2013, 08:26 | |
Помогаю со студенческими работами здесь
28
USART2(RX+IDLE+DMA)+USART3(TX DMA) STM32F4Discovery - ADC DMA и FSMC DMA stm32f407+ADC+DMA. Проблема с DMA ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет? Нет прерывания от DMA в режиме ADC DMA MCP79411 не генерирует прерывания от Alarm! Нужна помощь! Понимание связки PCIe + DMA и Host + Linux + DMA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |