Например TDA7294

Форум РадиоКот • Просмотр темы - Помогите разобраться с таймером в STM32F2xx
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт дек 30, 2025 01:22:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите разобраться с таймером в STM32F2xx
СообщениеДобавлено: Вс дек 23, 2012 11:55:21 
Родился

Зарегистрирован: Пт дек 17, 2010 12:39:55
Сообщений: 6
Рейтинг сообщения: 0
Привет всем. Подскажите как с помощью таймера в stm32 менять состояние вывода микроконтроллера на противоположное с достаточно высокой частотой(порядка 10 МГц)??? Делал вот так:
Код:
#define TIM8_OUT_FREQ 1000000
//Настраивем таймер
void TIM8_Config(void)
{
  uint16_t PrescalerValue; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  //Enable the TIM8 gloabal Interrupt
  NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  //Вычисляем значение предделителя
  PrescalerValue = (uint16_t)((SystemCoreClock / TIM8_OUT_FREQ) - 1);
  //Настраиваем таймер
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 1;                   
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;   
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;     
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);             
  //Prescaler configuration
//  TIM_PrescalerConfig(TIM8, PrescalerValue, TIM_PSCReloadMode_Immediate);     
  //Разрешаем прерывание по обновлению
  TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
  //Врубаем таймер
  TIM_Cmd(TIM8, ENABLE); 
  //Разрешаем обработку прерывания по переполнению счетчика TIM8
  NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);   
}
//Обработчик прерывания
void TIM8_UP_TIM13_IRQHandler()
{
   if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)
   { //Очищаем бит обрабатываемого прерывания
    TIM_ClearITPendingBit(TIM8, TIM_IT_Update);        
    //Инвертируем сомтояние порта
   GPIO_Write(GPIOC, GPIO_ReadOutputData(GPIOC) ^ (GPIO_Pin_6));

   }
}


Работает, но выходная частота не поднимается выше 428,5кГц(???), даже если задаю 1мегагерц, например. А если задаю более низкую частоту(например, 200кГц), то частота на выходе в 4 раза меньше(50кГц). В чем причина?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с таймером в STM32F2xx
СообщениеДобавлено: Вс дек 23, 2012 14:02:56 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 22:21:33
Сообщений: 535
Рейтинг сообщения: 0
Во-первых, убедись, что осциллятор (если он внешний) завелся на нужной частоте. Проверь умножители и делители PLL и убедись, что на выходе нужная частота (если используется PLL). Проверь умножители/делители шин AHB и APB. Убедись, что ты устанавливаешь правильные значения предделителя и счетчика таймера. Убедись, что скорость GPIO установлена правильно и соответствует твоим требованиям. Если все верно, то прерывания должны генерироваться с правильной частотой.

Но все это бессмысленно. Давай прикинем. Какая частота МК? Где-то 120 МГц, да? Значит в лучшем случае на такт будет тратиться порядка 8.3 нс. Прерывания ты хочешь генерировать с частотой 10 МГц, то есть каждые 100 нс. Одна только подготовка к вызову обработчика прерывания в Cortex-M требуют 12 тактов, или 99.6 нс. Я уже не говорю про вызов всяких дурацких функций в прерывании, которые займут намного больше тактов. Так что забудь о программном решении, я уверен, что дергать ножкой можно и аппаратно, почитай внимательно Reference Manual.

Ну и как совет. Люди, перестаньте использовать эти дурацкие библиотеки и драйвера, где простейшие процедуры представляют собой непонятную кашу из кода, занимающую пару экранов. Ну потратьте же немного сил и разберитесь с периферией. Ибо для инвертирования ножки вызывать три функции с несколькими параметрами - это мозг головного рака в чистом виде.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с таймером в STM32F2xx
СообщениеДобавлено: Вс дек 23, 2012 17:23:50 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Режим PWM вам в помощь.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y