|
STM32F4::Discovery -> Помогите с таймером, Что-то с тактовой для TIM6 |
|
|
|
Feb 12 2014, 13:45
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Здравствуйте. Хочу заставить светодиод мигать с тактом 1с. Казалось бы - задача тривиальней некуда. Но я зашел в тупик. Пишу простейший код: CODE #include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_tim.h"
int counter = 0; int flag = 0;
void TIM6_DAC_IRQHandler(void) { /* Так как этот обработчик вызывается и для ЦАП, нужно проверять, * произошло ли прерывание по "переполнению" счётчика таймера TIM6. */ if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) { /* Очищаем бит обрабатываемого прерывания */ TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
flag = 1; } }
int main(void) { // SystemInit();
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD , ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure);
//********************************************** // Настроим таймер TIM RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // включаем тактирование таймера TIM_TimeBaseInitTypeDef base_timer; TIM_TimeBaseStructInit(&base_timer);
/* Делитель учитывается как TIM_Prescaler + 1, поэтому отнимаем 1 */ base_timer.TIM_Prescaler = 16 - 1; base_timer.TIM_Period = 1000-1; base_timer.TIM_ClockDivision = TIM_CKD_DIV1; base_timer.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM6, &base_timer); TIM_ARRPreloadConfig(TIM6, ENABLE);
/* Разрешаем прерывание по обновлению (в данном случае - * по переполнению) счётчика таймера TIM6. */ TIM_ClearITPendingBit(TIM6, TIM_IT_Update); TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); TIM_Cmd(TIM6, ENABLE); // Включаем таймер
/* Разрешаем обработку прерывания по переполнению счётчика * таймера TIM6. это же прерывание * отвечает и за опустошение ЦАП. */ NVIC_SetPriority(TIM6_DAC_IRQn, 15); NVIC_EnableIRQ(TIM6_DAC_IRQn); //**********************************************
while(1) { // отсчитываем каждые 1000 тактов таймера и переключаем светодиод if( flag == 1 ) { if(counter == 0) { GPIO_SetBits(GPIOD, GPIO_Pin_12); } counter++; if(counter == 1000) { GPIO_ResetBits(GPIOD, GPIO_Pin_12); } if(counter == 2000) { counter = 0; } flag = 0; } } } - мигает как надо. Но здесь параметры: base_timer.TIM_Prescaler = 16 - 1; и base_timer.TIM_Period = 1000-1;, т.е. получается, что частота тактирования = 16МГц. Это можно объяснить тем, что идет тактирование от внутреннего генератора (8МГц), но с удвоенной частотой (это, типа, из-за использования предделителей, не равных 1 на шине АРВ1). Но так-то я раситывал на 168МГц. Пробовал с разными коэффициентами - полная ерунда. Если я раскомментирую строчку Код // SystemInit(); , то светик мигает почти с тактом в 1 сек, но "ПОЧТИ"=чуть-чуть быстрее. В чем может быть моя неправда? Ткните носом, ПЛЗ. Или объясните матчасть (может все так и должно быть  ). ИМХО, кварц может глючит? (но проверить нечем, нет никаких девайсов)
Сообщение отредактировал IgorKossak - Feb 12 2014, 14:29
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Feb 13 2014, 08:59
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Кстати, нашел еще один параметр, который надо поменять под свой внешний кварц: #define PLL_M 25, нужно сделать 8. Цитата(ViKo @ Feb 13 2014, 12:35)  Не совсем... Так, немного подсоберу все в одну картину: 1. В функции SystemInit() происходит настройка частот системы и PLL на 168МГц(при работе с внешним кварцем), при условии установки правильных дефайнов (HSE_VALUE, PLL_M, и может еще каких..). 2. Если в настройках PLL параметр prescaler не равен 1, то таймеры (на шинах APBx) тактируются удвоенной частотой, иначе НЕудвоенной(прямой). 3. В случае, если мы не используем функцию SystemInit(), то мы не запускаем PLL (если, конечно, отдельно не прописали этот запуск), и следовательно: частота у нас используется внутренняя (16МГц), а таймеры тактируются тоже этой же частотой 16МГц (не удвоенной, т.к. PLL-prescaler в коде не был установлен). Я правильно рассуждаю?
|
|
|
|
Сообщений в этой теме
billidean STM32F4::Discovery -> Помогите с таймером Feb 12 2014, 13:45 ViKo Не вижу установки делителей для тактов периферийны... Feb 12 2014, 14:04 billidean В SystemInit() - вроде какие-то предделители устан... Feb 12 2014, 14:11 ViKo Цитата(billidean @ Feb 12 2014, 17:11) В ... Feb 12 2014, 14:16 billidean В systemInit() dspsdftncz SetSysClock(), код котор... Feb 12 2014, 14:29 ViKo Получается, на периферийной шине у вас 168 / 4 = 4... Feb 12 2014, 14:39 billidean При установке base_timer.TIM_Prescaler = (42-1) и ... Feb 12 2014, 14:51 Thorn На кварце нагрузочные конденсаторы имеются? Емкост... Feb 12 2014, 17:34 Golikov A. а где вы включаете внешний генератор, подключаете ... Feb 12 2014, 17:39 ViKo Можно вывести на светодиод бит SWS1 из RCC_CFGR, ч... Feb 12 2014, 17:50 Golikov A. а еще не забыть настроить выходную ножку на максим... Feb 12 2014, 17:58 ViKo Цитата(Golikov A. @ Feb 12 2014, 20:58) а... Feb 12 2014, 18:01 billidean Цитата(Golikov A. @ Feb 12 2014, 21:39) в... Feb 13 2014, 03:06 Golikov A. ага добро пожаловать в мир СТМ, не хрена это не оп... Feb 13 2014, 06:11 billidean Вы про stm32f4xx.h-файл?
Там всякие определения/ра... Feb 13 2014, 06:44 Golikov A. ага про него. Посмотрите какой проц в итоге опреде... Feb 13 2014, 06:50 ViKo Да, есть полное соответствие. Ничего больше опреде... Feb 13 2014, 06:53 billidean Цитата(ViKo @ Feb 13 2014, 10:53) Да, ест... Feb 13 2014, 07:10  ViKo Цитата(billidean @ Feb 13 2014, 10:10) А ... Feb 13 2014, 07:30   billidean Цитата(ViKo @ Feb 13 2014, 11:30) В руков... Feb 13 2014, 08:06    ViKo Цитата(billidean @ Feb 13 2014, 11:06) Да... Feb 13 2014, 08:35 billidean ...да... вместо PLL-prescaler нужно понимать presc... Feb 13 2014, 09:27 topkin Конфигурация тактовой частоты и первоначальных нас... Feb 13 2014, 10:17 Golikov A. а откуда берется двойная частота без PLL? это скор... Feb 13 2014, 10:32 billidean Цитата(Golikov A. @ Feb 13 2014, 13:32) а... Feb 13 2014, 10:46 Golikov A. я просто пытался обратить ваше внимание на то что ... Feb 13 2014, 11:08 ViKo Цитата(Golikov A. @ Feb 13 2014, 14:08) я... Feb 13 2014, 11:59 Golikov A. ну типа того, в общем периферия системную частоту ... Feb 13 2014, 12:15 billidean Тут нарыл в даташите:
- это к вопросу удвоения ч... Feb 13 2014, 14:00 Golikov A. забудьте вы про умножение частоты)... нет его там,... Feb 13 2014, 15:46 billidean Цитата(Golikov A. @ Feb 13 2014, 18:46) з... Feb 13 2014, 15:52 Golikov A. не очень понятно падает она теперь или нет, но есл... Feb 13 2014, 16:10 billidean Цитата(Golikov A. @ Feb 13 2014, 19:10) н... Feb 14 2014, 04:30 ViKo Мне кажется с самого начала, что кварцевый генерат... Feb 13 2014, 17:16 billidean А теперь самое ИНТЕРЕСНОЕ:
Вот код моей программки... Feb 14 2014, 06:58 Golikov A. тут есть хитрость в мануале написано что типа вас ... Feb 14 2014, 07:18 ViKo Назовем,
Из жизни. Женщина установила спираль, чт... Feb 14 2014, 07:40 billidean Цитататут есть хитрость..
Вы вот это имеете в виду... Feb 14 2014, 07:49 ViKo Цитата(billidean @ Feb 14 2014, 10:49) пр... Feb 14 2014, 08:00 Golikov A. ну да.
все вам и написали
на домен не может быть б... Feb 14 2014, 08:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|