Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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;

	    }
	}

}
}

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 

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.

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.

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.

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?

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.

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.

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