реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103. Высокоскоростной таймер
Evgeniyk
сообщение Nov 7 2012, 14:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 5-04-06
Пользователь №: 15 836



Здравствуйте. Пытаюсь завести прерывания по таймеру с частотой 20 МГц. Попытки это сделать успехом не увенчались поэтому я решил попробовать сделать его с максимально возможной частотой. Для этого написал следующий код:

CODE
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 - Nov 7 2012, 20:00
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 7 2012, 15:27
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Вход в прерывание занимает 12 тактов, выход - ещё 12, а максимальная тактовая частота у этого процессора 72 МГц.
Так что с прерываниями осетра придётся урезать раз этак в 10-20.
Для генерации импульсов наружу есть ещё output compare mode, с ним можно получить частоты повыше не нагружая процессор дурной работой.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Evgeniyk
сообщение Nov 8 2012, 06:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 5-04-06
Пользователь №: 15 836



Большое спасибо за информацию! А где можно узнать такие подробности как колличество тактов на прерывания и т.д?
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 8 2012, 06:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



В Cortex-M3 Technical Reference Manual
Еще учитывайте, что выборка инструкций из флеша происходин не за один цикл, для 72МГц в STM32F103 добавляется два цикла ожидания на каждое обращение к флешу, об этом - в даташине на проц.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 8 2012, 08:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Evgeniyk @ Nov 7 2012, 18:25) *
частота на GPIO установлена в 50 МГц т.е он хотябы с этой частотой должен был отработать

Вы глубоко заблуждаетесь. "50 МГц" - это установка крутизны фронтов у выхода и только. Как уже было сказано, учитывая тактовую 72 МГц, у этого МК никогда не будет 50 МГц на выходе (за исключением MCO).
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Nov 8 2012, 17:17
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



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

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

Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 8 2012, 17:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(vlad_new @ Nov 8 2012, 21:17) *
А помоему заблуждаетись Вы. Судя по структурной схеме выходного каскада это именно тактирование внутренних триггеров-защелок ( или регистров ). На крутизну это ни как не влияет.

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016