logic.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "stm32f0xx_hal.h"
  2. #include "logic.h"
  3. #include "pwm_in.h"
  4. #include "gpio.h"
  5. #include "pwm_out.h"
  6. static uint8_t step_number = 0;
  7. #define CH_NUM 10
  8. uint8_t channel_index = 0; // текущий индекс канала для срабатывания
  9. channel_cnt_t channel_cnt[CH_NUM];
  10. channel_t channels[CH_NUM] = {{GPIOA, GPIO_PIN_9},
  11. {GPIOA, GPIO_PIN_10},
  12. {GPIOA, GPIO_PIN_11},
  13. {GPIOA, GPIO_PIN_12},
  14. {GPIOA, GPIO_PIN_15},
  15. {GPIOB, GPIO_PIN_7},
  16. {GPIOB, GPIO_PIN_6},
  17. {GPIOB, GPIO_PIN_5},
  18. {GPIOB, GPIO_PIN_4},
  19. {GPIOB, GPIO_PIN_3}};
  20. //
  21. void channel_init(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStruct = {0};
  24. __HAL_RCC_GPIOA_CLK_ENABLE();
  25. __HAL_RCC_GPIOB_CLK_ENABLE();
  26. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  27. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  28. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  29. for (int i = 0; i < CH_NUM; i++)
  30. {
  31. GPIO_InitStruct.Pin = channels[i].pin;
  32. HAL_GPIO_Init(channels[i].port, &GPIO_InitStruct);
  33. HAL_GPIO_WritePin(channels[i].port, channels[i].pin, GPIO_PIN_RESET);
  34. }
  35. for (int i = 0; i < CH_NUM; i++)
  36. {
  37. channel_cnt[i].active = false;
  38. channel_cnt[i].cnt = 0;
  39. }
  40. }
  41. // Активировать текущий канал
  42. // Запустить счетчик
  43. void logic_single(void)
  44. {
  45. HAL_GPIO_WritePin(channels[channel_index].port, channels[channel_index].pin, GPIO_PIN_SET);
  46. channel_cnt[channel_index].active = true;
  47. channel_index++;
  48. if (channel_index == 10)
  49. channel_index = 0;
  50. }
  51. // сброс каналов через 0.5 секунды
  52. void logic_cnt_task(void)
  53. {
  54. }
  55. //
  56. void logic_main(void)
  57. {
  58. IWDG->KR = 0xAAAA;
  59. if (get_button())
  60. {
  61. gpio_set_output(true);
  62. HAL_Delay(500);
  63. IWDG->KR = 0xAAAA;
  64. HAL_Delay(500);
  65. IWDG->KR = 0xAAAA;
  66. logic_set_out_pwm();
  67. HAL_Delay(500);
  68. IWDG->KR = 0xAAAA;
  69. gpio_set_output(false);
  70. tim_pwm_pulse_idle();
  71. set_button(false);
  72. }
  73. }
  74. //
  75. void logic_set_out_pwm(void)
  76. {
  77. switch (step_number)
  78. {
  79. case 0:
  80. tim_pwm_out_set_pulse(PWM_OUT_CH_1, 1300);
  81. break;
  82. case 1:
  83. tim_pwm_out_set_pulse(PWM_OUT_CH_2, 1300);
  84. break;
  85. case 2:
  86. tim_pwm_out_set_pulse(PWM_OUT_CH_1, 1850);
  87. break;
  88. case 3:
  89. tim_pwm_out_set_pulse(PWM_OUT_CH_2, 1850);
  90. break;
  91. default : break;
  92. }
  93. step_number = step_number == 3 ? 0 : step_number + 1;
  94. }
  95. //
  96. void wdt_init(void)
  97. {
  98. RCC_OscInitTypeDef RCC_OscInitStruct;
  99. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
  100. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  101. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  102. HAL_RCC_OscConfig(&RCC_OscInitStruct);
  103. // 1. Enable the IWDG by writing 0x0000 CCCC in the IWDG_KR register.
  104. IWDG->KR = 0xCCCC;
  105. // 2. Enable register access by writing 0x0000 5555 in the IWDG_KR register.
  106. IWDG->KR = 0x5555;
  107. // 3. Write the IWDG prescaler by programming IWDG_PR from 0 to 7.
  108. IWDG->PR = 4;
  109. // 4. Write the reload register (IWDG_RLR).
  110. IWDG->RLR = 1000;
  111. // 5. Wait for the registers to be updated (IWDG_SR = 0x0000 0000).
  112. while (IWDG->SR);
  113. // 6. Refresh the counter value with IWDG_RLR (IWDG_KR = 0x0000 AAAA)
  114. IWDG->KR = 0xAAAA;
  115. }