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();  /* Infinite loop */   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 раза ниже.

Как видим частота немного плавает все-таки не кварц, но я считаю что точность встроенного генератора очень хорошая.