Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

STM32. Урок 4. Basic timers

Речь в сегодняшнем уроке пойдет о таймерах в микроконтроллерах STM32. Таймер – одна из самых полезных вещей в микроконтроллере и основная его задача – отсчитывание точных интервалов времени. На отладочной плате STM32F4 Discovery установлен микроконтроллер STM32F407VG, который имеет следующие таймеры:
Basic timers (TIM6, TIM7) – самый простой таймер, который умеет только генерировать прерывания в заданный промежуток времени, но при этом очень легко настраивается и управляется.
General-purpose timers (TIM2-TIM5, TIM9-TIM14) – более продвинутый таймер, позволяющий генерировать ШИМ, считывать состояние ног, обрабатывать данные от энкодера и т.д.
The advanced-control timers (TIM1, TIM8) – самый продвинутый таймер, может использоваться как трехфазный ШИМ генератор, например для управления трехфазными электродвигателями.

Как понятно из названия, в данной статье будет описываться работа с Basic timers. Следует отметить, что данные таймеры привязаны к шине APB1, поэтому при изменении частоты тактирования данной шины будет меняться скорость работы таймера. По умолчанию частота тактирования составляет 4fкварца, следовательно для STM32F4 Discover с частотой кварца 8МГц частота шины по умолчанию будет 24МГц.

Таймеры в STM32

Практическая задача будет следующая: с помощью Basic timers с интервалом в 1 секунду зажечь все светодиоды на отладочной плате, после чего одновременно потушить их.

Начнем. Первое что нам нужно сделать - инициализировать таймер(TIM6):

 	/*------------------Инициализация TIM6------------------*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
	//По умолчанию частота шины 24 МГц при использовании кварца 8 МГц
	TIM6->PSC = 24000 - 1; //Настройка делителя на 1000 "тиков" в секунду
	TIM6->ARR = 1000; //Отработка прерывания раз в секунду
	TIM6->DIER |= TIM_DIER_UIE; //Разрешения прерывание от таймера
	TIM6->CR1 |= TIM_CR1_CEN; //Запуск таймера
	NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания
	/*------------------------------------------------------*/

Следующий этап – инициализация портов микроконтроллера, к которым подключены светодиоды:

	/*------------------Инициализация портов светодиодов------------------*/
	GPIO_InitTypeDef GPIO_InitStructure; //Структура содержащая настройки порта
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //Включаем тактирование порта D
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; //Выбираем нужные выводы
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Включаем режим выхода
	GPIO_Init(GPIOD, &GPIO_InitStructure); //вызов функции инициализации
	/*--------------------------------------------------------------------*/

Теперь все готово для написания событий, происходящих при срабатывании прерывания по таймеру:

void TIM6_DAC_IRQHandler(void)
{
	TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг прерывания
	if(i==0) GPIO_SetBits(GPIOD, GPIO_Pin_12); //Подаем «1» на PD12
	else if(i==1) GPIO_SetBits(GPIOD, GPIO_Pin_13); //Подаем «1» на PD13
	else if(i==2) GPIO_SetBits(GPIOD, GPIO_Pin_14); //Подаем «1» на PD14
	else if(i==3) GPIO_SetBits(GPIOD, GPIO_Pin_15); //Подаем «1» на PD15
	else if(i==4)GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //Сбрасываем все пины в «0»
	i++; //Наращиваем счетчик
	if(i==5) i=0; //Если i=5, сбрасываем счетчик в "0"
}

Вот и все, теперь можно компилировать проект и прошивать плату. Проект CooCox прикреплен к статье.

Добавлю, что в теле таймера можно добавить обработку кнопок, реализовать временные задержки (если включить прерывание не раз в секунду а раз в миллисекунду) и многое другое. Основное требование – время выполнение кода в цикле таймера не должно превышать время его срабатывания.

На все вопросы отвечу в комментариях. Буду благодарен с пожеланиями тем для будущих уроков.

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 29.10.2014 0 1
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (13) | Я собрал (0) | Подписаться

+1
Evgeniy #
А почему частота таймера будет 24 МГц? При следующих настройках, частота таймера будет 84 МГц:
- кварцевый резонатор - 8 МГц
- HCLK - 168 MHz
- APB1 Prescaller -4
- TIM 2,3,4,5,6,7,12,13,14 - 2
И почему Вы используете для настройки таймера - обращение к регистрам, а для настройки порта - библиотеку?
Ответить
0
demo1420 #
Данные настройки ни коем образом не дают изменения основной частоты тактирования... Я так думаю проект на 100 контроллер.
Ответить
0
Evgeniy #
"На отладочной плате STM32F4 Discovery установлен микроконтроллер STM32F407VG, который имеет следующие таймеры:"... "следовательно для STM32F4 Discover с частотой кварца 8МГц"
Это из текста статьи. Основная частота тактирования - 8 МГц, на таймеры приходит 84 МГц. Проц работает от 168.
А в настроечном файле вообще настроено на кварц 25 МГц...
Ответить
0
Roman #
А можно подробнее про настройку частоты контроллера? А то я так и не понял как настроить нужную частоту...
Ответить
0
RedCat #
Все верно, Автор пишет по умолчанию, попробуйте в кубе включить HSE и ввести опорник 8мгц, тактовая частота не будет равна 168
Ответить
+1
demo1420 #
Автор ОГРОМНАЯ просьба выкладывать проекты БЕЗ использования кириллицы особенно в качестве имени проекта! Я не могу открыть его... Кокс ругается на шрифты!
Ответить
+1
Dmitriy #
Спасибо за статью (не только за эту, за все). Будут ли еще публикации на тему STM?
Ответить
+1
Olegau #
Спасибо за хороший цикл статей. Тоже осваиваю на F4 Discovery среду программирования Coocox. Хотелось бы почитать про подключение и вывод на LCD дисплей ну, скажем, часов реального времени.
Ответить
0
Dekster #
Использую stm32f407vg, плата discovery. Пробовал запускать, работает хорошо, но после отключения питания, видимо, сбрасываются какие-то настройки, выдаёт на ноге какую-то ерунду. И даже стирание программы из памяти не помогает, только если загрузить другой проект. Частотные настройки изменял, но не помогает. Подскажите, пожалуйста, — что происходит?
Ответить
0
Паша #
Хотелось бы про advanced-control timers узнать побольше с примерами
Ответить
0
Денис #
Не работает. Компилиться прошивается и всё. Ничего не мигает. Отладчик останавливается на *pulDest++ = *pulSrc++; в void ResetISR(void) в файле startup.c и все и дальше не дает хода.
Ответить
0
ivan #
Эти настройки таймера у меня работают в STM32f103, а в STM32f407 ve не работают почему?
Ответить
0
shalfey #
У меня всё работает. Настройки даже и на смотрел.ARR значение меняете и светодиоды то медленнее то быстрее бегут. А на регистрах таймер как то нагляднее настраивается.Та SPL там такие заковыристые имена иногда в функциях пишут. В разработчиках SPL наверно поэт сидит.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Паяльная станция Hakko 936 Discovery V8
вверх