Введение
Таймер 4 является самым простым таймером. Данный таймер является 8-битным. Единственный источник тактирования Timer 4 — это частота ЦПУ. В данном таймере нет блока сравнения, поэтому настройка данного таймера является самой простой.
Задача. Выдавать выдавать меандр с частотой 250кГц с помощью Timer 4.
Для решения данной задачи необходимо вызывать обработчик прерываний таймер с частотой в 2 раза больше 500кГц. В обработчике мы инвертируем сигнал на выбранной ножке. В качестве стенда я использую отладочную плату Stm8L-Discovery.
Для того чтобы запустить таймер необходимо сделать следующие шаги
После этого необходимо в файле 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 раза ниже.
Как видим частота немного плавает все-таки не кварц, но я считаю что точность встроенного генератора очень хорошая.
Прикрепленные файлы:
- stm8_timer4.rar (375 Кб)