вторник, 12 сентября 2017 г.

Вызов подпрограммы по таймеру

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_exti.h"

int main(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Включаем тактирование порта A

   GPIO_InitTypeDef led; // светодиод
   led.GPIO_Speed = GPIO_Speed_50MHz;
   led.GPIO_Mode  = GPIO_Mode_Out_PP;
   led.GPIO_Pin   = GPIO_Pin_0;
   GPIO_Init(GPIOA, &led);

   GPIO_InitTypeDef button; // кнопка
   button.GPIO_Speed = GPIO_Speed_2MHz;
   button.GPIO_Mode  = GPIO_Mode_IPU;
   button.GPIO_Pin   = GPIO_Pin_1;
   GPIO_Init(GPIOA, &button);

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

   TIM_TimeBaseInitTypeDef timer;
   TIM_TimeBaseStructInit(&timer);
   timer.TIM_Prescaler = 7200-1; //устанавливаем делитель частоты основной шины
   timer.TIM_Period = 7200-1;
   timer.TIM_ClockDivision = 0;
   timer.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM2, &timer);

   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM2, ENABLE);  // Включаем таймер

   NVIC_EnableIRQ(TIM2_IRQn); // инициализация прерывания по таймеру

    while(1){}
}

void TIM2_IRQHandler(void) //обработчик прерывания
{
   if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0)
          {
              if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) // проверяем состояние светодиода
              {
                  GPIO_SetBits(GPIOA, GPIO_Pin_0); // зажигаем светодиод
              }
              else
              {
                  GPIO_ResetBits(GPIOA, GPIO_Pin_0); // тушим светодиод
              }
          }
}