Skocz do zawartości

STM32F4 - Discovery - problem z funkcją printf


kulawikm

Pomocna odpowiedź

Witam, jadę z kursem STM32 ale napotkałem na pewien problem. Chodzi o funkcję printf.

Jeśli piszę stały ciąg znaków wszystko jest OK, ale jeśli chcę wstawić zmienną to procek się zawiesza i na terminalu już nie pojawia się linia ze zmienną. Tak jakby formatowanie tekstu nie działało. Poniżej testowy program:

   #include "stm32f4xx.h"
   #include <stdio.h>

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

   int __io_putchar(int c)
   {
       if (c=='\n')
       send_char('\r');
       send_char(c);
       return c;
   }

   int main(void)
   {
       int a=123;
       GPIO_InitTypeDef gpio;
       USART_InitTypeDef uart;

       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |RCC_AHB1Periph_GPIOB |RCC_AHB1Periph_GPIOC| RCC_AHB1Periph_GPIOD, ENABLE);

       GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
       GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
       gpio.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;  // Konfiguracja RS232
       gpio.GPIO_Mode = GPIO_Mode_AF;
       gpio.GPIO_OType = GPIO_OType_PP;
       gpio.GPIO_PuPd = GPIO_PuPd_UP;
       gpio.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOA, &gpio);

       RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

       USART_StructInit(&uart);
       uart.USART_BaudRate = 115200;
       USART_Init(USART2, &uart);
       USART_Cmd(USART2, ENABLE);

       printf("Hello World!\n");
       printf("Zmienna a = %d \n", a);    //TU JEST PROBLEM !!!
       while(1){
           printf("Napis 2!\n");
       }
   }

Program zawiesza się po wypisaniu na terminal "Hello World!". Napisu "Napis 2!" już w ogóle nie wyświetla. Jeżeli usunę linię:

   printf("Zmienna a = %d \n", a);

to program wchodzi do pętli while(1). Nie wiem dlaczego nie mogę formatować tekstu.

Korzystam z płytki STM32F4 - discovery z konwerterem USB<-->RS232. Program z kursu przerobiony pod tą płytkę. Środowisko System Workbench for STM32.

Ktoś pomoże?

Link do komentarza
Share on other sites

1.Zrób zmienną "a" zmienną globalną i wtedy zobacz - poczytaj o zmiennych lokalnych i globalnych.

2. Jak wystartujesz program to nie wlatuje ci w HardFaultHandler ?

3. Jak masz włączony debug, to PPM na zmienną "a" i daj Add Watch Expression wpisz a i w lewym górnym rogu w zakładce expresions powinieneś widzieć co w tej zmiennej jest po kliknięciu pauzy.

4. Biblioteka STL jest już niewspierana przez ST, jak chcesz pisać na bibliotekach to masz kurs z STM32CubeMX.

Na dole podpowiedź, jak juz poradzisz sobie z printf

3.Po co printf skoro można tak:

void USART_Send_String(char * txt)
{
while( *txt ) send_char(*txt++);
}
void USART_Send_Int(int16_t value)
{
char bufor[100];
USART_Send_String( itoa(value, bufor, 10) );
}

i potem wywołanie

USART_Send_String("\r\nZmienna a to: \r\n");
USART_Send_Int(a);
Link do komentarza
Share on other sites

Nie wiem czy Ci to pomoże, ale też miałem i nadal mam identyczny problem na STM32F103. Zauważyłem dziś ciekawostkę, ostatnio funkcja niby wysiadła i przerzuciłem się na wysyłanie string i int osobno, ale czasami wygodniej jednak napisać cały łańcuszek danych.

A mianowicie, chwilkę temu próbowałem dość do tego dlaczego działa

printf("Hello World!\n");

a dlaczego nie działa:

printf("HEJ!");

Klasyczne przegrzebywanie pozwoliło na dojście do następującego wniosku, na końcu zawsze postaw '\n' 🙂 Wtedy printf działa, bez pomija znaku nowej lini zostaje pominięta owa funkcja - debugger 🙂

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

Klasyczne przegrzebywanie pozwoliło na dojście do następującego wniosku, na końcu zawsze postaw '\n' 🙂 Wtedy printf działa, bez pomija znaku nowej lini zostaje pominięta owa funkcja - debugger 🙂

Funkcja nie jest pomijana. Znak '\n' powoduje opróżnienie bufora (wysłanie znaków na wyjście).

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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