STM8. Урок 4. Налаштування таймера 4. Переривання таймера
Вступ
Таймер 4 є найпростішим таймером. Цей таймер є 8-бітним. Єдиний джерело тактування Timer 4 - це частота ЦПУ. У цьому таймері немає блоку порівняння, тому налаштування цього таймера є найпростішим.
Завдання. Видавати меандр з частотою 250кГц за допомогою Timer 4.
Для вирішення цього завдання необхідно викликати обробник переривання таймера з частотою в 2 рази більшою - 500кГц. В обробнику ми інвертуємо сигнал на вибраній ніжці. У якості стенда я використовую налагоджувальну плату Stm8L-Discovery.
Для того щоб запустити таймер, необхідно зробити такі кроки:
- Подати тактовий сигнал на таймер
- Скинути на всякий випадок всі налаштування таймера
- Налаштувати дільник таймера і реєстра автозавантаження. Усі таймери в stm8 працюють в режимі, повністю аналогічному скиданню при збігу (CTC) для контролерів AVR. Частота переповнення таймера розраховується за формулою Ftim4_ovf=FCPU/(TIM4_Prescaler*(1+TIM4_Period))
- Дозволити переривання таймера по переповненню
- Запустити лічильник таймера
- Увімкнути глобальне дозволення переривання
Після цього необхідно в файлі stm8l15x_it.c знайти обробник переривання INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25).
В обробнику переривання записуємо всі необхідні дії, в нашому випадку просто перемикаємо миготінням світлодіодом, і ОБОВ'ЯЗКОВО скидаємо прапор переривання переповнення викликом функції TIM4_ClearITPendingBit(TIM4_IT_Update).
Ось в принципі і все, що потрібно для виконання цього завдання.
Текст програми:
/* Includes ------------------------------------------------------------------*/ #include <stm8l15x.h> void main(void) { // Дільник частоти тактування процесора і периферії CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); // налаштовуємо ніжку контролера на вихід GPIO_Init(GPIOC, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow); // налаштовуємо пін РС4 на вихід частоти процесора, поділеної на 64 CLK_CCOConfig(CLK_CCOSource_HSI, CLK_CCODiv_64); // //------Налаштування таймера-------/// //Включаємо тактування таймера CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE); // На всякий випадок скидаємо всі налаштування таймера TIM4_DeInit(); // налаштовуємо дільник таймера на 256 і обмежуємо лічильник 124 TIM4_TimeBaseInit(TIM4_Prescaler_256, //дильник 124); //Максимальний лічильник //Дозволяємо переривання таймера по переповненню TIM4_ITConfig(TIM4_IT_Update, ENABLE); // Включаємо лічильник TIM4_Cmd(ENABLE); //Включаємо глобальне дозволення переривання enableInterrupts(); /* Безкінечний цикл */ while (1) { } }
Обробник переривання записаний нижче
INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25) { // Інвертуємо вихід пина GPIO_ToggleBits(GPIOC, GPIO_Pin_7); // Скидаємо прапор переривання переповнення TIM4_ClearITPendingBit(TIM4_IT_Update); }
Перевірка результатів.
Для перевірки результатів спершу подивимось частоти роботи процесора і периферії, а потім частоти роботи переривання. Для вимірювання частоти будемо використовувати китайський цифровий аналізатор Saleae Logic. Річ дуже зручна і корисна, яка ще вміє аналізувати різні протоколи роботи.
Для зняття частоти процесора ми запустили функцію CLK_CCOConfig(CLK_CCOSource_HSI, CLK_CCODiv_64), яка подає сигнал з внутрішнього генератора, поділеного на 64, на ніжку PC4.
Як бачимо 16МГц ділимо на 64 і отримуємо 250кГц на ніжці РС4. Все нормально.
А тепер обчислимо частоти інвертування рівня на ніжці РС7. F= 16000000/(256*(1+124))=500кГц. Отже, частота сигналу буде у нас в 2 рази нижчою.
Як бачимо, частота трохи плаває, все ж таки не кварц, але я вважаю, що точність вбудованого генератора дуже хороша.
Прикреплені файли:
- stm8_timer4.rar (375 Кб)