На STM32F103 использую таймер 2 для счета миллисекундных импульсов. Данный код работает правильно.
#include <LiquidCrystal.h>
LiquidCrystal lcd (PA9, PA8, PB15, PB14, PB13, PB12); //(RS,E,D4,D5,D6,D7)
uint32_t Tay_ind = 1000000;
uint32_t time_new_ind,time_old_ind,time_del_ind;
void setup()
{
lcd.begin(20, 4);
//-------------------------------------------------------------------------//
// Включаем тактирование TIM2
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// Настройка TIM2 для счета миллисекунд
TIM2->CR1 = 0; // Остановка таймера
TIM2->PSC = 47999; // Предделитель 48000 (48 МГц / 48000 = 1 кГц)
TIM2->ARR = 0xFFFF; // Автоперезагрузка на максимум (16 бит)
TIM2->EGR = 1; // Обновление регистров
TIM2->CR1 |= (1 << 0); // Запуск TIM2
//-------------------------------------------------------------------------//
}
void loop()
{
time_new_ind= micros();
time_del_ind=time_new_ind-time_old_ind;
if (time_del_ind>=Tay_ind)
{
//-----------------------------------------------------------------------//
uint32_t milliseconds = TIM2->CNT;
//-----------------------------------------------------------------------//
lcd.clear();
lcd.setCursor(0, 0);lcd.print("T= ");lcd.print(millis());
lcd.setCursor(0, 1);lcd.print("N= ");lcd.print(milliseconds);
time_old_ind=time_new_ind;
}
}
Теперь пытаюсь заставить работать таймер 2 от внешних импульсов подаваемых на вход PA0. Но таймер не хочет считать.
Просьба подсказать где ошибка. В строках с 8 по 25.
#include <LiquidCrystal.h>
LiquidCrystal lcd (PA9, PA8, PB15, PB14, PB13, PB12); //(RS,E,D4,D5,D6,D7)
uint32_t Tay_ind = 1000000;
uint32_t time_new_ind,time_old_ind,time_del_ind;
void setup()
{
lcd.begin(20, 4);
//-------------------------------------------------------------------------//
// Включаем тактирование порта A
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// Настраиваем PA0 на вход (режим альтернативной функции, вход таймера TI1)
GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0); // Очищаем биты MODE0 и CNF0
GPIOA->CRL |= GPIO_CRL_CNF0_1; // Настраиваем PA0 как вход с плавающим состоянием (Input floating)
// Сбрасываем настройки таймера
TIM2->CR1 = 0; // Отключаем таймер
TIM2->PSC = 47999; // Предделитель 48000 (48 МГц / 48000 = 1 кГц)
TIM2->ARR = 0xFFFF; // Регистр автоперезагрузки на максимум
// Настраиваем таймер на счет по внешнему сигналу
TIM2->SMCR = 0; // Сбрасываем регистр SMCR
TIM2->SMCR |= TIM_SMCR_SMS_2; // Режим внешнего тактирования (External Clock Mode 1)
TIM2->SMCR |= TIM_SMCR_TS_2 | TIM_SMCR_TS_0; // Источник тактирования - TI1 (PA0)
// Генерируем событие обновления для применения настроек
TIM2->EGR = TIM_EGR_UG;
TIM2->CR1 |= TIM_CR1_CEN; // Запуск TIM2
//-------------------------------------------------------------------------//
}
void loop()
{
time_new_ind= micros();
time_del_ind=time_new_ind-time_old_ind;
if (time_del_ind>=Tay_ind)
{
//-----------------------------------------------------------------------//
uint32_t milliseconds = TIM2->CNT;
//-----------------------------------------------------------------------//
lcd.clear();
lcd.setCursor(0, 0);lcd.print("T= ");lcd.print(millis());
lcd.setCursor(0, 1);lcd.print("N= ");lcd.print(milliseconds);
time_old_ind=time_new_ind;
}
}