|
|
  |
Tim3 STM32f030 PWM (Решено), Запускается только при отладке |
|
|
|
Oct 8 2015, 10:19
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 8 2015, 10:32
|
Местный
  
Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771

|
может while оптимизировался
Сообщение отредактировал IgorKossak - Oct 8 2015, 15:03
Причина редактирования: бездумное цитирование
--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
|
|
|
|
|
Oct 8 2015, 10:36
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 9 2015, 13:09
|

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

|
Цитата(Golikov A. @ Oct 9 2015, 00:49)  Наверное их сгубило что они в дизасемблер воткнули строчки текста.... Да ничего их не губило. Просто оптимизаторы стали лучше. Сами ведь пишете: Цитата(Golikov A. @ Oct 9 2015, 00:49)  ведь реально текст то не может совпадать до и после оптимизаци.... Вам чего больше хочется - большую и медленную программу или маленькую и быструю?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|