STM8. Урок 4. Налаштування таймера 4. Переривання таймера

Вступ

Таймер 4 є найпростішим таймером. Цей таймер є 8-бітним. Єдиний джерело тактування Timer 4 - це частота ЦПУ. У цьому таймері немає блоку порівняння, тому налаштування цього таймера є найпростішим.

Завдання. Видавати меандр з частотою 250кГц за допомогою Timer 4.

Для вирішення цього завдання необхідно викликати обробник переривання таймера з частотою в 2 рази більшою - 500кГц. В обробнику ми інвертуємо сигнал на вибраній ніжці. У якості стенда я використовую налагоджувальну плату Stm8L-Discovery.

Для того щоб запустити таймер, необхідно зробити такі кроки:

  1. Подати тактовий сигнал на таймер
  2. Скинути на всякий випадок всі налаштування таймера
  3. Налаштувати дільник таймера і реєстра автозавантаження. Усі таймери в stm8 працюють в режимі, повністю аналогічному скиданню при збігу (CTC) для контролерів AVR. Частота переповнення таймера розраховується за формулою Ftim4_ovf=FCPU/(TIM4_Prescaler*(1+TIM4_Period))
  4. Дозволити переривання таймера по переповненню
  5. Запустити лічильник таймера
  6. Увімкнути глобальне дозволення переривання 

Після цього необхідно в файлі 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 рази нижчою.

Як бачимо, частота трохи плаває, все ж таки не кварц, але я вважаю, що точність вбудованого генератора дуже хороша.

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

Top