Skocz do zawartości

STM32F4 - Discovery - problem z funkcją printf


Pomocna odpowiedź

Napisano

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?

  • 4 miesiące później...

Mam ten sam problem. Próbowałem różnych opcji printf oraz sprintf. Przy każdej próbie po wejściu w while program staje, a błędu żadnego nie ma. Ktoś znalazł rozwiązanie?

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);
  • 2 miesiące później...

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 🙂

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

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