XShadow 0 7 ноября, 2012 Опубликовано 7 ноября, 2012 (изменено) · Жалоба Здравствуйте. Пытаюсь завести прерывания по таймеру с частотой 20 МГц. Попытки это сделать успехом не увенчались поэтому я решил попробовать сделать его с максимально возможной частотой. Для этого написал следующий код: void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 1; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* TIM IT enable */ TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* TIM enable counter */ TIM_Cmd(TIM1, ENABLE); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM_ADC global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM_ADC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void TIM1_UP_IRQHandler(void) { if (TIM_ADC->SR & TIM_SR_UIF) { TIM_ADC->SR &= ~TIM_SR_UIF; HSO_ADC_PORT->BSRR = HSO_ADC_CLK; //нога в единицу HSO_ADC_PORT->BRR = HSO_ADC_CLK; //нога в ноль } } int main(void) { /* NVIC configuration */ NVIC_Configuration(); /* Timer configuration */ TIM_Configuration(); while (1) { } } Проблема в том что период следования импульсов получился около 520ns. (частота на GPIO установлена в 50 МГц т.е он хотябы с этой частотой должен был отработать). В чем может быть проблема? Как заставить таймер работать от нужной частоты? Изменено 7 ноября, 2012 пользователем IgorKossak [codebox] для длинного кода!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 7 ноября, 2012 Опубликовано 7 ноября, 2012 · Жалоба Вход в прерывание занимает 12 тактов, выход - ещё 12, а максимальная тактовая частота у этого процессора 72 МГц. Так что с прерываниями осетра придётся урезать раз этак в 10-20. Для генерации импульсов наружу есть ещё output compare mode, с ним можно получить частоты повыше не нагружая процессор дурной работой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
XShadow 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба Большое спасибо за информацию! А где можно узнать такие подробности как колличество тактов на прерывания и т.д? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба В Cortex-M3 Technical Reference Manual Еще учитывайте, что выборка инструкций из флеша происходин не за один цикл, для 72МГц в STM32F103 добавляется два цикла ожидания на каждое обращение к флешу, об этом - в даташине на проц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба частота на GPIO установлена в 50 МГц т.е он хотябы с этой частотой должен был отработать Вы глубоко заблуждаетесь. "50 МГц" - это установка крутизны фронтов у выхода и только. Как уже было сказано, учитывая тактовую 72 МГц, у этого МК никогда не будет 50 МГц на выходе (за исключением MCO). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба Вы глубоко заблуждаетесь. "50 МГц" - это установка крутизны фронтов у выхода и только. Как уже было сказано, учитывая тактовую 72 МГц, у этого МК никогда не будет 50 МГц на выходе (за исключением MCO). А помоему заблуждаетись Вы. Судя по структурной схеме выходного каскада это именно тактирование внутренних триггеров-защелок ( или регистров ). На крутизну это ни как не влияет. И в этом многие могли убедиться у кого есть хороший осциллограф. К тому же, из той же структурной схемы видно, что в альтернативном варианте выходные ключи вообще минуют триггера (регистры), а потому частота там может быть и выше 50 Мгц. Ну это теоретически, поскольку фиг его знает как там и что дальше тактируется в альтернативном режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба А помоему заблуждаетись Вы. Судя по структурной схеме выходного каскада это именно тактирование внутренних триггеров-защелок ( или регистров ). На крутизну это ни как не влияет. Не гадайте на картинках, а читайте руководства. А именно таблицу "I/O AC Characteristics" в даташите. Там всё исчерпывающе изложено, причём со ссылкой на руководство по МК и тот самый регистр, который настраивает "2/10/50 МГц". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться