gpio.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "stm32f0xx_hal.h"
  2. #include "gpio.h"
  3. #define SET_OUT_1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)
  4. #define SET_OUT_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET)
  5. #define SET_OUT_3 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET)
  6. #define SET_OUT_4 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET)
  7. #define RESET_OUT_1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)
  8. #define RESET_OUT_2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET)
  9. #define RESET_OUT_3 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET)
  10. #define RESET_OUT_4 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET)
  11. static uint8_t next_out_number = 0;
  12. static uint8_t current_out_number = 0;
  13. //
  14. void gpio_init(void)
  15. {
  16. GPIO_InitTypeDef GPIO_InitStruct = {0};
  17. __HAL_RCC_GPIOA_CLK_ENABLE();
  18. __HAL_RCC_GPIOB_CLK_ENABLE();
  19. GPIO_InitStruct.Pin = GPIO_PIN_12;
  20. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  21. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  22. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  23. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  24. GPIO_InitStruct.Pin = GPIO_PIN_12;
  25. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  26. // GPIO_PIN_5 - инфракрасный LED
  27. GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4;
  28. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  29. // LED - индикация входного сигнала
  30. GPIO_InitStruct.Pin = GPIO_PIN_2;
  31. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  32. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
  33. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
  34. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4, GPIO_PIN_RESET);
  35. }
  36. //
  37. void gpio_set_output(bool state)
  38. {
  39. if (state == true)
  40. {
  41. current_out_number = next_out_number;
  42. switch (next_out_number)
  43. {
  44. case 0:
  45. SET_OUT_1;
  46. break;
  47. case 1:
  48. SET_OUT_2;
  49. break;
  50. case 2:
  51. SET_OUT_3;
  52. break;
  53. case 3:
  54. SET_OUT_4;
  55. break;
  56. default : break;
  57. }
  58. // При включении переключаемся на следующий выход
  59. if (state == true)
  60. next_out_number = next_out_number == 3 ? 0 : next_out_number + 1;
  61. }
  62. else
  63. {
  64. switch (current_out_number)
  65. {
  66. case 0:
  67. RESET_OUT_1;
  68. break;
  69. case 1:
  70. RESET_OUT_2;
  71. break;
  72. case 2:
  73. RESET_OUT_3;
  74. break;
  75. case 3:
  76. RESET_OUT_4;
  77. break;
  78. default : break;
  79. }
  80. }
  81. }
  82. #if 0
  83. //
  84. void led_togle(void)
  85. {
  86. HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1);
  87. }
  88. // Индикация нажатия курка
  89. void led_signal_on(void)
  90. {
  91. HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET);
  92. }
  93. // Индикация нажатия курка
  94. void led_signal_off(void)
  95. {
  96. HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET);
  97. }
  98. // Инфракрасный диод
  99. void led_inf_on(void)
  100. {
  101. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  102. }
  103. // Инфракрасный диод
  104. void led_inf_off(void)
  105. {
  106. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  107. }
  108. // Индикация напряжения АКБ
  109. void led_but_on(void)
  110. {
  111. HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
  112. }
  113. // Индикация напряжения АКБ
  114. void led_but_toggle(void)
  115. {
  116. HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
  117. }
  118. #endif