Нарастающий и спадающий фронт на 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.
1.Если я хочу установить высокий флаг при отсутствии сигнала от функционального генератора, то выше времени отключения изображения это также считается отсутствием сигнала.
может кто-нибудь подсказать, как сделать?
Спасибо
@Sireesha, 👍1
1 ответ
Лучший ответ:
Я не знаю, как использовать используемый вами 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.");
}
Обратите внимание: чтобы это работало, весь ваш код должен быть неблокирующим, в любом случае это хорошая практика.
- Как использовать прерывание АЦП на синей таблетке STM32
- Проблема с прерыванием PCF8574
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?