STM32F103RB Zatrzymanie wyświetlania napisu w terminalu

0

Witam. Napisałem program w CooCox, który wyświetla napis w terminalu, chcę, żeby po wciśnięciu przycisku napis się nie wyświetlał, a gdy się puści przycisk napis znów był wyświetlany.

Mam taki kod napisany.

void send_char(char c)
{
	while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
	USART_SendData(USART2, c);
}

void send_string(const char* s)
{
	while (*s)
		send_char(*s++);
}

int main(void)
{
	GPIO_InitTypeDef gpio;
	USART_InitTypeDef uart;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

	GPIO_StructInit(&gpio);
	gpio.GPIO_Pin = GPIO_Pin_2;
	gpio.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &gpio);

	gpio.GPIO_Pin = GPIO_Pin_3;
	gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &gpio);

	USART_StructInit(&uart);
	uart.USART_BaudRate = 9600;
	USART_Init(USART2, &uart);

	USART_Cmd(USART2, ENABLE);

	while (1) {
		send_string("Napis\r\n");
	}
}

Teraz próbuję dopisać obsługę przycisku.


void EXTI15_10_IRQHandler()
{
	int i=0;
 if (EXTI_GetITStatus(EXTI_Line13)) {
 if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) {

	 while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0 

Jest ktoś w stanie podpowiedzieć jak zrealizować taki program?

0

Po pierwsze brakuje konfiguracji zewnętrznego przerwania oraz włączenie globalnej flagi w kontrolerze NVIC. Również nie widzę inicjacji GPIOC13 jako wejście. Bez tego nie licz na to, że funkcja EXTI15_10_IRQHandler Ci się wykona.

Jeżeli chcesz to zrobić na przerwaniu to zrób sobie globalną zmienną int key_pressed i w funkcji przerwania wykrywaj czy pin jest wysoki czy niski i zmieniaj odpowiednio wartość zmiennej key_pressed. Potem w main zrób tak

while (1)
{
    if (key_pressed)
        send_string("napis\n");
}

Łatwiejsze rozwiązanie nie wymagające przerwań, skonfiguruj pin GPIOC13 jako input, a potem w miejsce if (key_pressed) wystarczy, że wstawisz if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) i tyle:)


I jako dodatek, porzuć HALa i nie używaj std periph. Te biblioteki są przykładem jak nie robić bibliotek. To zbugowany i nieczytelny crap. Lepiej zrobisz jak ściągniesz dokumentację do swojego procka i będziesz pisał bezpośrednio po rejestrach. Możesz wykorzystać już gotowe pliki nagłówkowe z rejestrami od ST.

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