Проще говоря, таймер – это счетчик, который используется во всех аспектах нашей жизни, например, в качестве будильников, таймеров и т. д. В справочном руководстве STM32 таймеры разделены на три категории, а именно таймеры расширенного управления (TIM1 и TIM8), общие таймеры (TIMx) и базовые таймеры (TIM6 и TIM7). Чтобы изучить таймеры, вы должны знать, как устанавливать частотное деление. Настройки счетчика.
Таймеры расширенного управления (TIM1 и TIM8) состоят из 16-битного счетчика автозагрузки, управляемого программируемым прескалером. Он подходит для различных целей, включая измерение ширины импульса входного сигнала (входной захват) или генерирование выходных сигналов (сравнение выходных сигналов, ШИМ, дополнительная ШИМ со встроенным мертвым временем и т. д.). Используя прескалер таймера и прескалер управления тактовой частотой RCC, ширину импульса и период формы сигнала можно регулировать от нескольких микросекунд до нескольких миллисекунд. Таймеры расширенного управления (TIM1 и TIM8) и таймеры общего назначения (TIMx) полностью независимы и не используют общие ресурсы. Они могут работать синхронно
Таймер общего назначения представляет собой 16-битный счетчик автозагрузки, управляемый программируемым прескалером. Он подходит для различных приложений, включая измерение длины импульса входного сигнала (входной захват) или генерацию выходных сигналов (выходное сравнение и ШИМ). Используя прескалер таймера и прескалер тактового контроллера RCC, длину импульса и период формы сигнала можно регулировать от нескольких микросекунд до нескольких миллисекунд. Каждый таймер полностью независим и не разделяет друг с другом никаких ресурсов. Они могут работать синхронно вместе,
Базовые таймеры TIM6 и TIM7 содержат 16-битный счетчик автозагрузки, управляемый собственным программируемым прескалером. Они могут обеспечивать базу времени в качестве таймера общего назначения, в частности, для обеспечения часов для цифро-аналоговых преобразователей (ЦАП). Фактически, они подключены непосредственно к ЦАП внутри чипа и управляют ЦАП напрямую через триггерный выход. Эти два таймера независимы друг от друга и не используют общие ресурсы.
(1) Время таймера;
(2) Функция подсчета внутри микроконтроллера: CNT, CNT непрерывно накапливается (подсчет вверх) или уменьшается (отсчет);
(3) Рассчитайте время для каждого CNT до +1 или -1. Это время рассчитывается по скорости микроконтроллера, то есть по частоте. Подробности см. на рисунке 1. (Цель прескалера — замедлить скорость)
(4) Диапазон значений счетчика: 0-2^16-1 (0-65535), (16-битный счетчик автоматической загрузки).
(5) Как уменьшить скорость счета и использовать частотное деление. Время, соответствующее 72 МГц, составляет 1/72 = 0,013 мкс. Если скорость 72 МГц используется для счета до 65535, необходимое время составляет около 0,013*65535. (HZ соответствует времени). Соотношения следующие: MHZ-us, KHZ-ms, HZ~s).
(1) Частота самоприращения счетчика составляет 72 МГц. Если вы хотите, чтобы время до +1 было равно 1 мкс, сколько времени потребуется, чтобы досчитать до 65535?
Деление частоты равно 72, а полученная техническая частота равна 1 МГц (1/1 МГц). При счете до 65535 необходимое время составляет 65,535 мс.
(2) Частота самоприращения счетчика составляет 72 МГц. Если вы хотите установить время 500 мс, как вы разделите частоту и как установите максимальное значение счетчика?
Разделение частоты: 720, время для счетчика до +1 каждый раз составляет 10 мкс, а максимальное значение счетчика составляет 50000.
(1) Согласно структурной схеме мы можем знать, что таймер 1 установлен на APB2. На рисунке 2 показан бит открытия, а на рисунке 3 показан бит сброса таймера 1.
(2) Прескалер TIM1 и TIM8 (TIMx_PSC)
(3)Регистр автоматической перезагрузки TIM1 и TIM8 (TIMx_ARR)
(1)timer.c
/*
Функция функция: Настроить таймер 1
Параметры функции: psc прескалер значение перезагрузки
*/
void TIMER1_Init(u16 psc,u16 arr)
{
/*1. Открытые часы*/
RCC->APB2ENR|=1<<11; //Запускаем часы таймера 1
RCC->APB2RSTR|=1<<11;//Запустить таймер1сбросить часы
RCC->APB2RSTR&=~(1<<11);//таймер выключения1сбросить часы
/*2. Настройка основных регистров*/
TIM1->PSC=psc-1;
TIM1->ARR=arr;
TIM1->CR1|=1<<0; //Запускаем таймер 00
}
(2)main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "string.h"
#include "stdio.h"
#include "timer.h"
#include "string.h"
#include "stdlib.h"
int main(void)
{
KEY_Init();
LED_Init();
USARTx_Init(USART1,72,115200);
TIMER1_Init(720,50000);
while(1)
{
if(TIM1->SR&1<<0)
{
LED0=!LED0;
LED1=!LED1;
TIM1->SR&=~(1<<0);
}
}
}
2. Экспериментальные явления
Я участвую в пятом выпуске специального учебного лагеря Tencent Technology Creation 2024 с эссе, получившими награды. Приходите и разделите приз со мной!