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:
Input
Output
Alternate Function
AnalogFloating input ловит шум. Для оптопары/open collector/open drain нужен pull-up/pull-down, лучше внешний для промышленной линии. Типовая оптопара часто активна LOW:
#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 реагирует на фронт:
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. Типичные ошибки
- Оставить промышленный вход floating.
- Надеяться, что EXTI отфильтрует шум.
- Делать debounce через HAL_Delay() в callback.
- Ставить Very High speed на все выходы.
- Перепутать open-drain и push-pull.
- Читать digital из pin в analog mode.
- Настроить GPIO_EXTI и забыть NVIC.
5. Практическое задание
Создай STM32_GPIO_EXTI_POLICY.md:
# 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 конкретной серии.
Задание
Спроектируйте программную цепочку для чистого 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, а не трактовка каждого фронта как новой фазы.