#include "stm32f0xx_hal.h" #include "logic.h" #include "pwm_in.h" #include "gpio.h" #include "pwm_out.h" static uint8_t step_number = 0; #define CH_NUM 10 uint8_t channel_index = 0; // текущий индекс канала для срабатывания channel_cnt_t channel_cnt[CH_NUM]; channel_t channels[CH_NUM] = {{GPIOA, GPIO_PIN_9}, {GPIOA, GPIO_PIN_10}, {GPIOA, GPIO_PIN_11}, {GPIOA, GPIO_PIN_12}, {GPIOA, GPIO_PIN_15}, {GPIOB, GPIO_PIN_7}, {GPIOB, GPIO_PIN_6}, {GPIOB, GPIO_PIN_5}, {GPIOB, GPIO_PIN_4}, {GPIOB, GPIO_PIN_3}}; // void channel_init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; for (int i = 0; i < CH_NUM; i++) { GPIO_InitStruct.Pin = channels[i].pin; HAL_GPIO_Init(channels[i].port, &GPIO_InitStruct); HAL_GPIO_WritePin(channels[i].port, channels[i].pin, GPIO_PIN_RESET); } for (int i = 0; i < CH_NUM; i++) { channel_cnt[i].active = false; channel_cnt[i].cnt = 0; } } // Активировать текущий канал // Запустить счетчик void logic_single(void) { HAL_GPIO_WritePin(channels[channel_index].port, channels[channel_index].pin, GPIO_PIN_SET); channel_cnt[channel_index].active = true; channel_index++; if (channel_index == 10) channel_index = 0; } // сброс каналов через 0.5 секунды void logic_cnt_task(void) { } // void logic_main(void) { IWDG->KR = 0xAAAA; if (get_button()) { gpio_set_output(true); HAL_Delay(500); IWDG->KR = 0xAAAA; HAL_Delay(500); IWDG->KR = 0xAAAA; logic_set_out_pwm(); HAL_Delay(500); IWDG->KR = 0xAAAA; gpio_set_output(false); tim_pwm_pulse_idle(); set_button(false); } } // void logic_set_out_pwm(void) { switch (step_number) { case 0: tim_pwm_out_set_pulse(PWM_OUT_CH_1, 1300); break; case 1: tim_pwm_out_set_pulse(PWM_OUT_CH_2, 1300); break; case 2: tim_pwm_out_set_pulse(PWM_OUT_CH_1, 1850); break; case 3: tim_pwm_out_set_pulse(PWM_OUT_CH_2, 1850); break; default : break; } step_number = step_number == 3 ? 0 : step_number + 1; } // void wdt_init(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.LSIState = RCC_LSI_ON; HAL_RCC_OscConfig(&RCC_OscInitStruct); // 1. Enable the IWDG by writing 0x0000 CCCC in the IWDG_KR register. IWDG->KR = 0xCCCC; // 2. Enable register access by writing 0x0000 5555 in the IWDG_KR register. IWDG->KR = 0x5555; // 3. Write the IWDG prescaler by programming IWDG_PR from 0 to 7. IWDG->PR = 4; // 4. Write the reload register (IWDG_RLR). IWDG->RLR = 1000; // 5. Wait for the registers to be updated (IWDG_SR = 0x0000 0000). while (IWDG->SR); // 6. Refresh the counter value with IWDG_RLR (IWDG_KR = 0x0000 AAAA) IWDG->KR = 0xAAAA; }