29.10.2014, 14:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
STM32F103, непонятки с DMA
В попытке реализовать 1-wire на DMA таймера в решиме ШИМ, я столкнулся с необъяснимой ерундой. Итак, адресую DMA на массив
Код:
|
uint32_t tim2_buff[8] = {10,20,30,40,50,60,70,80}; |
Настраиваю автоинкремент в памяти, приемником ставлю регистр CCR4 таймера TIM2 (сам таймер настроен на частоту 1МГц, ARR установлен в 86 — 87мкс период между update events). (Этому каналу соответствует DMA1, канал 7).
Для запуска передачи данных сбрасываю все флаги седьмого канала DMA1, заново (на всякий случай) устанавливаю привязку к адресу в памяти, устанавливаю количество данных ( ![Горд собой](images/smilies/icon_dovl.gif) , разрешаю прерывание по завершению передачи и запускаю DMA и таймер:
Код:
|
void run_dmatimer(){
DMA1_IFCR = DMA_ISR_TEIF7|DMA_ISR_HTIF7|DMA_ISR_TCIF7|DMA_ISR_ GIF7; // clear flags
dma_set_memory_address(DMA1, DMA_CHANNEL7, (uint32_t)tim2_buff);
dma_set_number_of_data(DMA1, DMA_CHANNEL7, 8);
dma_enable_transfer_complete_interrupt(DMA1, DMA_CHANNEL7);
//timer_set_oc_value(TIM2, TIM_OC4, 100);
timer_set_dma_on_update_event(TIM2);
timer_set_oc_polarity_low(TIM2, TIM_OC4);
dma_enable_channel(DMA1, DMA_CHANNEL7);
timer_enable_counter(TIM2);
} |
В прерывании DMA по окончанию передачи вырубаю все:
Код:
|
void dma1_channel7_isr(){
if(DMA1_ISR & DMA_ISR_TCIF7) {
DMA1_IFCR |= DMA_IFCR_CTCIF7;
//transfered = 1;
timer_set_oc_polarity_high(TIM2, TIM_OC4);
dma_disable_channel(DMA1, DMA_CHANNEL7);
timer_disable_counter(TIM2);
}
} |
Передача работает, но по какой-то причине все время начинается не с нулевого элемента массива, а с шестого. Т.е. на осциллограмме вместо последовательности импульсов с нулевым уровнем длительностью 10,20,30,40,50,60,70 и 80 мкс я вижу последовательность 70,80,10,20,30,40,50 и 60мкс.
Где может быть ошибка?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
29.10.2014, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
|
|
|
|
29.10.2014, 14:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Там подобные сообщения моментально теряются в потоке остального. Вот пример.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
29.10.2014, 14:42
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
niXto, Действительно , тебе не потрафишь.
eddy, А дебаггер на бряке в dma_enable_channel(DMA1, DMA_CHANNEL7);
что показывает в регистрах DMA ?
__________________
Осторожно , злой кот
|
|
|
|
29.10.2014, 14:48
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Этот путь падаван должен пройти самостоятельно. Никто в эти дебри добровольно не полезет. Только если сам решает аналогичную задачу.
|
|
|
|
29.10.2014, 14:51
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Easyrider83, злой ты ...
__________________
Осторожно , злой кот
|
|
|
|
29.10.2014, 15:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
dosikus, с дебаггерами работать не умею, к сожалению.
Сейчас буду штудировать даташит на предмет регистра, в котором хранится счетчик.
Но все равно, странно: ладно бы, у меня был циклический режим включен. Как так может получиться, чтобы DMA начинало не с первого байта? Ладно еще, начинало бы с последнего — это бы означало, что таймер завелся, но DMA еще не пнул, поэтому последнее значение повторил.
Чертовщина какая-то!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
29.10.2014, 15:09
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Сообщение от eddy
|
с дебаггерами работать не умею, к сожалению.
|
С дебаггером бы и увидел что у тебя твориться .
А так только гадать будешь.
Кстати у тебя ни размер памяти ни периферии не инитится ...
Да и инкремент и направление все по дефолту ?
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 29.10.2014 в 15:14.
|
|
|
|
29.10.2014, 15:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Сообщение от dosikus
|
С дебаггером бы и увидел что у тебя твориться .
А так только гадать будешь.
Кстати у тебя ни размер памяти ни периферии не инитится ...
|
Почему же, все инициализируется. Просто основной инит в начале:
Код:
|
void init_dmatimer(){ // tim2_ch4 - PA3, no remap
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, GPIO3);
rcc_periph_clock_enable(RCC_TIM2);
nvic_enable_irq(NVIC_TIM2_IRQ);
timer_reset(TIM2);
// timers have frequency of 1MHz -- 1us for one step
// 36MHz of APB1
timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
// 72MHz div 72 = 1MHz
timer_set_prescaler(TIM2, 71); // prescaler is (div - 1)
timer_continuous_mode(TIM2); // automatically reload
timer_enable_preload(TIM2); // force changing period
timer_set_period(TIM2, 86); // period is 87us
timer_enable_update_event(TIM2);
timer_set_oc_mode(TIM2, TIM_OC4, TIM_OCM_PWM1); // edge-aligned mode
timer_enable_oc_preload(TIM2, TIM_OC4);
timer_enable_oc_output(TIM2, TIM_OC4);
timer_enable_irq(TIM2, TIM_DIER_UDE | TIM_DIER_CC4DE);
// TIM2_CH3 - DMA1, channel 7
rcc_periph_clock_enable(RCC_DMA1);
dma_channel_reset(DMA1, DMA_CHANNEL7);
dma_set_peripheral_address(DMA1, DMA_CHANNEL7, (uint32_t) &(TIM_CCR4(TIM2)));
dma_set_read_from_memory(DMA1, DMA_CHANNEL7);
dma_enable_memory_increment_mode(DMA1, DMA_CHANNEL7);
dma_disable_peripheral_increment_mode(DMA1, DMA_CHANNEL7);
dma_set_peripheral_size(DMA1, DMA_CHANNEL7, DMA_CCR_PSIZE_16BIT);
dma_set_memory_size(DMA1, DMA_CHANNEL7, DMA_CCR_MSIZE_32BIT);
//dma_enable_circular_mode(DMA1, DMA_CHANNEL7); // auto reload after transfer complete
dma_set_memory_address(DMA1, DMA_CHANNEL7, (uint32_t)tim2_buff);
nvic_enable_irq(NVIC_DMA1_CHANNEL7_IRQ); // enable dma1_channel7_isr
} |
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
29.10.2014, 15:18
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
dma_set_peripheral_size(DMA1, DMA_CHANNEL7, DMA_CCR_PSIZE_16BIT);
dma_set_memory_size(DMA1, DMA_CHANNEL7, DMA_CCR_MSIZE_32BIT);
Изумительно , а мы гадаем ....
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 29.10.2014 в 15:21.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:30.
|
|