Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F103, непонятки с DMA

Непрочитано 29.10.2014, 14:24  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию 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, заново (на всякий случай) устанавливаю привязку к адресу в памяти, устанавливаю количество данных (, разрешаю прерывание по завершению передачи и запускаю 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мкс.

Где может быть ошибка?
Реклама:
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 29.10.2014, 14:34  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Интересно, для кого на форуме эта https://kazus.run/forums/showthread.php?t=28338 тема?
niXto вне форума  
Непрочитано 29.10.2014, 14:36  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от niXto Посмотреть сообщение
Интересно, для кого на форуме эта https://kazus.run/forums/showthread.php?t=28338 тема?
Там подобные сообщения моментально теряются в потоке остального. Вот пример.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 29.10.2014, 14:42  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

niXto, Действительно , тебе не потрафишь.

eddy, А дебаггер на бряке в dma_enable_channel(DMA1, DMA_CHANNEL7);
что показывает в регистрах DMA ?
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 29.10.2014, 14:48  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Этот путь падаван должен пройти самостоятельно. Никто в эти дебри добровольно не полезет. Только если сам решает аналогичную задачу.
Easyrider83 вне форума  
Непрочитано 29.10.2014, 14:51  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Easyrider83, злой ты ...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 29.10.2014, 15:06  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

dosikus, с дебаггерами работать не умею, к сожалению.
Сейчас буду штудировать даташит на предмет регистра, в котором хранится счетчик.

Но все равно, странно: ладно бы, у меня был циклический режим включен. Как так может получиться, чтобы DMA начинало не с первого байта? Ладно еще, начинало бы с последнего — это бы означало, что таймер завелся, но DMA еще не пнул, поэтому последнее значение повторил.

Чертовщина какая-то!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 29.10.2014, 15:09  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от eddy Посмотреть сообщение
с дебаггерами работать не умею, к сожалению.
С дебаггером бы и увидел что у тебя твориться .
А так только гадать будешь.
Кстати у тебя ни размер памяти ни периферии не инитится ...
Да и инкремент и направление все по дефолту ?
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 29.10.2014 в 15:14.
dosikus вне форума  
Непрочитано 29.10.2014, 15:14  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию 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
}
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 29.10.2014, 15:18  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию 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.
dosikus вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 28 14.10.2024 06:42
STM32F103 ADC+DMA Nik_UFO Микроконтроллеры, АЦП, память и т.д 11 24.08.2016 11:57
Tim19 -> DMA -> значение ADC в memory kvark85 ARM 6 03.06.2014 15:00
STM32 Повторный запуск DMA Nik_UFO Микроконтроллеры, АЦП, память и т.д 2 07.03.2012 17:38
DMA в ATxmega vav618 Микроконтроллеры, АЦП, память и т.д 1 03.04.2010 10:57


Часовой пояс GMT +4, время: 22:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.