#include "stm32l0xx_hal.h"
/* === Пины согласно Wokwi Nucleo L031K6 === */
// D3
#define SWITCH_PIN GPIO_PIN_9
#define SWITCH_PORT GPIOA
// D4
#define LED_PIN GPIO_PIN_10
#define LED_PORT GPIOA
// A0–A3
#define STEPPER_A1 GPIO_PIN_0
#define STEPPER_A2 GPIO_PIN_1
#define STEPPER_B1 GPIO_PIN_4
#define STEPPER_B2 GPIO_PIN_5
#define STEPPER_PORT GPIOA
#define STEP_DELAY_MS 5
uint8_t step_index = 0;
const uint8_t step_seq[4][4] = {
{1,0,1,0},
{1,0,0,1},
{0,1,0,1},
{0,1,1,0}
};
/* ================= CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
}
/* ========================================= */
void set_step(uint8_t i)
{
HAL_GPIO_WritePin(STEPPER_PORT, STEPPER_A1,
step_seq[i][0] ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, STEPPER_A2,
step_seq[i][1] ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, STEPPER_B1,
step_seq[i][2] ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, STEPPER_B2,
step_seq[i][3] ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
void stepper_step(void)
{
set_step(step_index);
step_index = (step_index + 1) % 4;
}
/* ================= MAIN ================= */
int main(void)
{
HAL_Init();
SystemClock_Config(); // ← КРИТИЧЕСКИ ВАЖНО
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO = {0};
/* Stepper */
GPIO.Pin = STEPPER_A1 | STEPPER_A2 | STEPPER_B1 | STEPPER_B2;
GPIO.Mode = GPIO_MODE_OUTPUT_PP;
GPIO.Pull = GPIO_NOPULL;
GPIO.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO);
/* LED */
GPIO.Pin = LED_PIN;
HAL_GPIO_Init(GPIOA, &GPIO);
/* Switch */
GPIO.Pin = SWITCH_PIN;
GPIO.Mode = GPIO_MODE_INPUT;
GPIO.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO);
while (1)
{
if (HAL_GPIO_ReadPin(SWITCH_PORT, SWITCH_PIN) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
stepper_step();
HAL_Delay(STEP_DELAY_MS);
}
else
{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT,
STEPPER_A1 | STEPPER_A2 |
STEPPER_B1 | STEPPER_B2,
GPIO_PIN_RESET);
HAL_Delay(10);
}
}
}