Полная версия этой страницы:
Tim3 STM32f030 PWM (Решено)
RadiatoR
Oct 8 2015, 10:19
Всем доброго дня.
Собственно сабж - запускается шим только при отладке. Код:
Код
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
Oct 8 2015, 10:32
может while оптимизировался
RadiatoR
Oct 8 2015, 10:36
(я поправил сообщение - у меня не было указано 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.
Oct 8 2015, 14:45
По пропуску команд, отлаживать по шагам можно только с 0 оптимизацией, иначе код и текст не совпадают. В кейле дефалт - это не 0 оптимизация, а - 1..... Вот...
Сергей Борщ
Oct 8 2015, 16:57
Цитата(Golikov A. @ Oct 8 2015, 17:45)

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

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

ведь реально текст то не может совпадать до и после оптимизаци....
Вам чего больше хочется - большую и медленную программу или маленькую и быструю?
Golikov A.
Oct 9 2015, 13:17
Да я не столько для выражения хотелок, сколько для понимания того что мы увидим если на шару полезем отлаживать.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.