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();

    /* 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 раза ниже.

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

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

    Добавить комментарий

    Ваш адрес email не будет опубликован.