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

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

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

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

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

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


 
Опции темы

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

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

Это трындец!
Таймер тоже надо перенастраивать заново для запуска процедуры reset!
Причем, тут уж вообще маразм. Пишу:
Код:
void ow_reset(){
	ow_done = 0;
	init_ow_dmatimer();
	timer_set_period(TIM2, OW_RESET*2); // reset length
	timer_set_oc_value(TIM2, TIM_OC4, OW_RESET);
	timer_enable_irq(TIM2, TIM_DIER_UIE | TIM_DIER_CC3IE);
	nvic_enable_irq(NVIC_TIM2_IRQ);
	TIM2_CCER |= TIM_CCER_CC4P | TIM_CCER_CC4E;
	TIM2_CR1 |= TIM_CR1_CEN;
}
(OW_RESET - 500мкс)
Получаю хрень какую-то. Ок, завожу счетчик и в прерывании инкрементирую, чтобы 3 импульса вышло:
Код:
uint16_t rstat = 0, lastcc3, xx = 0;
void tim2_isr(){
	if(timer_get_flag(TIM2, TIM_SR_UIF)){
		timer_clear_flag(TIM2, TIM_SR_UIF);
		if(++xx ‹ 3) return;
		TIM2_CCER &= ~TIM_CCER_CC4P; //timer_set_oc_polarity_high(TIM2, TIM_OC4);
		TIM2_CR1 &= ~TIM_CR1_CEN;    // timer_disable_counter(TIM2);
		gpio_set(GPIOA, GPIO3);
		timer_disable_irq(TIM2, TIM_DIER_UIE | TIM_DIER_CC3IE);
		nvic_disable_irq(NVIC_TIM2_IRQ);
		ow_done = 1;
		rstat = lastcc3;
		print_int(rstat, lastsendfun);
		MSG("\n");
		xx = 0;
	}
	if(timer_get_flag(TIM2, TIM_SR_CC3IF)){
		timer_clear_flag(TIM2, TIM_SR_CC3IF);
		lastcc3 = TIM_CCR3(TIM2);
	}
}
На осциллограмме — полный бред! Сначала идет нулевой импульс 1мс, а лишь после него - как положено: два импульса с заполнением 50% (500мкс 0, затем 500мкс 1).
Переставляю timer_set_oc_value(TIM2, TIM_OC4, OW_RESET) в конец функции. Картинка радикально меняется: сначала провал в 10мкс, затем 1 (до 1мс), а потом уже как надо.

НУ И ХРЕНЬ!!!

Вот такая функция инициализации:
Код:
void init_ow_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);
	rcc_periph_clock_enable(RCC_DMA1);
	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, OW_BIT);
	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_CC4DE | TIM_DIER_CC3DE);
	//timer_set_oc_polarity_low(TIM2, TIM_OC4);

	// capture: TIM2_CH3
	timer_ic_set_input(TIM2, TIM_IC3, TIM_IC_IN_TI4);
	timer_set_oc_polarity_high(TIM2, TIM_OC3);
	timer_ic_enable(TIM2, TIM_IC3);
	timer_enable_oc_output(TIM2, TIM_OC3);
}
Что забавно: по идее, enable/disable preload должны менять поведение таймера по отношению к восприятию записи в регистры ARR и CCR, а на деле - те же яйца, только в профиль.

Я вообще хренею, товарищи!

А еще, возврат в нормальное состояние (1 на выходе) не всегда "мгновенен": иногда 2-5мкс проходит дополнительного нулевого импульса, прежде чем стабилизируется 1.
КАК С ЭТИМИ ЧЕРТОВЫМИ ТАЙМЕРАМИ ВЫ РАБОТАЕТЕ???
Реклама:
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!

Последний раз редактировалось eddy; 14.11.2014 в 17:45.
eddy вне форума  
Непрочитано 14.11.2014, 18:40  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от eddy Посмотреть сообщение
КАК С ЭТИМИ ЧЕРТОВЫМИ ТАЙМЕРАМИ ВЫ РАБОТАЕТЕ???
Да мы отладчиком смотрим в пошаговом режиме, как компилятор "оптимизирует" код, распихивая команды по углам, и какие от этого эффекты... И какая реакция на физических портах... А вы чем смотрите? Или методом тыка осваиваете Кортекс?
niXto вне форума  
Непрочитано 14.11.2014, 18:50  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от niXto Посмотреть сообщение
Или методом тыка осваиваете Кортекс?
Естественно, методом тыка. Отладчиками я пользоваться не умею.
Да и какой, нафиг, отладчик на готовой плате-то? Я там только для бутлоадера выходы оставил, остальные ноги задействованы, а JTAG за ненадобностью (т.к. отладчиками пользоваться не умею) не разведен.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 14.11.2014, 19:09  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Отладчик прекрасно и по SWD работает в случае с STM32. А там всего два пина заняты.
Easyrider83 вне форума  
Непрочитано 14.11.2014, 23:00  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

eddy
Готовая плата подразумевает готовое отлаженое устройство,
для остального есть разные StmDiscovery. Ваша логика разработки просто нечто.
Hives вне форума  
Непрочитано 14.11.2014, 23:24  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от eddy Посмотреть сообщение
Я тоже так сначала и сделал, но фигвам.
Действительно - STM32F1 не умеет количество байт данных перезагружать (F4 и F2 похоже умеют):
Цитата:
or be reloaded
automatically by the value previously programmed if the channel is configured in auto-reload mode.
Что они называют auto-reload mode? Circular? Непонятно...

Сообщение от eddy Посмотреть сообщение
Больше трех десятков строк, однако.
Да ладно - в канале всего 5 регистров, из них DMA_CPARx можно не писать каждый раз. Откуда 30 строк?
_Артём_ вне форума  
Непрочитано 15.11.2014, 00:15  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

Сообщение от Hives Посмотреть сообщение
Ваша логика разработки просто нечто.
Нормально: сначала на макетке отработал все элементы по-отдельности, потом намалевал общую плату. Потом начал уже писать готовье. На макетке не мог - там всего лишь 64 ноги, а у меня из 100 задействованы 86 (конечно, включая питание и вспомогательные функции типа кварца и т.п.).
Сообщение от _Артём_ Посмотреть сообщение
Действительно - STM32F1 не умеет количество байт данных перезагружать
Я уже не помню, сколько раз даташит перечитал. Ну не нашел я там таких заподлянок! Видимо, errata надо почитать еще на всякий пожарный.
Сообщение от _Артём_ Посмотреть сообщение
Откуда 30 строк?
От opencm3. Я уже понял, что на регистрах будет вообще малюська. Буду переделывать на регистры.
Но таки хрен их поймешь: вот только что перечитал даташит на таймеры - ну не должны они глючить, если ты его вырубил, потом загрузил регистры новыми значениями и врубил. А он, с.., глючит!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 15.11.2014, 06:49  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: STM32F103, непонятки с DMA

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

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

Что за дебри? Там самое главное - читать подписи к кнопочкам, чтобы не перепутать кнопку "шаг со входом в подпрограммы" с "шаг без входа"... Да в списках меню выбрать мышкой отображение регистров...
Могу даже на скриншоте показать, куда нажимать...
niXto вне форума  
 
Опции темы

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

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, время: 03:46.


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