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
}
}