Cześć. Chciałbym zapytać czy istnieje możliwość wykryć stan pinu (HAL_GPIO_ReadPin) w STM32F103 jeżeli pin jest skonfigurowany na wykrywanie przerwań (GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;)? Z góry dzięki za pomoc.
- Rejestracja:ponad 8 lat
- Ostatnio:prawie 5 lat
- Postów:26
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 2 lata
Nie powinno być z odczytem problemu. Z tego co pamiętam to fakt, że dany pin ma generować przerwanie nie blokuje możliwości odczytu jego wartości. Czyli przerwanie powinno działać w tym przypadku na opadające zbocze a oprócz tego możesz sobie odczytywać stan tego pinu w innej procedurze niż handler przerwania.
- Rejestracja:ponad 8 lat
- Ostatnio:prawie 5 lat
- Postów:26
Bo mam problem z obsługą przycisku i jego eliminacją drgań styków. Poniższy kod działa jeżeli jest zawarty w pętli głównej (while(1)) a jak jest w obsłudze przerwania to już nie działa. Gdzie robię błąd?
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == BUTTON_Pin)
{
if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET && lock==0)
{
lock = 1;
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
else if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_SET && lock != 0)
{
lock ++;
}
}
}
/* USER CODE END 4 */
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 3 lata
- Postów:1493
lock
wygląda być zadeklarowany poza funkcją obsługi przerwania, jest volatile?
Poza tym debouncing możesz zrobić w timerze równie dobrze.
EDIT: nie mówiąc o tym, że jak się uczysz to weź lepiej napisz to po ludzku na rejestrach, to się dowiesz sam co źle zrobiłeś...
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 2 lata
Zauważ, że pętla while(1) cały czas wywołuje ten fragment programu w kółko, natomiast przerwanie wywołuje go tylko kiedy pojawi się odpowiednia okoliczność - czyli np. naciśnięcie przycisku, który zwiera dany gpio do masy lub do vcc. To, że diodka świeci kiedy ten kod jest w while to nie oznacza, że program działa dobrze - bo może być tak że diodka bardzo szybko jest włączana i wyłączana (używasz togglepin) i wydaje się że działa poprawnie.
- Rejestracja:prawie 5 lat
- Ostatnio:prawie 5 lat
- Postów:14
Czemu nie zrobisz tego przez IDE STM32Cube używając debugera, z single step mode wykonując linia po linii kod asemblera i sprawdzając rejestry m.in. LR jak już korzystasz z CMSIS. Ustawisz pułapkę w handlerze tego przerwania i sprawdzisz co się dzieje, jaka jest wartość lock, do którego warunku wskasuje, co zwraca HAL_GPIO_ReadPin, jakie wartości mają GPIO_Pin oraz BUTTON_Pin. Równie dobrze może być wyłączone odczytywanie zdarzenia skoro jesteś wewątrz przerwania.