Skocz do zawartości

Stm32 Wyświetlanie napisu w terminalu po przytrzymaniu klawisza 10 sekund


Ksiina

Pomocna odpowiedź

Witam.

Chcę, żeby po wciśnięciu i przytrzymaniu przez 10 sekund klawisza na klawiaturze w terminalu wyświetlił się dany napis.

Ale wyrzuca mi błąd.

error: 'PressActive' undeclared (first use in this function)

Jest ktoś w stanie podpowiedzieć jak to rozwiązać?

#define true  1
#define false 0


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 = 115200;
//115200
USART_Init(USART2, &uart);

USART_Cmd(USART2, ENABLE);


	while (1) {
	if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)) {
	   char c = USART_ReceiveData(USART2);
	   switch (c)
	    	    {
	        case 'a':
	        	delay(100);
                   if (PressActive = true);

	        	send_string("Wcisnieto klawisz A\r\n");

	        			        	break;

	    }
	}

}
}
Link do komentarza
Share on other sites

Nie widzę nigdzie zadeklarowanej zmiennej PressActive. Dodaj przed pętlą main:

volatile bool PressActive = false;

i od razu na początku jeszcze dyrektywa preprocesora:

#include <stdbool.h>

zamiast:

#define true  1 
#define false 0 
Link do komentarza
Share on other sites

Dzięki. Jeszcze wyrzuca mi błąd :

undefined reference to `delay' (w while po case 'a':)

W jaki sposób można to rozwiązać?

Chcę, aby po wciśnięciu klawisza i przytrzymaniu przez 10 sekund wysyłany był napis do terminala.

if(klawisz wcisniety) { delay(10s)} if(klawisz nadal wcisniety ) {wyslij napis();}

Chcę, sprawdzić czy klawisz jest wciśnięty i po 10 sekundach sprawdzić znowu czy klawisza jest nadal wciśnięty, następnie wysłać wtedy napis do terminala.

Link do komentarza
Share on other sites

Kompilator nie może znaleźć odniesienia do delay'a bo nie wie co to jest. Nie ma go zadeklarowanego wcześniej.

Musiałbyś zadeklarować na początku programu te dwie funkcje:

void SysTick_Handler()
{
if (timer_ms)
	timer_ms--;
}

void _delay_ms(int time)
{
timer_ms = time;
while (timer_ms);
}

oraz dzielnik częstotliwości procesora w pętli main:

SysTick_Config(SystemCoreClock/1000);

Wtedy możesz korzystać z funkcji _delay_ms(). Weź tylko pod uwagę, że ta funkcja wylicza opóźnienie w milisekundach, czyli wpisując 100 ms otrzymasz 0,1 s, 1000 ms -> 1 s itd.

Co do Twojego pomysłu po delay'u możesz spróbować wstawić dodatkowy warunek if sprawdzający czy w terminalu znowu widoczne jest 'a'. Chyba najprostsze rozwiązanie.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dodaj przed funkcjami:

volatile static uint32_t timer_ms = 0;

RADA NA PRZYSZŁOŚĆ: jak wyskakuje błąd First use in function znaczy ze coś nie było wcześniej zadeklarowane, czegoś brakuje.

Link do komentarza
Share on other sites

Ok,działa, ale teraz mi wyświetla 'a' po 10 sekundach, jak teraz zrobić, żeby 'a' było wyświetlane po przytrzymaniu klawisza 'A' na klawiaturze przez 10 sekund. Czyli trzymam klawisz A i chcę, żeby w terminalu pojawił się napis dopiero gdy klawisz A jest wciskany przez przynajmniej 10 sekund. Jak przytrzymam klawisz A przez 9 sekund to nic nie powinno się pojawiać.

Mam wpisane, if (PressActive == true); powinno wysyłać tylko kiedy jest wciśnięty po tych 10 sekundach? Czemu nie działa w ten sposób?

Link do komentarza
Share on other sites

Witam.

Próbuję zrobić kod Morse'a na stm32 f103rb. Chcę, żeby krótkie naciśnięcie przycisku na stm'ie wysyłało - (myślnik), a długie . (kropkę). Na razie próbuję wysłać cokolwiek po naciśnięciu przycisku na stm'ie.

np. <10 sekund = krótkie przyciśnięcie, >10 sekund = długie przyciśnięcie

Jest ktoś w stanie coś podpowiedzieć?


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

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++);
		 }


 }
}

}

EXTI_ClearITPendingBit(EXTI_Line13);


int main(void)
{
EXTI_InitTypeDef exti;
 NVIC_InitTypeDef nvic;
GPIO_InitTypeDef GPIO_InitStructure;
int i;
#define LED_PORT GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


GPIO_StructInit(&gpio);   
 GPIO_Init(GPIOA, &gpio);       
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOC, &GPIO_InitStructure);

   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);


EXTI_StructInit(&exti);
   		 exti.EXTI_Line = EXTI_Line13;  
   		 exti.EXTI_Mode = EXTI_Mode_Interrupt;
   		 exti.EXTI_Trigger = EXTI_Trigger_Rising_Falling; 
   		 exti.EXTI_LineCmd = ENABLE; 
   		 EXTI_Init(&exti);

   		 nvic.NVIC_IRQChannel = EXTI15_10_IRQn; 
   		 nvic.NVIC_IRQChannelPreemptionPriority = 0x00;
   		 nvic.NVIC_IRQChannelSubPriority = 0x00;
   		 nvic.NVIC_IRQChannelCmd = ENABLE;
   		 NVIC_Init(&nvic);


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 = 115200;
   		USART_Init(USART2, &uart);

   	USART_Cmd(USART2, ENABLE);


   	SysTick_Config(SystemCoreClock/1000);


   while(1)
   {
   	if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) 

{
   	char c = USART_ReceiveData(USART2);
   			   switch (c)
   			   send_string("-\r\n");
   			   		        	break;
}}

__________

Komentarz dodany przez: Sabre

Scaliłem z pierwszym postem na ten temat.

Proszę Cię, abyś nie zakładał nowych postów na ten temat ponieważ zrobi się zamieszanie, gdy równolegle będziesz prowadził dyskusję w różnych postach.

Link do komentarza
Share on other sites

Jeden temat nie wystarczy żeby rozwiązać Twój problem? Po co zakładasz drugi?

W temacie poza opisem problemu wstawiłeś fragment kodu który pokazuje co konkretnie? Sam go napisałeś?

Ogólnie to patrząc po tym co piszesz (w poprzednim temacie) proponowałbym najpierw poznać język w którym chcesz programować, a potem działać w systemach wbudowanych.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.