STM32F103, непонятки с DMA
14.11.2014, 17:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
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.
|
|
|
|
14.11.2014, 18:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Сообщение от eddy
|
|
КАК С ЭТИМИ ЧЕРТОВЫМИ ТАЙМЕРАМИ ВЫ РАБОТАЕТЕ???
|
Да мы отладчиком смотрим в пошаговом режиме, как компилятор "оптимизирует" код, распихивая команды по углам, и какие от этого эффекты... И какая реакция на физических портах... А вы чем смотрите? Или методом тыка осваиваете Кортекс?
|
|
|
|
14.11.2014, 18:50
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Сообщение от niXto
|
|
Или методом тыка осваиваете Кортекс?
|
Естественно, методом тыка. Отладчиками я пользоваться не умею.
Да и какой, нафиг, отладчик на готовой плате-то? Я там только для бутлоадера выходы оставил, остальные ноги задействованы, а JTAG за ненадобностью (т.к. отладчиками пользоваться не умею) не разведен.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
14.11.2014, 19:09
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Отладчик прекрасно и по SWD работает в случае с STM32. А там всего два пина заняты.
|
|
|
|
14.11.2014, 23:00
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
eddy
Готовая плата подразумевает готовое отлаженое устройство,
для остального есть разные StmDiscovery. Ваша логика разработки просто нечто.
|
|
|
|
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
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Сообщение от Hives
|
|
Ваша логика разработки просто нечто.
|
Нормально: сначала на макетке отработал все элементы по-отдельности, потом намалевал общую плату. Потом начал уже писать готовье. На макетке не мог - там всего лишь 64 ноги, а у меня из 100 задействованы 86 (конечно, включая питание и вспомогательные функции типа кварца и т.п.).
Сообщение от _Артём_
|
|
Действительно - STM32F1 не умеет количество байт данных перезагружать
|
Я уже не помню, сколько раз даташит перечитал. Ну не нашел я там таких заподлянок! Видимо, errata надо почитать еще на всякий пожарный.
Сообщение от _Артём_
|
|
Откуда 30 строк?
|
От opencm3. Я уже понял, что на регистрах будет вообще малюська. Буду переделывать на регистры.
Но таки хрен их поймешь: вот только что перечитал даташит на таймеры - ну не должны они глючить, если ты его вырубил, потом загрузил регистры новыми значениями и врубил. А он, с.., глючит!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
15.11.2014, 06:49
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Не таймер глючит, а ваш код глючит... Смотрите отладчиком
|
|
|
|
15.11.2014, 11:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
niXto, да понятно, что код глючит. Почитаю внимательно даташит, составлю на бумажке алгоритм и перепишу на регистрах.
А отладчик - нет уж, спасибки, в такие дебри я лезть не собираюсь!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
15.11.2014, 13:25
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: STM32F103, непонятки с DMA
Что за дебри? Там самое главное - читать подписи к кнопочкам, чтобы не перепутать кнопку "шаг со входом в подпрограммы" с "шаг без входа"... Да в списках меню выбрать мышкой отображение регистров...
Могу даже на скриншоте показать, куда нажимать...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:46.
|
|