SysTick можно ли с его помощью мигать светодиодом

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Сообщение TmYAG »

Снова здравствуйте!)
Перешел к изучению SysTck
Рассмотрел примеры, в которых на основе этого таймера делается функция задержки. Написал свою программулину-работает. И возник вопрос. Можно ли в прерывании генерируемом этим счетчиком включать LED? Или шпилька будет настолько короткой, что я не увижу как мигает диод?
Грубо говоря написать так:

Код: Выделить всё

void SysTick_Handler(void)
{
  GPIOD->BSRRL |= ( 1<<12 );
}  

int main()
{
  
  RCC->AHB1ENR = RCC_AHB1ENR_GPIODEN;//RCC -название модуля; AHB1ENR -название регистра; GPIODEN -устанавливаемый бит
  
  /*---Конфигурируем GPIO порт D---*/ 
  GPIOD->MODER =0x55000000;/*Регистр установки режима порта вход/выхода для 12, 13, 14, 15 линий порта D
  0x55000000 это шестнадцатеричное представление числа 010101010000000000000000000000,
  где 01 -конфигурация регистра MODER на выход.
  0101 в двоичной системе = 5 в шестнадцатиричной*/
  GPIOD->OTYPER = 0;// Регистр установки режима порта с подтяжкой или открытым коллектором
  GPIOD->OSPEEDR = 0; //Регистр установки скорости работы порта
  SysTick_Config(TimerTick);
  while(1)
  {
  
        GPIOD->BSRRH |= ( 1 << 12 );//Устанавливаем низкий уровень на 12-й линии
        
  }
}
Реклама
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

Легко. Например так:

В главном файле main.c :

Код: Выделить всё


// обьявляем переменную
unsigned int LED_timer; 

// прототип и собственно функция
void SysTick_Timer_main(void);


void SysTick_Timer_main(void)
{
  
  TimeTic++;
   //Если переменная LED_timer еще не дошла до 0,
   if (LED_timer)
   {
    //Проверяем ее значение, если оно больше 5000 включим светодиод
    if (LED_timer>5000)  GPIOE->BSRR= GPIO_BSRR_BS2;
    //иначе если меньше или равно 1500 то выключим
    else GPIOE->BSRR= GPIO_BSRR_BR2;
    //Произведем декремент переменной LED_timer
    LED_timer--;
   }
   //Ели же значение переменной дошло до нуля, зададим новое значение 10000
   else LED_timer=10000;
   
   // Тут написать обработку клавиатуры с защитой от дребезга
   
}

В файле stm32f10x_it.c находим заглушку обработчика и вставляем в него вызов нашей фунции:

Код: Выделить всё


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
  
  SysTick_Timer_main();
 
}



Реклама
Ответить

Вернуться в «ARM»