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.

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