Страницы

Страницы

суббота, 26 декабря 2015 г.

STM32 Basic Timer

#include "stm32l1xx.h" //В этом файле заданы все имена регистров периферии 

uint8_t i = 0; //Переменная отображает текущее состояние светодиода - ON/OFF

void TIM6_IRQHandler(void); //Объявление функции обработчика прерывания таймера 6

int main()
{
  //GPIOB init
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN; //Подаем тактовые импульсы в порт B
  GPIOB->MODER |= GPIO_MODER_MODER6_0; //Порт B в режиме "выход"
  GPIOB->OTYPER &= ~GPIO_OTYPER_OT_6; //Выход в режиме "push-pull"
  GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; //Подтягивающие резисторы не используются
  GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; //Скорость работы порта максимальная
  
  NVIC_SetPriority(TIM6_IRQn, 1); //Приоритет прерывания
  NVIC_EnableIRQ(TIM6_IRQn); //Разрешаем обработку прерывания от таймера 6
  
  //TIM6 init
  RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //Подаем тактовые импульсы на таймер 6
  TIM6->PSC = 0xFFFF; //Коэффициент деления максимальный - 65535 + 1
  TIM6->ARR = 0x000F; //Перезагружаемое значение - 16
  TIM6->DIER |= TIM_DIER_UIE; //Разрешаем прерывание при переполнении счетчика
  TIM6->CR1 |= TIM_CR1_CEN; //Запуск счета    
  
  while(1); //Бесконечный цикл. Здесь могла быт ваша программа!
}

 void TIM6_IRQHandler(void) //Функция обработчика прерывания от таймера 6
  {
    TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем бит вызова прерывания. 
    if (i == 0) //Проверяем текущее состояние светодиода - ON/OFF
      GPIOB->BSRRL |= GPIO_BSRR_BS_6; //Зажигаем светодиод
    else
     GPIOB->BSRRH |= GPIO_BSRR_BS_6; //Или гасим светодиод
    i = ~i; //Изменяем переменную, отображающую текушее состояние светодиода
  }

Комментариев нет:

Отправить комментарий