wojtek327

Untitled

Nov 26th, 2020
426
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stm32f10x.h"
  2.  
  3. #define PinDioda        GPIO_Pin_5
  4. #define PinPrzycisk     GPIO_Pin_13
  5. #define LineDioda       GPIOA
  6. #define LinePrzycisk    GPIOC
  7. #define ClockGPIOA      RCC_APB2Periph_GPIOA
  8. #define ClockGPIOC      RCC_APB2Periph_GPIOC
  9.  
  10. void NVIC_EXTIInit(void);
  11. void GPIOInit(void);
  12. void EXTI15_10_IRQHandler(void);
  13.  
  14. volatile int zapal = 0;
  15.  
  16. int main(void)
  17. {
  18.  GPIOInit();
  19.  NVIC_EXTIInit();
  20.  
  21.  while (1) {
  22.  }
  23. }
  24.  
  25. void NVIC_EXTIInit(void)
  26. {
  27.  EXTI_InitTypeDef EXTIInit;
  28.  NVIC_InitTypeDef NVICInit;
  29.  
  30.  //Wybór konfigurowanego przerwania
  31.  NVICInit.NVIC_IRQChannel = EXTI15_10_IRQn;
  32.  //Priorytet grupowy
  33.  NVICInit.NVIC_IRQChannelPreemptionPriority = 0x00;
  34.  //Podpriorytet
  35.  NVICInit.NVIC_IRQChannelSubPriority = 0x00;
  36.  //Włączenie obsługi
  37.  NVICInit.NVIC_IRQChannelCmd = ENABLE;
  38.  NVIC_Init(&NVICInit);
  39.  
  40.  //Ustawienie źródła przerwania
  41.  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
  42.  
  43.  //EXTI_StructInit(&EXTIInit);
  44.  
  45.  //Wybór linii 13
  46.  EXTIInit.EXTI_Line = EXTI_Line13;
  47.  //Ustawienie generowanego przerwania, możliwe jest wybranie zdarzenia
  48.  EXTIInit.EXTI_Mode = EXTI_Mode_Interrupt;
  49.  //Wyzwolenie zboczem opadającym, bo przycisk zwarty do masy
  50.  EXTIInit.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  51.  //Włączenie przerwania
  52.  EXTIInit.EXTI_LineCmd = ENABLE;
  53.  EXTI_Init(&EXTIInit);
  54. }
  55.  
  56. //Obsługa przerwania
  57. void EXTI15_10_IRQHandler()
  58. {
  59.  //Zidentyfikowanie źródła przerwania
  60.  if (EXTI_GetITStatus(EXTI_Line13) != RESET)
  61.  {
  62.   //Podanie głównego kodu wykonywanego w procedurze obsługi przerwania
  63.   //Jeśli przycisk został wciśnięty
  64.  
  65.   if ((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) && (zapal == 0))
  66.   {
  67.    GPIO_SetBits(GPIOA, GPIO_Pin_5);
  68.    zapal = 1;
  69.   }
  70.   else if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
  71.   {
  72.    GPIO_ResetBits(GPIOA, GPIO_Pin_5);
  73.    zapal = 0;
  74.   }
  75.  
  76.   //Koniec wpisywania głównego kodu wykonywanego w przerwaniu
  77.   //Wyzerowanie flagi obsługi przerwania
  78.   EXTI_ClearITPendingBit(EXTI_Line13);
  79.  }
  80. }
  81.  
  82. //Inicjalizacja pinów dla przycisku i diody
  83. void GPIOInit(void)
  84. {
  85.  GPIO_InitTypeDef GpioInit;
  86.  
  87.  RCC_APB2PeriphClockCmd(ClockGPIOA, ENABLE);
  88.  RCC_APB2PeriphClockCmd(ClockGPIOC, ENABLE);
  89.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  90.  
  91.  GPIO_StructInit(&GpioInit);
  92.  GpioInit.GPIO_Pin = PinDioda;
  93.  GpioInit.GPIO_Mode = GPIO_Mode_Out_PP;
  94.  GPIO_Init(LineDioda, &GpioInit);
  95.  
  96.  GpioInit.GPIO_Pin = PinPrzycisk;
  97.  GpioInit.GPIO_Mode = GPIO_Mode_IPU;
  98.  GPIO_Init(LinePrzycisk, &GpioInit);
  99. }
RAW Paste Data