stm32 - Wyświetlanie napisu w terminalu po wciśnięciu przycisku

0

Witam.

Napisałem program, który wyświetla w terminalu napis z CooCoxa, teraz próbuję dodać obsługę przycisku. Chciałbym, żeby po wciśnięciu przycisku też pojawił się napis w terminalu.

Napisałem poniższy program. Jest w stanie ktoś pomóc?

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); 
            } 
    while (1) { 
            send_string("Przycisk jest wcinięty\r\n"); 
        } 
 } 
} 
 
0

No ja jestem w stanie pomóc.

0

Napisałem coś takiego:

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_InitStructure;
	//int i;
	#define LED_PORT GPIOA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	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);
	while (1) {
		if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
		{
			                  send_string("Przycisk wcinięty\r\n");
			                  GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)1);
			                  break;
			     }
		}
	}
 

Jest ktoś w stanie coś podpowiedzieć?

Kompiluje się, ale nic nie wysyła po wciśnięciu przycisku.

0

Moduł USART też wypadałoby zainicjalizować.

0

To może spróbuj uściślić co nie działa? Masz dwa elementy w systemie: przycisk i komunikację przez port szeregowy. Proponuję sprawdzić oddzielnie czy kod związany ze sprawdzaniem stanu przycisku działa (poprzez np. zapalanie diody gdy przycisk jest wciśnięty) i z komunikacją (poprzez np. wysyłanie jakiegoś znaku z odstępem X milisekund).
Spoiler: powinno wyjść że USART nie działa

0

Coś takiego napisałem ale nie działa. Dobrze kombinuję?

 
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++);
}
 
 
void EXTI15_10_IRQHandler()
{
        int i=0;
 if (EXTI_GetITStatus(EXTI_Line13)) {
 if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
 
 
 
 
EXTI_ClearITPendingBit(EXTI_Line13);
 }
 
 
int main(void)
{
 GPIO_InitTypeDef gpio;
 EXTI_InitTypeDef exti;
 NVIC_InitTypeDef nvic;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 
 
 
gpio.GPIO_Pin = GPIO_Pin_13;
 gpio.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOC, &gpio);
 
 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);
 
 while (1) {
 send_string("Hello world!\r\n");
 }
}
0

Ale dlaczego nie działa? Co dokładnie nie działa? Wysyła się cokolwiek po uart'cie? Jakimś debugerem leciałeś? Napisz coś więcej zgadywać to nikt nie będzie co jest nie tak.

A to nie ma prawa działać, bo w ogóle nie inicjujesz uarta.

0

Dodałem inicjacje UART

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++);
}
 
 
void EXTI15_10_IRQHandler()
{
        int i=0;
 if (EXTI_GetITStatus(EXTI_Line13)) {
 if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
 
 
 
 
EXTI_ClearITPendingBit(EXTI_Line13);
 }
 
 
int main(void)
{
 EXTI_InitTypeDef exti;
 NVIC_InitTypeDef nvic;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


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);
 
 
 
gpio.GPIO_Pin = GPIO_Pin_13;
 gpio.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOC, &gpio);
 
 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);
 
 while (1) {
 send_string("Hello world!\r\n");
 }
}

Przy ostatnim nawiasie mam error : "error: expected declaration or statement at end of input"

0

Domknij nawias w

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

funkcja void EXTI15_10_IRQHandler() nie ma zamkniętej klamry. Poza tym, nie używaj tej okropnej biblioteki od ST. Weź tylko definicje rejestrów, ściągnij dokumentację do procesora i pisz bezpośrednio po rejestrach. Uwierz mi, mniej się nacierpisz i zrozumiesz chociaż trochę jak działają te procki.

0

Teraz mam błąd:
[cc] C:\CooCox\CoIDE\workspace\ProjChip\cmsis_boot\startup/startup_stm32f10x_md.c:214: undefined reference to `main'
[cc] collect2.exe: error: ld returned 1 exit status
Jakiś pomysł jak to rozwiązać?

0

Skompiluj funkcję main. Wygląda jakby to twoje ide nie włączało do projektu pliku gdzie jest main(). Tym dziwniejsze jest to, że wygląda, że plik jest kompilowany. Poszukaj gdzieś w plikach projektowych czy ten plik jest dołączony do całego projektu.

I nie bądź tak oszczędny w słowach. Opisz swój problem najlepiej jak potrafisz. Dodawaj pełne logi (na jakiegoś nopaste), a nie tylko to co wydaje ci się, że jest ważne.

0

aaaaaaaaaaaaaaaaaaa

0

Z innej mańkl trochę: dlaczego przycisk na EXTI, masz debouncing sprzętowy? Bo to nie jest zgodne ze sztuką...

0

czytając ipatrząc ze sami umiecie pisac programy to powiem szczerze az wam zazdroszcze

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