Перейти к содержанию
    

STM32F103. Высокоскоростной таймер

Здравствуйте. Пытаюсь завести прерывания по таймеру с частотой 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 МГц т.е он хотябы с этой частотой должен был отработать). В чем может быть проблема? Как заставить таймер работать от нужной частоты?

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вход в прерывание занимает 12 тактов, выход - ещё 12, а максимальная тактовая частота у этого процессора 72 МГц.

Так что с прерываниями осетра придётся урезать раз этак в 10-20.

Для генерации импульсов наружу есть ещё output compare mode, с ним можно получить частоты повыше не нагружая процессор дурной работой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за информацию! А где можно узнать такие подробности как колличество тактов на прерывания и т.д?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Cortex-M3 Technical Reference Manual

Еще учитывайте, что выборка инструкций из флеша происходин не за один цикл, для 72МГц в STM32F103 добавляется два цикла ожидания на каждое обращение к флешу, об этом - в даташине на проц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

частота на GPIO установлена в 50 МГц т.е он хотябы с этой частотой должен был отработать

Вы глубоко заблуждаетесь. "50 МГц" - это установка крутизны фронтов у выхода и только. Как уже было сказано, учитывая тактовую 72 МГц, у этого МК никогда не будет 50 МГц на выходе (за исключением MCO).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы глубоко заблуждаетесь. "50 МГц" - это установка крутизны фронтов у выхода и только. Как уже было сказано, учитывая тактовую 72 МГц, у этого МК никогда не будет 50 МГц на выходе (за исключением MCO).

А помоему заблуждаетись Вы. Судя по структурной схеме выходного каскада это именно тактирование внутренних триггеров-защелок ( или регистров ). На крутизну это ни как не влияет. И в этом многие могли убедиться у кого есть хороший осциллограф. К тому же, из той же структурной схемы видно, что в альтернативном варианте выходные ключи вообще минуют триггера (регистры), а потому частота там может быть и выше 50 Мгц. Ну это теоретически, поскольку фиг его знает как там и что дальше тактируется в альтернативном режиме.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А помоему заблуждаетись Вы. Судя по структурной схеме выходного каскада это именно тактирование внутренних триггеров-защелок ( или регистров ). На крутизну это ни как не влияет.

Не гадайте на картинках, а читайте руководства. А именно таблицу "I/O AC Characteristics" в даташите. Там всё исчерпывающе изложено, причём со ссылкой на руководство по МК и тот самый регистр, который настраивает "2/10/50 МГц".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...