STM32. Урок 4. Основні таймери
Мова в сьогоднішньому уроці піде про таймери в мікроконтролерах STM32. Таймер – одна з найкорисніших речей у мікроконтролері, і основне його завдання – відлічування точних інтервалів часу. На відладочній платі STM32F4 Discovery встановлений мікроконтролер STM32F407VG, який має наступні таймери:
Basic timers (TIM6, TIM7) – найпростіший таймер, який вміє лише генерувати переривання в заданий проміжок часу, але при цьому дуже легко налаштовується та управляється.
General-purpose timers (TIM2-TIM5, TIM9-TIM14) – більш просунутий таймер, що дозволяє генерувати ШІМ, зчитувати стан ніжок, обробляти дані від енкодера тощо.
Advanced-control timers (TIM1, TIM8) – найсучасніший таймер, може використовуватися як трифазний ШІМ генератор, наприклад, для управління трифазними електродвигунами.
Як зрозуміло з назви, в цій статті буде описуватися робота з Basic timers. Слід зазначити, що ці таймери прив'язані до шини APB1, тому при зміні частоти тактування цієї шини буде змінюватися швидкість роботи таймера. За замовчуванням частота тактування становить 4fкварца, отже, для STM32F4 Discovery з частотою кварца 8МГц частота шини за замовчуванням буде 24МГц.
Практична задача буде наступною: за допомогою 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 прикріплений до статті.
Додам, що в тілі таймера можна додати обробку кнопок, реалізувати тимчасові затримки (якщо включити переривання не раз в секунду, а раз в мілісекунду) і багато іншого. Основна вимога – час виконання коду в циклі таймера не повинен перевищувати час його спрацьовування.
На всі питання відповім у коментарях. Буду вдячний за побажання тем для майбутніх уроків.
Прикреплені файли:
- STM32F407VG.pdf (5427 Кб)
- Урок_4.rar (172 Кб)