STM32F103 программирование таймера

На 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;
  }
}
1 лайк

Тут ошибка

1 лайк

Спасибо. Поправил Вроде все работает.

//stm32f103 счетчик внешних импульсов. Частоту подаем на вывод PA0
#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);
  //-------------------------------------------------------------------------//
    // 1. Включение тактирования GPIOA и TIM2
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Включаем тактирование GPIOA
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Включаем тактирование TIM2
    // 2. Настройка PA0 на вход (режим альтернативной функции, вход таймера TI1)
    GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0); // Очищаем биты MODE0 и CNF0
    GPIOA->CRL |= GPIO_CRL_CNF0_1; // Настраиваем PA0 как вход с плавающим состоянием (Input floating)
    GPIOA->ODR |= GPIO_ODR_ODR0; // Включаем внутренний подтягивающий резистор (pull-up)
    // 3. Сбрасываем настройки таймера
    TIM2->CR1 = 0; // Отключаем таймер
    TIM2->PSC = 0; // Предделитель = 1 (не используем предделитель)
    TIM2->ARR = 0xFFFF; // Регистр автоперезагрузки на максимум
    TIM2->CCER &= ~TIM_CCER_CC1P;  // Полярность: считаем по фронту 
    // 4. Настраиваем таймер на счет по внешнему сигналу
    TIM2->SMCR = 0; // Сбрасываем регистр SMCR
    TIM2->SMCR |= TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // Режим External Clock Mode 1
    TIM2->SMCR |= TIM_SMCR_TS_2 | TIM_SMCR_TS_0; // Источник тактирования - TI1 (PA0)
    // 5. Генерируем событие обновления для применения настроек
    TIM2->EGR = TIM_EGR_UG;
    // 6. Запуск TIM2
    TIM2->CR1 |= TIM_CR1_CEN; // Включаем таймер
  //-------------------------------------------------------------------------//
}
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;
  }
}