Введение
Таймер 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 раза ниже.
Как видим частота немного плавает все-таки не кварц, но я считаю что точность встроенного генератора очень хорошая.
Прикрепленные файлы:
- stm8_timer4.rar (375 Кб)
Комментарии (0)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация