research1 0 2 сентября, 2014 Опубликовано 2 сентября, 2014 (изменено) · Жалоба Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом). Других прерываний нет, таймеры остановлены. Библиотеки инициализации все раскопал, частоты тактирования AHB, APB1,2 правильные (72, 36 и 72 МГц соотв.). Из странно, TIM4_Struct.TIM_ClockDivision пробовал 1,2,4. Те же 454 Гц все равно. Подскажите плс., что за грабли. вот инициализация: TIM_TimeBaseInitTypeDef TIM4_Struct; TIM4_Struct.TIM_Prescaler = (7200)-1; //72M / 7200 => 100KHZ freq ...._rcc.c без прескалера, скорость двойная! (шина 36, но тактовая x2) TIM4_Struct.TIM_CounterMode = TIM_CounterMode_Up; TIM4_Struct.TIM_Period = (10); // TIM4_Struct.TIM_ClockDivision = TIM_CKD_DIV1; // TIM4_Struct.TIM_RepetitionCounter = 0; // играет роль только в таймерах 1 и 8 TIM_TimeBaseInit( TIM4 , &TIM4_Struct ); TIM_ITConfig( TIM4 , TIM_IT_Update , ENABLE ); // EI TIM_Cmd( TIM4 , ENABLE ); //Запуск таймера // прерывания TIM4 NVIC_InitTypeDef NVIC_tim4; NVIC_tim4.NVIC_IRQChannel = TIM4_IRQn; NVIC_tim4.NVIC_IRQChannelPreemptionPriority = 1; NVIC_tim4.NVIC_IRQChannelSubPriority = 1; NVIC_tim4.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_tim4); Обработчик: void TIM4_IRQHandler(void) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); GPIOB->ODR ^= GPIO_Pin_8; //переворачиваю лапу } Больше никаких прерываний не включал Изменено 3 сентября, 2014 пользователем gena_p1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 2 сентября, 2014 Опубликовано 2 сентября, 2014 · Жалоба ножку настроили на максимальную частоту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Для начала вставьте проверку флага в обработчик прерывания: if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); GPIOB->ODR ^= GPIO_Pin_8; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Для начала вставьте проверку флага в обработчик прерывания: Похоже эта фраза, так часто повторяемая здесь, скоро станет присказкой, типа "Вы пробовали включить-выключить?"© Неужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
research1 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Лапа в порядке, настроена на 50МГц, программка main() вида while(1){GPIOB->ODR ^= GPIO_Pin_8;}; выдает без проблем ~1.7МГц Разобраться откуда прерывание можно, но их меньше, чем нужно, а не больше. Или есть вероятность замедления и пропуска прерываний из-за повторного входа? Сейчас пересчитал на экселе: 72000000 тактовой / 7200 предделитель /10 период /2 период переворота ножки= 500 Гц (на счет 5кГц я ошибся, сути это не меняет). Осцилл и мультиметр выдают 454 Гц вместо 500. Дергается это все добро, как будто не от кварца работает, и изменение поля TIM_ClockDivision не влияет на частоту, хотя по идее, должно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба еужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR? Да-да... молодёжь уже не та...... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба 10 период Его тоже бы на единичку уменьшить. Иначе 11 получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
research1 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Его тоже бы на единичку уменьшить. Иначе 11 получается. Яростно лайкаю Ваш ответ, похоже так и есть! Специально "особые" величины ставил в скобки, чтобы от расчетной величины единицу отнять. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostyan1 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом). Изначально указали неправильное значение частоты в 5кГц - это 5000Гц, а не 500Гц как вы хотели, то есть разница на порядок! А если разница всего в 6 Гц, то понятно же первым делом поиграться значением периода... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Дергается это все добро, как будто не от кварца работает, и изменение поля TIM_ClockDivision не влияет на частоту, хотя по идее, должно. меня немного смущает желание чтобы нога выставляемая в прерывании была стабильна. Время входа в прерывание имеет некоторый разброс, вроде как. Я понимаю что оно у вас одно, но все же. Там и системный таймер тикает и опять же наши всем любимые ложные срабатывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostyan1 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба А кстати да, выход шим настроить на меандр совсем не вариант? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Если "фаза пляшет, как хочет" и "смотрю осциллом", то вся проблема в "осцилле", или в операторе. Стробоскопический эффект? Попробуйте посмотреть частоту на кварцевом резонаторе, если он есть. Циферки на резонаторе и в осциллографе должны быть одинаковыми. :ph34r: :ph34r: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
research1 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба Мы имеем дело с синхронной системой, с кварцевой стабилизацией. Все разбросы известны, на сколько я понял (вход в прерывание 7 тактов и т.п.). Прерывание системного таймера отключаемое (нашел пару рецептов на зарубежных сайтах, там тоже и ложные срабатывания и косяки с длительностью нахождения и т.п.), будет крутиться как счетчик и опрашиваться, если надо. По идее, если разработка не требует 100% загрузки, то можно сделать синхронную систему, выключив все лишнее. И прерыванием обойтись одним - по таймеру. Остальное опросом готовности. У таймеров есть синхронизация, так, что если надо, чтобы "играли в долю" , все вполне конфигурируемо. А если нет, то я ошибся платформой и, видимо, буду подбирать что-то другое. А кстати да, выход шим настроить на меандр совсем не вариант? Кое что надо опрашивать с частотой не менее 1кГц. Частоту и стабильность проверял через дерганье лапой. Да и ШИМ будет через одно место, если таймер криво настроен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба вход в прерывание не 7 тактов, а до 7 тактов. Это величина различная, хотя конечно на фоне 70 МГц не существенная... Если вы запустите таймер и его выход будет дергаться ШИМом, уверяю вас все будет работать точно и без дерганья, если кварц и ПЛЛ не дергает. Это кстати хороший тест, тем более что у вас есть осциллограф. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 сентября, 2014 Опубликовано 3 сентября, 2014 · Жалоба При 72МГц ядра, 1000Гц частоте прерываний и 7 тактах дрожание фазы получается 7 * 1000 / 72000000 менее 0.01% Это действительно можно увидеть осциллографом? Даже если весь экран (а у меня это 800 точек) заполнить одним периодом сигнала, то дрожание порядка 0.1 пикселя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться