logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32F4 - sprintf nie wyświetla liczb float, działa tylko z int. Coocox, STM32F4

ka_3 16 Sie 2016 20:50 2223 6
  • #1 15872795
    ka_3
    Poziom 16  
    Posty: 295
    Ocena: 18
    Funkcja z liczbami typu int działa poprawnie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A na terminalu dostajemy coś takiego:
    Value of PI = 3


    Natomiast z liczbami typu float działa ale tylko troche:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na terminalu dostajemy coś takiego:
    Value of PI =


    Nie widać wartości liczby PI. Komunikacja z terminalem na pewno działa poprawnie.

    Środowisko Coocox, Mcu stm32f4.
  • #2 15872815
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Nie pokazałeś deklaracji tx_buffer oraz konfiguracji transferu DMA. Przyda się również log z kompilacji.
  • #3 15872913
    ka_3
    Poziom 16  
    Posty: 295
    Ocena: 18
    Aby było prościej to zrezygnujmy z DMA. Przy zwykłym wysyłaniu stringa efekt jest taki sam. Wysyłam tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i log z kompilacji.
    GCC HOME: C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin
    compile:
        [mkdir] Skipping C:\CooCox\CoIDE\workspace\DMA\dma\Debug\bin because it already exists.
        [mkdir] Skipping C:\CooCox\CoIDE\workspace\DMA\dma\Debug\obj because it already exists.
           [cc] Starting dependency analysis for 12 files.
           [cc] Parsing ..\..\..\cmsis_boot\stm32f4xx.h
           [cc] Parsing ..\..\..\cmsis\core_cm4.h
           [cc] Parsing ..\..\..\cmsis_boot\stm32f4xx_conf.h
           [cc] Parsing ..\..\..\cmsis\core_cmInstr.h
           [cc] Parsing ..\..\..\cmsis\core_cm4_simd.h
           [cc] Parsing ..\..\..\cmsis\core_cmFunc.h
           [cc] Parsing ..\..\..\uart.h
           [cc] Parsing ..\..\..\main.c
           [cc] Parsing ..\..\..\stdio\printf.c
           [cc] Parsing ..\..\..\syscalls\syscalls.c
           [cc] Parsing ..\..\..\uart.c
           [cc] Parsing ..\..\..\itoa.c
           [cc] 11 files are up to date.
           [cc] 1 files to be recompiled from dependency analysis.
           [cc] 1 total files to be compiled.
           [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wall -ffunction-sections -g -O0 -std=c99 -std=gnu99 -std=c11 -std=gnu11 -c -DSTM32F401VC -DSTM32F4XX -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -D__FPU_USED -IC:\CooCox\CoIDE\workspace -IC:\CooCox\CoIDE\workspace\DMA -IC:\CooCox\CoIDE\workspace\DMA\cmsis_lib\include -IC:\CooCox\CoIDE -IC:\CooCox\CoIDE\workspace\DMA\cmsis -IC:\CooCox\CoIDE\workspace\DMA\cmsis_lib -IC:\CooCox\CoIDE\workspace\DMA\cmsis_boot C:\CooCox\CoIDE\workspace\DMA\main.c
           [cc] C:\CooCox\CoIDE\workspace\DMA\main.c: In function 'main':
           [cc] C:\CooCox\CoIDE\workspace\DMA\main.c:44:15: warning: unused variable 'size' [-Wunused-variable]
           [cc]        uint8_t size = sprintf(buffer, "PI = %f\r\n", M_PI);
           [cc]                ^
           [cc] Starting link
           [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wall -g -nostartfiles -Wl,-Map=DMA.map -O0 -Wl,--gc-sections -LC:\CooCox\CoIDE\configuration\ProgramData\DMA -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\DMA/arm-gcc-link.ld -g -o DMA.elf ..\obj\led.o ..\obj\uart.o ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\printf.o ..\obj\system_stm32f4xx.o ..\obj\syscalls.o ..\obj\stm32f4xx_dma.o ..\obj\itoa.o ..\obj\misc.o ..\obj\dma.o
    Program Size:
          text	   data	    bss	    dec	    hex	filename
          5228	     24	   2224	   7476	   1d34	DMA.elf
  • #4 15872953
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    można zobaczyć co to jest to M_PI?
    Jakby się zrobiła doublem (np w wyrażeniu) to by potrzebowała format %lf
    A po drugie z tytułu optymalizacji często są po dwie biblioteki z printfem: ze zmiennym przecinkiem i bez.
  • #5 15872978
    Konto nie istnieje
    Konto nie istnieje  
  • #7 15873063
    ka_3
    Poziom 16  
    Posty: 295
    Ocena: 18
    W moim przypadku pomogło odznaczenie biblioteki Retarget printf.
    STM32F4 - sprintf nie wyświetla liczb float, działa tylko z int. Coocox, STM32F4

Podsumowanie tematu

✨ Użytkownik zgłasza problem z funkcją sprintf w środowisku Coocox na mikrokontrolerze STM32F4, gdzie liczby typu float nie są poprawnie wyświetlane, podczas gdy liczby typu int działają bez zarzutu. W odpowiedziach zasugerowano sprawdzenie deklaracji bufora tx_buffer oraz konfiguracji DMA, a także przetestowanie wysyłania stringów bez użycia DMA. Zwrócono uwagę na konieczność użycia odpowiednich bibliotek do obsługi floatów oraz na możliwość, że używana jest biblioteka newlib-nano, która nie obsługuje zmiennoprzecinkowych funkcji printf. Użytkownik otrzymał również wskazówki dotyczące odznaczenia opcji Retarget printf w konfiguracji projektu.
REKLAMA