stm32 cube ide ---> putty

trix

Golden Member

hallo,

ik probeer vanuit cube ide (STM32) met de functie printf een text te sturen naar putty.....hoe moeilijk kan dat nou zijn ;)
krijg het even niet voor mekaar.

c code:

#include "stdio.h"

in de while loop

c code:

	  printf("test\n");

ik kijk in windows apparaat beheer welke compoort de STlink gebruikt (com 3)
zet de baudrate op 115200.
controleer: 8-bit (include parity) -- parity: none -- stopbit: 1

controleer in cube MX de setting van de USART die de STlink aanstuurt.
zelfde als hierboven

in putty zet ik ook dezelfde waardes.

run de code in de cube ide in de debug mode.....maar niets op de terminal :(

nu staat er in apparaat beheer en in putty nog een optie: datatransportbesturing met de opties:
- Xonn/Xoff
- hardware matig
- geen

die moeten denk ik ook overal het zelfde zijn (werkt dan ook niet)
of zijn deze niet van belang ?

eigenwijs = ook wijs
mel

Golden Member

Xon/off moet on staan,dacht ik. Verder moet het gewoon werken. Ik heb totaal geen verstand van Windows, maar ik denk dat , als er iets serieel ontvangen wordt, het gewoon op beeld moet komen.
Heb je geen ouderwetse domme terminal met serieele aansluiting?

u=ir betekent niet :U bent ingenieur..
trix

Golden Member

dat laatste weet ik niet goed wat je bedoeld, maar de verbinding laptop -> STlink is USB.

eigenwijs = ook wijs
marcob

Golden Member

Probeer eerst eens de RX en TX aan de PC zijde door te verbinden, kijk dan of je een echo krijgt als je een karakter verstuurd. Zo weet je of de PC zijde goed is.
EDIT: Lees net dat het USB is.

EDIT2: Zelf gebruik ik altijd Termite als terminal programma. https://www.compuphase.com/software_termite.htm

[Bericht gewijzigd door marcob op 5 juni 2022 12:08:11 (32%)

Een WOK is ook maar een vergiet zonder gaatjes

Printf print naar stdout, maar een microcontroller kent het concept van stdout niet. Er zijn twee opties:

  • Gebruikt geen printf, maar gebruik HAL_UART_Transmit()
  • Implementeer je eigen stdout door de low level io functies (die zwak zijn gelinkt) te overschrijven met je eigen functies.

Voorbeeld van optie 2:

c code:


int _write(int file, char *data, int len) {
    HAL_UART_Transmit(&huart2, (uint8_t *)data, len, HAL_MAX_DELAY);
    return len;
}
trix

Golden Member

ga ik bekijken, maar zoals ik het doe moet toch gewoon werken dacht ik ?

eigenwijs = ook wijs
trix

Golden Member

zojuist dus getest met:

c code:


int tester = 0b11110000;; 	//. sending text to putty

HAL_UART_Transmit(&huart2, &tester, 1, 20);

HAL_Delay(1000);

dan zie ik op putty wel elke seconden wat verschijnen, een onduidelijk karakter:

de verbinding naar putty is er dus wel.

eigenwijs = ook wijs
EricP

mét CE

Zonder verder gelezen te hebben... De HAL-layer wil een pointer naar een uint8_t hebben. Jij definieert een int en geeft daar een pointer naar.
Waarschijnlijk gaat dat wel goed, maar het is slordig programmeerwerk.

Jij stuurt iets erg hoog in de ASCII range. Hoe Putty dat displayed is afhankelijk van welke characterset je daar geselecteerd hebt. Je zou ook gewoon eens met een 'a' ofzo kunnen beginnen.

de verbinding naar putty is er dus wel.

Wat je daarmee bedoelt, ontgaat me. Je zit op een UART-iets te kijken wat die aan bitjes naar buiten schuift. Er is helemaal geen verbinding. Of je zou moeten bedoelen dat het electrisch aan elkaar zit.

Verder nog ff kijken of bitrate, datalength, stopbit(s) en parity bij de init overeen komen.

Aan flow control lijk je voorlopig nog niet toe te zijn. Dus zet dat allemaal maar uit - wil nog wel eens roet in het eten gooien als het niet doet wat jij verzonnen hebt.

[Bericht gewijzigd door EricP op 6 juni 2022 15:31:10 (10%)

trix

Golden Member

ok, wat ik stuur zit dus is ASCII, ik verwachte eigenlijk gewoon 11110000 te zien.
ik ga dat bekijken, bedankt voor de input.

eigenwijs = ook wijs
EricP

mét CE

Dat zie je ook als je met een logic analyser naar de output kijkt en daar je start, stop en parity bits af haalt.
Echter, dat doe je niet. Jij kijkt met Putty naar wat een andere UART er van vindt... Heb je wel eens een datasheet van een UART bekeken en hoe zo'n ding werkt? Bestudeer eens een datasheet van een 8250. Oud. Doen we niet meer. Erg leerzaam, want alles wat 'modern' is, doet min of meer hetzelfde, met wat toetertjes en belletjes erbij.

Welke STM gebruik je?

Normaal gebruik je de ST-Link voor software update en debugging. Dan is het niet handig om die ook als serial poort te gebruiken. Ik wist zelfs niet dat dat mogelijk is.

De printf() werkt normaal wel, maar is gekoppeld aan een andere serial port. Dan kun je de serial port gebruiken en tegelijk debuggen. Meestal zit er op die poort ook een USB interface.

trix

Golden Member

STM32F411RE (nu voor testen op een nucleo bord).

dat is eigenlijk alles wat ik wil, met b.v. printf texten en variabele op een terminal krijgen (putty b.v.).
dit vergemakelijkt het debuggen.

[Bericht gewijzigd door trix op 6 juni 2022 20:06:24 (10%)

eigenwijs = ook wijs

Ik ken dat model niet. Maar ik zou denken dat de RxD en TxD pinnen gebruikt kunnen worden voor de printf(). Dan zul je zelf een USB interface moduletje moeten koppelen.

Voorzover ik kan zien heeft die processor 10 Uarts aan boord. Dus het zou goed kunnen dat je ergens iets moet instellen in de software om te kiezen welke poort wordt gebruikt voor stdio.

Op 5 juni 2022 12:29:15 schreef Deskinspin:
Printf print naar stdout, maar een microcontroller kent het concept van stdout niet. Er zijn twee opties:

Dat is een keuze van de SDK om dat wel of niet te ondersteunen. Van de "pico-sdk" weet ik dat ie het WEL ondersteunt.

Of de stm-cube SDK het ondersteunt... dat weet ik niet. Die gebruik ik niet.

Op de ST development bordjes is er de mogelijkheid om in de STLINK die op het bordje zit ook een VCP te krijgen die aangesloten is op de hardware uart van de development CPU. De baudrate moet dus wel kloppen.

De handshake zou ik op "none" zetten, maar XON/XOFF zou ook moeten werken (vooralsnog. Als de CPU dan control-S stuurt stopt de PC met sturen van data. Dus als je binaire spullen gaat versturen moet ie op "none" staan als je dan niet verwacht).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
trix

Golden Member

domme vraag wellicht, wat is SDK en VCP ?

eigenwijs = ook wijs

SDK - Software Develop Kit
VCP - Virtual com port

Lijkt alsof je het aan de praat hebt.
Probeer het eens met een langere, leesbare string.
Als op de print alleen RX en TX verbonden zijn tussen de controller en de USB<->serial converter, dan kan flowcontrol het best op 'None' staan op de PC en in Cube MX.

trix

Golden Member

ga ik testen,....kan even duren tnx.

eigenwijs = ook wijs
M-i-c-h-e-l

Golden Member

Op 6 juni 2022 19:09:25 schreef deKees:
Welke STM gebruik je?

Normaal gebruik je de ST-Link voor software update en debugging. Dan is het niet handig om die ook als serial poort te gebruiken. Ik wist zelfs niet dat dat mogelijk is.

De printf() werkt normaal wel, maar is gekoppeld aan een andere serial port. Dan kun je de serial port gebruiken en tegelijk debuggen. Meestal zit er op die poort ook een USB interface.

Ik werk hier met een STLink-V3set en die heeft de mogelijkheid om een verbinding naar een extra seriele poort op te zetten.
Dat loopt dus over hetzelfde usb kabeltje.

Een andere mogelijkheid is het gebruiken van een TTL USB convertertje.

RX, TX en GND verbinden met de UART van je microcontroller en in Putty zie je netjes je seriele verkeer.

Zoals gezegd werkt printf() niet.
Je moet inderdaad de HAL layer gebruiken zoals is aangegeven.
Dan werkt dat prima.
En uiteraard in Apparaatbeheer van WIndows even kijken welke serial port je moet gebruiken.

Op 6 juni 2022 15:19:01 schreef trix:

c code:


HAL_UART_Transmit(&huart2, &tester, 1, 20);

HAL_UART_Transmit zal wel werken maar het is niet de "standaard" oplossing. Hij is ook beperkt, want HAL_UART_TRANSMIT doet geen formatting van numerieke waarden voor je. En dat wil je wel.

Vrijwel iedere SDK heeft een implementatie van printf in de library zitten. Die doet alle details van string formatting, nummers omzetten in ASCII, afronden van floats, uitlijning... Alles wat je met de %xx.xxyz codes van printf kunt.

Het enige wat die functie nog nodig heeft om te werken is een functie die een(1) ascii-teken uitprint.

Uit een ouder (STM32) projectje:

c code:


int __io_putchar(int ch)
{
	USART_SendData(USART1, (uint16_t) ch);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ;
	return ch;
}

Dit stukje code meenemen (of iets vergelijkbaars) is genoeg om printf te laten werken.

Grootste probleem is uitzoeken hoe de functie heet die jouw library gebruikt.
Hij zit ergens bij je project-files, en is op de een of andere manier weak (__weak, of WEAK, of een ander keyword) gelinkt zodat de linker bij het linker jouw functie voorrang geeft op de default.

trix

Golden Member

dat hele HAL gebeuren is voor iets wat bedoeld is om de gebruiker te helpen toch redelijk complex.
bij avr studio kon ik alles vinden in de datasheet v/d AVR, nu moet ik meerdere PDF's openen: HAL descritpion --- reference manual --- user guide.
kost echt wat tijd om daar de weg in te vinden.

eigenwijs = ook wijs

klopt een AVR of ARM is daarin een groot verschil. Ik was ook AVR expert en wist elk registertje hoe het zat en werkte. Bij de overstap naar STM32 viel dat vies tegen. De HAL doet al heel veel voor je en je bent niet meer op register niveau bezig. Mijn project toen gebruikte nog STM's standard lib, die was nog wat meer rechttoe recht aan. een mooie tussen stap, maar op een gegeven moment moet je je er toch maar aan toegeven. Het doet ook heel vele werk voor je en je moet accepteren dat je niet alles exact weet onder water.
Hoe snel je in stm32 met HAL een usb VCP hebt in je project is klik klik klik klaar. Ga dat in een AVR maar eens doen waarbij je alles zelf in moet stellen en heel de middle ware etc daarvoor moet meebouwen.
Ik snap helemaal je struggles, maar ik ben toch redelijk overtuigd. Niet alles in die HAL vind ik geweldig hoor verre van, maar toch kan ik er inmiddels goed mee uit de voeten. Het vraagt echter wel een stukje meer diepere ervaring