#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; //Изменяем переменную, отображающую текушее состояние светодиода
}
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; //Изменяем переменную, отображающую текушее состояние светодиода
}
Комментариев нет:
Отправить комментарий