Как запустить передачу DMA с помощью таймера.

Октавио
Ср 31 мая 2017 г. 12:06
На самом деле у меня есть этот код, который не компилируется, потому что «таймер->dev » - это личный, какой правильный способ сделать это? timer_dma_enable_trg_req(timer->dev);

Стивестронг
Ср 31 мая 2017 г. 14:03
"Таймер->Dev "должен быть Timerx, который вы объявили" таймером ".

Октавио
Ср 31 мая 2017 г. 15:10
Ну, это компилирует, но не работает, что мне пропустил?
#include #define dma_bufer_size 48 long dma_bufer[dma_bufer_size]; //dmx driver //d- PA2 //d+ PA3 #define dmx0 0x80004; #define dmx1 0x40008; HardwareTimer timer(2); dma_tube_config tube_config; void setup() { //fill dma bufer int fps=0; do{ dma_bufer[fps++]=dmx0; dma_bufer[fps++]=dmx1; }while(fpsregs->BSRR; // Load pointer to porta clear/set tube_config.tube_dst_size = DMA_SIZE_32BITS; tube_config.tube_nr_xfers = dma_bufer_size; tube_config.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC; // Source pointer increment,circular mode tube_config.target_data = 0; dma_init(DMA1); tube_config.tube_req_src = DMA_REQ_SRC_TIM2_CH3; // DMA request source. dma_set_priority(DMA1, DMA_CH1,DMA_PRIORITY_VERY_HIGH); dma_tube_cfg(DMA1, DMA_CH1, &tube_config); // Attach the tube to channel 1 (timer2 ch3) dma_enable(DMA1, DMA_CH1); //TIMER setup timer.pause(); timer.setPeriod(2000000);//2 seconds timer.setChannel3Mode(TIMER_OUTPUT_COMPARE); timer.setCompare(TIMER_CH3, 1); timer_dma_enable_trg_req(TIMER2); timer.resume(); } void loop() { while(1){ //commented code is what dma is supposed to do.(blink a led connected to PA2-PA3) /* GPIOA->regs->BSRR=dmx0; delay(2000); GPIOA->regs->BSRR=dmx1; delay(2000);*/ }; }

Рик Кимбалл
Ср 31 мая 2017 г. 15:43
Откуда приходит dma_tube_config? Это не компилируется для меня.

Октавио
Ср 31 мая 2017 г. 15:47
Я использую Arduino 1.8.2 и библиотеки для STM32F1 (из репозитория Роджера Кларка, я думаю.)
https: // github.com/rogerclarkmelbourne/ ... nfig&Тип =

Рик Кимбалл
Ср 31 мая 2017 г. 15:50
Я использую последние вещи от GitHub. Там поиск я не вижу, где это определено.

https: // github.com/rogerclarkmelbourne/ ... nfig&Тип =

Просто комментарии

Октавио
Ср 31 мая 2017 г. 15:53
Определено в строке 137
https: // github.com/rogerclarkmelbourne/ ... aple/dma.час

Рик Кимбалл
Ср 31 мая 2017 г. 15:54
https: // github.com/rogerclarkmelbourne/ ... Рис/DMA.час ... Это здесь ..
Однако, это не находит SDFAT.H или этот файл для меня.

Октавио
Ср 31 мая 2017 г. 15:59
Это тоже работает с этим: #include

Стивестронг
Ср 31 мая 2017 г., 17:11
Пытаться:

источник трубки = &dma_buffer; // Обратите внимание на "&"

Tube dest = &GPIOA->регс->ODR; // используются только самые низкие 16 бит, поэтому вы можете использовать 16 -битную передачу, увеличивая количество образцов для хранения в буфере

Я не уверен, что вы выбрали правильный источник для триггера DMA. Не должен быть вывод CC TIM2 CH3?

Выдержка из RM0008: "In addition, if the URS bit (update request selection) in TIMx_CR1 register is set, setting the UG bit generates an UEV update event but without setting the UIF flag (thus no interrupt or DMA request is sent)."

Октавио
Ср 31 мая 2017 г., 21:46
Теперь, для отладки, я сделал перенос MEM в MEM DMA, передача осуществляется сразу же игнорируя триггер таймера (таймер не включен).

Октавио
Чт, 01 июня 2017 г., 16:10
Проблема решена, я изменил "Timer_DMA_ENABLE_TRG_REQ (TIMER2);" по "timer2_base->Dier = timer_dier_cc3de; "и он работает сейчас.

USBERIAL и SERIAL TERMINAL

SPI DMA функции