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

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

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

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

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

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


 
Опции темы
Непрочитано 29.10.2014, 14:24  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
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мкс.

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

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

Сообщение от niXto Посмотреть сообщение
Интересно, для кого на форуме эта https://kazus.ru/forums/showthread.php?t=28338 тема?
Там подобные сообщения моментально теряются в потоке остального. Вот пример.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 29.10.2014, 14:42  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
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,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

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

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

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

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

Чертовщина какая-то!
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 29.10.2014, 15:09  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

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

Последний раз редактировалось dosikus; 29.10.2014 в 15:14.
dosikus вне форума  
Непрочитано 29.10.2014, 15:14  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
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
}
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 29.10.2014, 15:18  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
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 код Выкл.

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32F103 ADC+DMA Nik_UFO Микроконтроллеры, АЦП, память и т.д 11 24.08.2016 11:57
STM32 - Tips 'N Tricks nahimovv ARM 8 08.08.2016 14:35
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, время: 16:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot