реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Tim3 STM32f030 PWM (Решено), Запускается только при отладке
RadiatoR
сообщение Oct 8 2015, 10:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Всем доброго дня.
Собственно сабж - запускается шим только при отладке. Код:
Код
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. То есть реально она выполняется, но на нее курсор даже не доходит. пользуюсь обычной пошаговой. Почему так? Ну и другие некоторые команды тоже проскакивают.

Сообщение отредактировал ЯadiatoR - Oct 8 2015, 11:40
Go to the top of the page
 
+Quote Post
Realking
сообщение Oct 8 2015, 10:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771



может while оптимизировался

Сообщение отредактировал IgorKossak - Oct 8 2015, 15:03
Причина редактирования: бездумное цитирование


--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Oct 8 2015, 10:36
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



(я поправил сообщение - у меня не было указано 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 таймер.

Сообщение отредактировал ЯadiatoR - Oct 8 2015, 11:41
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 8 2015, 14:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



По пропуску команд, отлаживать по шагам можно только с 0 оптимизацией, иначе код и текст не совпадают. В кейле дефалт - это не 0 оптимизация, а - 1..... Вот...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 8 2015, 16:57
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Oct 8 2015, 17:45) *
иначе код и текст не совпадают.
Поэтому отлаживать надо по дизассемлерному тексту.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 8 2015, 17:32
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Это разные отладки. Не будете же вы отрицать удобство когда вы видите действие прямо строчек кода на языке более высокого уровня, нежели просто дизасемблер. Или вы про дизасемблер с подписями имен функций и текста программы? Так в кейле странно сделано что при оптимизации этот код не отражает реальности, по нему реально при пошаговом движении летает указатель, и еще переменные половина пропадает..... Реальная построчная отладка без 0 оптимизации в кейле сильно затруднена....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 8 2015, 18:25
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Не знаю как сейчас, а 15 лет назад у Кейла с отладкой по дизассемблеру проблем не было. Открываем два окна, в одном отладка по исходнику, во втором по дизасемблеру. Интересующие участки ходим по дизассемблеру, во втором окне наблюдая движение указателя по строкам исходника. Подробностей уже не помню. В ИАРе, AVR Studio 4 и Eclipse аналогично, с другими не работал.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 8 2015, 21:49
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Воооот.... значит и меня не глючило....
Давно не отлаживал ж-тагом, а тут года 3 назад столкнулся и обнаружил что в Кейле, так все выглядит только если 0 оптимизация....

У него теперь диазасемблер с текстом совмещен, рядом окно с исходниками, но если включена оптимизация то указатель текущей строки летает по этому коду черти как, и делает в целом не то что написано... Я как-то смотрел на это и думал, ведь было же не так!!! Потом подумал что давно дело было и показалось, ведь реально текст то не может совпадать до и после оптимизаци.... Наверное их сгубило что они в дизасемблер воткнули строчки текста....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2015, 13:09
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Вам чего больше хочется - большую и медленную программу или маленькую и быструю? wink.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 9 2015, 13:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Да я не столько для выражения хотелок, сколько для понимания того что мы увидим если на шару полезем отлаживать.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016