STM32, программа не заходит в условие IF при

Я новичок в STM32, и я хочу написать функцию, которая будет проверять, отправил ли датчик (DHT11) данные. Я устанавливаю PA6 в режим OUTPUT и удерживаю его на низком уровне не менее 18 мс (согласно даташиту), а затем отпускаю и устанавливаю PA6 в режим INPUT, после чего срабатывает внешнее прерывание на выводе PA5 (режим IT_RISING). Затем простой цикл в течение некоторого времени проверяет состояние контакта PA5 (поскольку DHT11, при правильном подключении, будет изменять состояние линии несколько раз). Если DHT11 не подключен, то уровень PA5 будет высоким. Но когда я тестировал программу в Proteus, после while (check_cnt < check_delay) всегда запускалось только условие "else"... Я перепробовал несколько методов (IDR, HAL, CMSIS, макросы), но ни один из них не решил проблему. Где ошибка?

Функция прерывания:

volatile uint32_t check_cnt = 0, check_delay = 100;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if (GPIO_Pin == GPIO_PIN_5) {
        while (check_cnt < check_delay) {
            if (GPIOA->IDR & (0 << 5)) {   //CHECK PA5 PINSTATE (if low, then DHT11 have send data)
                GPIOA->BSRR = (1 << 8);    //line, that shows DHT11 connected
                break;
            } else {
                GPIOA->BSRR = (1 << 9);    //line, that shows DHT11 disconnected
                check_cnt++;
            }
        }
    }
    HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
}

Инициализация GPIO:

void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_USART2_CLK_ENABLE();

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_11 | GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);

    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}

Управление DHT11:

void DHT11_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIOA->BSRR = (0 << 6);
    HAL_Delay(18);

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

main.c:

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    //MX_USART2_UART_Init();
    //DWT_Init();
    DHT11_Init();
    HAL_GPIO_EXTI_Callback(GPIO_PIN_5);

    while(1)
    {
       //other code
    }
}

Сигнал есть

Сигнала нет

Схема


Ответы (0 шт):