1. Тема дня

GPIO modes, pull-up/pull-down, floating input, push-pull/open-drain, output speed, alternate function, analog mode и EXTI. Главная мысль: GPIO на STM32 - это не просто 0/1, а настраиваемый электрический узел.

2. Зачем это нужно в проектах

Сигналы: оптопары 220/24 В, компараторы, Schmitt trigger, RS-485 DE/RE, CAN standby, PWRKEY/RESET, fault/ready, sync/PPS, HIL-входы.

3. Теория

Режимы GPIO:

text
Input
Output
Alternate Function
Analog

Floating input ловит шум. Для оптопары/open collector/open drain нужен pull-up/pull-down, лучше внешний для промышленной линии. Типовая оптопара часто активна LOW:

c
#define RED_ACTIVE_STATE GPIO_PIN_RESET
static bool input_is_active(GPIO_TypeDef *port,
                            uint16_t pin,
                            GPIO_PinState active_state)
{
    return HAL_GPIO_ReadPin(port, pin) == active_state;
}

Push-pull подходит для reset/enable/sync/LED. Open-drain - для I2C, wired-OR, fault-линий. Output speed - это скорость фронта, а не скорость кода. Для reset/enable/DE/LED обычно достаточно LOW, чтобы снизить звон и EMI. EXTI реагирует на фронт:

c
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

Callback должен быть коротким: timestamp/flag/notify task. Нельзя HAL_Delay, I2C, MQTT, printf, Modbus. EXTI хорошо для чистых сигналов после Schmitt/компаратора. Сырой AC после оптопары лучше обрабатывать polling + фильтр импульсов.

4. Типичные ошибки

  1. Оставить промышленный вход floating.
  2. Надеяться, что EXTI отфильтрует шум.
  3. Делать debounce через HAL_Delay() в callback.
  4. Ставить Very High speed на все выходы.
  5. Перепутать open-drain и push-pull.
  6. Читать digital из pin в analog mode.
  7. Настроить GPIO_EXTI и забыть NVIC.

5. Практическое задание

Создай STM32_GPIO_EXTI_POLICY.md:

markdown
# STM32 GPIO / EXTI policy
GPIO rules:
1. No floating industrial inputs.
2. Optocoupler/open-collector inputs require pull-up/pull-down.
3. External pull resistors are preferred.
4. Output speed is minimal unless fast edge is required.
5. Open-drain only when topology requires it.
6. AF must match datasheet mapping.
7. Analog mode only for ADC/DAC/COMP/OPAMP or unused low-power pins.
EXTI rules:
1. EXTI only for clean digital signals.
2. Dirty AC optocoupler signals are filtered before EXTI or handled by polling.
3. Callback is short.
4. Debounce/phase logic outside ISR.

6. Что почитать или попробовать дальше

ST AN4899, STM32 EXTI examples, CubeMX GPIO/EXTI, Reference Manual конкретной серии.

Open-drain выход отпущен, а внешней и внутренней подтяжки нет. Можно ли считать уровень гарантированным HIGH?

Задание

Спроектируйте программную цепочку для чистого active-LOW сигнала после Schmitt trigger. Что хранит EXTI callback, а что выполняет task? Почему нельзя переносить этот вариант без изменений на сырой AC?

Критерии самопроверки: Укажите active-LOW, короткий ISR, task-owned обработку и различие чистого digital и сырого AC.

Показать ответ автора

Callback фиксирует timestamp и минимальный raw/flag/notification, затем завершается. Task применяет политику события, диагностику и последующие операции. Сырой AC пульсирует и может иметь шумные фронты; ему нужны conditioning и AC-window/filter, а не трактовка каждого фронта как новой фазы.