Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Tim3 STM32f030 PWM (Решено)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
RadiatoR
Всем доброго дня.
Собственно сабж - запускается шим только при отладке. Код:
Код
void Tim3_init(void)// 24 MHz clock, 200 Hz int
    {
        RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
        TIM3->PSC = 1200 - 1; //Prescaler
        TIM3->CCMR1|=TIM_CCMR1_OC1PE|TIM_CCMR1_OC2PE;// Preload (shadow) registers for CCR1, CCR2 - compare registers (analog OCRA, OCRB)
        TIM3->CCER|=TIM_CCER_CC1E|TIM_CCER_CC2E;// Signal is output on the corresponding output pin.
        TIM3->CCER|=TIM_CCER_CC1P;// Chan 1 active low.
        TIM3->ARR = 100; // Auto reload value - val, when timer reloads to 0!!.
        TIM3->CR2|=TIM_CR2_MMS_1;// For ADC start point on timer refresh
        TIM3->CR1 |= TIM_CR1_CEN; // Enable clock
    }
    
    int main(void)
    {
        Tim3_init();// PWM Timer
        TIM3->CCR1=30;// Compare register 1 0-100 %
        TIM3->CCMR1|=TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1;// PWM mode 1
        while(1);
    }


Без отладки - никакой рекции, хотя инверсный выход инициализируется правильно

Что может быть за фигня? В errata пусто

ps. Причем если во время отладки довести до while цикла - пойдут импульсы как и должны, далее выйти из отладки и импульсы пропадают.
Кстати еще вопросик не в тему - почему в отладке (кеил) иногда проскакивает команды? Например у меня всегда проскакивает дебаг команды TIM3->PSC = 1200 - 1; //Prescaler. То есть реально она выполняется, но на нее курсор даже не доходит. пользуюсь обычной пошаговой. Почему так? Ну и другие некоторые команды тоже проскакивают.
Realking
может while оптимизировался
RadiatoR
(я поправил сообщение - у меня не было указано TIM3->CCR1=30)
нее, в процессе отладки у меня все работает. Как только я дохожу до предпоследней строки (перед вайл - все начинает работать). Ну и цикл соответственно нормально себя ведет в отладке тупо вися на 1 строке

PS! Нашел странность - после того, как все заработало и пошагово я выполняю while(1) - все продолжает работать. но как только я тыкаю Run (F5) - импульсы пропадают

PPS. В регистре TIM3->CCMR1 есть 3 бита, отвечающие за режим 1 и 2 каналов. При инициализации они в нуле - это значит, что channel 1 и 2 не активны (с референса это статус Frozen). Так вот, я устанавливаю перед while эти биты в 0x06 - режим PWM1. Далее вхожу в цикл while и если выполнять в нем пошагово - то все ок, но если врубить Run, то 3 бита TIM3->CCMR1 изменятся сами на 0х04!!!, что соответствует режиму 0b100 - Force inactive level - OC1REF is forced low. Что это за приклолы такие?
Причем эти 3 бита меняются на обоих!! каналах, хотя 2 канал я вообще не трогал


Решено - у меня в глубокой .. прерывании одного из таймеров вырубался PWM таймер.
Golikov A.
По пропуску команд, отлаживать по шагам можно только с 0 оптимизацией, иначе код и текст не совпадают. В кейле дефалт - это не 0 оптимизация, а - 1..... Вот...
Сергей Борщ
Цитата(Golikov A. @ Oct 8 2015, 17:45) *
иначе код и текст не совпадают.
Поэтому отлаживать надо по дизассемлерному тексту.
Golikov A.
Это разные отладки. Не будете же вы отрицать удобство когда вы видите действие прямо строчек кода на языке более высокого уровня, нежели просто дизасемблер. Или вы про дизасемблер с подписями имен функций и текста программы? Так в кейле странно сделано что при оптимизации этот код не отражает реальности, по нему реально при пошаговом движении летает указатель, и еще переменные половина пропадает..... Реальная построчная отладка без 0 оптимизации в кейле сильно затруднена....
Сергей Борщ
Не знаю как сейчас, а 15 лет назад у Кейла с отладкой по дизассемблеру проблем не было. Открываем два окна, в одном отладка по исходнику, во втором по дизасемблеру. Интересующие участки ходим по дизассемблеру, во втором окне наблюдая движение указателя по строкам исходника. Подробностей уже не помню. В ИАРе, AVR Studio 4 и Eclipse аналогично, с другими не работал.
Golikov A.
Воооот.... значит и меня не глючило....
Давно не отлаживал ж-тагом, а тут года 3 назад столкнулся и обнаружил что в Кейле, так все выглядит только если 0 оптимизация....

У него теперь диазасемблер с текстом совмещен, рядом окно с исходниками, но если включена оптимизация то указатель текущей строки летает по этому коду черти как, и делает в целом не то что написано... Я как-то смотрел на это и думал, ведь было же не так!!! Потом подумал что давно дело было и показалось, ведь реально текст то не может совпадать до и после оптимизаци.... Наверное их сгубило что они в дизасемблер воткнули строчки текста....
Сергей Борщ
Цитата(Golikov A. @ Oct 9 2015, 00:49) *
Наверное их сгубило что они в дизасемблер воткнули строчки текста....
Да ничего их не губило. Просто оптимизаторы стали лучше. Сами ведь пишете:
Цитата(Golikov A. @ Oct 9 2015, 00:49) *
ведь реально текст то не может совпадать до и после оптимизаци....

Вам чего больше хочется - большую и медленную программу или маленькую и быструю? wink.gif
Golikov A.
Да я не столько для выражения хотелок, сколько для понимания того что мы увидим если на шару полезем отлаживать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.