Нарастающий и спадающий фронт на GPIO_STM32G4

Я работаю с STM32G491RE. Я подаю импульс на вывод GPIO от функционального генератора. Этот импульс будет длиться 2 мс и время выключения 8 мс. Мне нужно поднять флаг, если сигнал от функционального генератора потерян. Может ли кто-нибудь подсказать мне, как это сделать?

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==detect_Pin){
if(HAL_GPIO_ReadPin(detect_GPIO_Port,detect_Pin)==GPIO_PIN_SET){
 HAL_UART_Transmit(&huart2, (uint8_t *)"rising:",7, HAL_MAX_DELAY);
 }
else if(HAL_GPIO_ReadPin(detect_GPIO_Port,detect_Pin)==GPIO_PIN_RESET){
 HAL_UART_Transmit(&huart2, (uint8_t *)"falling:",8, HAL_MAX_DELAY);
 }
else
{
 HAL_GPIO_WritePin(led_GPIO_Port,led_Pin,GPIO_PIN_SET);
}  

Я пробовал использовать прерывание EXTI, но если есть входной сигнал от генератора, он обнаруживает как нарастающий, так и спадающий фронт, а если нет сигнала от генератора, я не попадаю в состояние else.

img: импульсный ввод от функционального генератора.

1.Если я хочу установить высокий флаг при отсутствии сигнала от функционального генератора, то выше времени отключения изображения это также считается отсутствием сигнала.

может кто-нибудь подсказать, как сделать?

Спасибо

, 👍1


1 ответ


Лучший ответ:

2

Я не знаю, как использовать используемый вами HAL API. вместо этого я буду предложить подход, основанный на API Arduino, который больше подходит для этот сайт.

Записывайте текущее время при каждом обнаружении перехода. Когда время с момента последнего обнаруженного перехода длиннее предопределенного тайм-аут, вы знаете, что последовательность импульсов остановилась:

const uint8_t pulse_pin = 2;
const uint32_t pulse_timeout = 10;  // миллисекунды

volatile uint32_t last_input_change;  // последний раз, когда мы обнаружили изменение

void on_input_change()
{
    last_input_change = millis();
}

void setup() {
    Serial.begin(9600);
    attachInterrupt(digitalPinToInterrupt(pulse_pin),
            on_input_change, CHANGE);
}

void loop() {
    // Избегаем гонки данных при чтении Last_input_change.
    noInterrupts();
    uint32_t last_input_change_copy = last_input_change;
    interrupts();

    if (millis() - last_input_change_copy >= pulse_timeout)
        Serial.println("The pulse train stopped.");
}

Обратите внимание: чтобы это работало, весь ваш код должен быть неблокирующим, в любом случае это хорошая практика.

,