Przerwania i odczyt stanu w STM32

0

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.

0

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.

0

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 */
0

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ś...

0

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.

0

Na rejestrach czyli chodzi Ci o CMSIS?

0

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.

0

Bo dopiero się uczę i jeszcze nie znam takich rozwiązań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1