STM32 cube ide

trix

Golden Member

hallo,
ik hoop dat er hier ook mensen rondlopen die bekend zijn met: STM32 cube ide
ik ga hier een redelijke grote code mee maken, en heb me dus voor genomen om het op de correcte manier te doen, d.w.z. gebruik maken van .h en .c files.

nu kan je in cube een .h en .c file toe voegen.
maar die worden door de compiler niet zomaar gevonden, de .h wel maar de .c niet. dit geeft dan een error: no such file or directory kan hem dus niet vinden.
dan moet je het "path instellen".
dit gaat met:
project -> properties -> C/C++ general -> paths and symbols
ik heb wat gezocht en geprobeerd, maar het lukt voor alsnog niet om via deze weg te zorgen dat de compiler de .c file vind.
weet hier iemand hoe je dit moet doen ?
tnx.

eigenwijs = ook wijs

Je zet de .C file in een source folder.

Je Cube-IDE project (eigenlijke een Eclipse project, het onderliggende IDE systeem) heeft een aantal folders met source-files in het project zitten. Alle files in die folders zijn sources die de compiler meekrijgt (een voor een in het algemeen)

Eventueel kun je met File-New-Source file eens uitproberen waar jouw project een nieuwe source-file zou zetten, en dan eens met de windows (of linux, whatever) exporer/verkenner/file browser in die map kijken.

[Bericht gewijzigd door blurp op maandag 14 februari 2022 04:41:05 (10%)

Als ik een bestand vanuit Linux file manager sleep naar de "Project Explorer" in Cube en het laat vallen op de Projectnaam dan krijg ik de keuze of ik het wil kopieren of linken. Ik neem aan dat er in de Windows versie iets gelijkwaardigs gebeurt.
De vraag die wordt gesteld is "Select how files should be imported into the project:"
File import vanuit het menu zou dus wel eens hetzelfde kunnen doen.

reading can seriously damage your ignorance

in welke map heb je de files toegevoegd?
als je ze standaard in de Src map toevoegt moet die automatisch al geinclude worden.
Ik voeg modules wel eens toe in Src/Modules/..
Dan moet ik die mappen nog los toevoegen aan het include path, inderdaad via de weg zoals je zelf al omschrijft.
Waar gaat het nu mis dan?

trix

Golden Member

bij mij worden ze niet automatisch ge-included.

ik heb even een paar printscreens gemaakt, wat er fout gaat.
ik heb een stukje werkende code (bediening van een touchscreen) die werkt in main.c en in probeer.h

[Bericht gewijzigd door trix op maandag 14 februari 2022 20:55:57 (11%)

eigenwijs = ook wijs
trix

Golden Member

een nieuwe post voor de duidelijkheid.
die incl. "in de path" zetten lukt wel.
alleen die src. niet, volgens een youtube filmpje kon je dat doen zoals op de 2e foto, alleen staat in die extra pop-up de src niet.

edit: als ik deze 2 plaatjes bekijk lijkt het toch allemaal te kloppen.
en hoef ik niets handmatig toe te voegen.

[Bericht gewijzigd door trix op maandag 14 februari 2022 21:05:54 (19%)

eigenwijs = ook wijs

poeh... where to start...
Ik vraag me na al die topics af of je nu weet wat je aan het doen bent, maar op één of andere manier bewonder ik wel je doorzettings vermogen.
Vandaar wederom mijn reactie ;)

Allereerst.
In C include je GEEN C files. (tenminste, tenzij je echt aparte dingen wilt, maar doorgaans niet)

Om je code wat op te splitsen maak je een nieuwe .c en .h file.
In je c file definieer en implementeer je je functies die je in een andere file (bijvoorbeeld main.c) wilt aanroepen.

Dit noem je dan globale functies.
Als je in je aparte c file functies hebt die enkel binnen die file aangeroepen (mogen) worden heb je het over static functions. Je definieerd ze dan met "static" ervoor.
Om de globale functies bruikbaar te maken in externe files, moet je de functie definitie ook in de include file (ook wel header file genoemd) definieren. Daar is een definitie met enkel naam, return type en argumenten genoeg. (dit noemen ze dan function prototypes)

in de c file die je hebt gemaakt moet je de bijbehorende include file includen en ook alle andere files, waarvan je functies of variabelen nodig hebt.

Daarnaast heeft je include file een zogenaamde "header guard" dit is de

c code:


#ifndef BLABLABLA_H
#define BLABLABLA_H

#endif //BLABLABLA_H

dit is ervoor om te zorgen dat alles wat je include, maar 1x geinclude wordt. Dit om problemen van redefinition en dergelijke te voorkomen bij meervoudig includen.
Zorg ervoor dat al je definities TUSSEN de #define en #endif staan.
Na de #endif komt doorgaans niks meer.

dus voorbeeldje van een paartje c en h files:

De include (h) file

c code:


/*! \file
***************************************************************************************************************
file name:				blabla.h
\copyright				bla
\brief					blabla handler include file
\author					Stijnos
\date	created:			14 Feb 2022

***************************************************************************************************************
\par	Description
***************************************************************************************************************

	Description

***************************************************************************************************************
\note
***************************************************************************************************************

	note description

***************************************************************************************************************
*/

#ifndef __BLABLA_H_
#define __BLABLA_H_

/*
***************************************************************************************************************
	INCLUDE FILES
***************************************************************************************************************
*/

#include "stm32l1xx.h"

/*
***************************************************************************************************************
	Make header CPP compatible
***************************************************************************************************************
*/

#ifdef __cplusplus
extern "C" {
#endif

/*
***************************************************************************************************************
	GLOBAL DEFINES
***************************************************************************************************************
*/


/*
***************************************************************************************************************
	GLOBAL TYPEDEF
***************************************************************************************************************
*/


/*
***************************************************************************************************************
	GLOBAL VARS
***************************************************************************************************************
*/



/*
***************************************************************************************************************
	GLOBAL FUNCTION PROTOTYPES
***************************************************************************************************************
*/

void InitBlaBla(void);
void HandleBlaBla(void);
uint32_t GetBlaBlaThing(void);
void SetBlaBlaThing(uint32_t bbt);


/*
***************************************************************************************************************

***************************************************************************************************************
*/

#ifdef __cplusplus
}
#endif

#endif /* __BLABLA_H_ */

en hier de c file inhoud

c code:


/*! \file
***************************************************************************************************************
file name:				blabla.c
\copyright				bla
\brief					blabla handler file
\author					Stijnos
\date	created:			14 Feb 2022

***************************************************************************************************************
\par	Description
***************************************************************************************************************

	Description

***************************************************************************************************************
\note
***************************************************************************************************************

	note description

***************************************************************************************************************
*/


/*
***************************************************************************************************************
	INCLUDE FILES
***************************************************************************************************************
*/

#include "blabla.h"
//en include alles wat je nog meer nodig hebt

/*
***************************************************************************************************************
	Make header CPP compatible
***************************************************************************************************************
*/


/*
***************************************************************************************************************
	GLOBAL DEFINES
***************************************************************************************************************
*/


/*
***************************************************************************************************************
	GLOBAL TYPEDEF
***************************************************************************************************************
*/


/*
***************************************************************************************************************
	PRIVATE VARS
***************************************************************************************************************
*/

uint32_t blaBlaThing



/*
***************************************************************************************************************
	GLOBAL FUNCTION IMPLEMENTATIONS
***************************************************************************************************************
*/

void InitBlaBla(void) {

}

void HandleBlaBla(void) {
	blaBlaThing++;
}

uint32_t GetBlaBlaThing(void) {
	return blaBlaThing;
}

void SetBlaBlaThing(uint32_t bbt) {
	blaBlaThing = bbt;
}


/*
***************************************************************************************************************

***************************************************************************************************************
*/

Nu wat betreft mij opvalt in jouw screenshots:

* je include een c file, NIET DOEN
* je hebt gewoon maar wat code in de c file gemikt. Executeerbare code moet netjes in een functie zitten
* je include "probeer.h" in de while(1) loop. dat doe je bovenaan in je source file als allereerst
* in je "probeer.h" niks meer na de #endif
* je zet PROBEER in hoofdletters terwijl de file toch echt lowercase is

dan lijkt het toevoegen van de include paden volgens mij wel ok, het ziet er bij mij iets anders uit maar ok. Ik zou wel even de drowdown op "all configurations" zetten, want anders include je het enkel voor de debug build en niet voor de release build.

ik heb in mijn voorbeeld voor mijn module de include en c file bij elkaar in een mapje staan. Ik vind persoonlijk een hoger gelegen INC map met daarin de include files heel iritant.

zo even genoeg tips. Succes

trix

Golden Member

Van mijn telefoon, dus kort.

Tnx. Voor de reactie. _/-\o_

Print screen was enkel bedoeld om het includen te laten zien.
Hiervoor heb ik niet veel aandacht besteed aan de rest.
BeKijk vanavond aandachtig je post.

eigenwijs = ook wijs
trix

Golden Member

.

[Bericht gewijzigd door trix op dinsdag 15 februari 2022 19:19:52 (100%)

eigenwijs = ook wijs
trix

Golden Member

net wat geprobeerd, en het ziet er vooralsnog goed uit.
ik kan in de functie in probeer.c een LED aan & uit zetten dus het "linken" (heet dat geloof ik) gaat goed.
maar ik heb het wat uitgebreid en een de communicatie met een touchscreen toegevoegd.

eerst kreeg ik bij het compilen veel errors (veel HAL gerelateerd), maar de meeste verdwenen door in probeer.h #include "stm32f4xx_hal.h" toe te voegen.

maar er blijven nog een paar errors over:
'huart1' undeclared (first use in this function)
'Rx_Data' undeclared (first use in this function)
beide te maken met de uart comuinicatie van het touchscreen, gezocht, maar ik zie niet hoe dit op te lossen, moet er wellcht nog iets geincluded worden ?
de #include "probeer.h" staat in main.c keurig boven aan.

edit: deze prototype staat in probeer.c volgen mij staat hij daar niet goed: HAL_UART_Receive(&huart1, Rx_Data, 4, 1000);

[Bericht gewijzigd door trix op dinsdag 15 februari 2022 20:35:07 (13%)

eigenwijs = ook wijs

Waar heb je de variabele "huart1" dan gedefinieerd ? Moet dit een globale variabele zijn ? Als dit in een andere c file is, kan de compiler deze niet vinden. Je kan dit oplossen door in de c file "probeer" nogmaals een declaratie toe te voegen met het keywoord "extern" :
extern int huart1; (is het een int ?)
Zo weet de compiler dat dit een globale variabele is die ergens anders gedefinieerd wordt.

kijk, dat is alweer een hele stap vooruit.
mooi.

Die #include "stm32f4xx_hal.h" is netter om in de c file te zetten.
Ik probeer zelf in een h file zo min mogelijk te includen, meestal heb je enkel iets nodig die je types definieerd.

die huart1 die hij nu mist is de handle naar je uart. Ik vermoed dat hij bij jou in main.c bovenaan gedeclareerd wordt.
als die variabele enkel daar gedeclareerd wordt kun je hem ook alleen maar in main.c gebruiken.

je kan inderdaad doen wat RP6conrad al zegt.

Als je bovenaan in je probeer.c zet

c code:

extern UART_HandleTypeDef huart1;

dan zal die error verdwijnen vermoed ik.

Wat ik persoonlijk echter makkelijk en netter vind is om die extern via een header file te includen.

Nu zou het kunnen dat je ook een main.h hebt waarin die

c code:

extern UART_HandleTypeDef huart1;

al staat.
Je zou dan main.h kunnen included in je probeer.c

nu vind ik main.h eigenlijk een not done include file.
Main.c is je hoogste niveau van je programma, je moet eigenlijk van laag naar hoog includen.

Ik neem aan dat je je project hebt gegenereerd vanuit CubeMX? Je kan dan bij de sectie code generation kiezen om al je peripherals in aparte source file paartjes te laten genereren. Als je in mijn vorige screenshots kijkt zie je dat je dan een usart.c en usart.h krijgt.

in de usart.h staat ook die usart handle extern gedeclareerd. Je kan dan vervolgens boven in je probeer.c zetten

c code:

#include "usart.h"

nog een tip. kap met nederlandse variabelen en functies. 50% van je project is gegenereerde code van ST, dat is ook allemaal engels.
Functioneel maakt het allemaal niks, maar het is gewoon netter.

trix

Golden Member

ik had het ondertussen anders op gelost, maar jou post was net wat sneller.
ik heb"

c code:

 HAL_UART_Receive(&huart1, Rx_Data, 4, 1000);     // 1000 = time delay

	  if ((Rx_Data[1] == 0x34) && (Rx_Data[2] == 0x33))   RX_to_back = 1;	// if manual RX back  = pressed (page 4 button 3)
	  if ((Rx_Data[1] == 0x34) && (Rx_Data[2] == 0x34))  RX_to_front = 1;	// if manual RX front = pressed (page 4 button 4)

in de main.c gezet, en RX_to_back en RX_to_front als een parameter aan de functie mee gegeven.
de opzet die ik wil maken is dat de communicatie van en naar de touchscreen vanuit main.c gebeurt, en vandaaruit naar de afzonderlijke c files gaat b.v. stepper.c
waarvan ik dank zei julie nu beter weet hoe dat werkt, ik ga julie oplossingen wel testen, meer om te oefenen hoe dat gaat.

eigenwijs = ook wijs
trix

Golden Member

waar is dit eigenlijk voor ?

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

eigenwijs = ook wijs

https://stackoverflow.com/questions/1041866/what-is-the-effect-of-exte…

in jouw geval niet nodig volgens mij, maar het kan ook zeker geen kwaad.
ST genereerd je include files gewoon zo.
Als je unit testen draait hadden we dit doorgaans wel nodig

Op 15 februari 2022 21:47:09 schreef trix:
waar is dit eigenlijk voor ?

die header is tweetalig en kan nu zowel in C als in C++ gebruikt worden.

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

code:


#ifdef __cplusplus
extern "C" {
#endif
....
#ifdef __cplusplus
}
#endif

extern "C" {} is voor de C++ compiler, die automatisch wordt gebruikt als je .cpp sourcefiles hebt. Dan worden de funkties tussen de accolade als C funkties aangeroepen, en weet de C++ compiler dat die daarvoor een andere aanroep moet genereren.

Voor de C compiler (voor .c sourcefiles) bestaat die construktie niet, en is dat ook niet nodig omdat daar alles al op de C manier gaat. Die C compiler geeft dus een foutmelding op 'extern C'. Dat is hier opgelost door die stukken mbv de #ifdef compiler switch onzichtbaar te maken voor de C compiler.

trix

Golden Member

duidelijk,....gaat er dus uit.

eigenwijs = ook wijs
trix

Golden Member

nou vooruit.....voor deze ene keer :)

eigenwijs = ook wijs
trix

Golden Member

probeer.h & .c zijn stepper_manual.h & .c geworden (op advies van stijnos)
meteen maar een echte naam gegeven, voor je het weet zit de code vol met die "tijdelijke" namen.

belangrijk om te weten is, dat ik gebruik maak van "stm32 cube ide" en ik gebruik MX (grafische weergave om I/O, timmers, uart, enz in te stellen)
ook maak ik gebruik van de HAL libary.

weer eens wat verder getest, nu met een simpele timer waarmee ik een ledje laat toggelen.

dat gaat goed in de main.c maar wanneer ik dit ga doen in stepper_manual.c krijg ik allerlei errors.
de timer instellingen zitten in een functie die in main.c staat (t.g.v. MX)
dus ik dacht die functie (v/d timer) moet dan ook naar stepper_manual.c
en de prototype in stepper_manual.h.
ik heb die timer ook allen maar in stepper_manual.c nodig. maar zo krijg ik het vooralsnog niet werkend.

mischien zie ik iets simpels over het hoofd.

eigenwijs = ook wijs

Ja zoals ik al eerder aangaf kun je beter bij je code generation aangeven dat je je peripherals in aparte c en h files wil laten genereren. Die h files including je dan in jouw projecten.
Elke peripheral declareert een handle struct. Heet voor timer htim geloof ik. Je is global, maar moet je dan wel includen. Hierop kun je dan de hal_tim functies toepassen

trix

Golden Member

eigenwijs = ook wijs
trix

Golden Member

het vinkje aangevinkt en de code laten opbouwen. ik hou nog steeds
'htim3' undeclared (first used in this function)

maar wat nu opvalt, is dat eerst de functie van: uart1, uart2 en tim3 in de main.c stonden.

nu zijn er 2x een .h en .c files bij gekomen:
usart.h en usart.c
tim.h en tim.c
en de eerder genoemde functies staan nu daar. verder werkt het wel hetzelfde als eerst.

dus ik heb tim.h geincluded in stepper_manual.c en het lijkt nu te werken :)

eigenwijs = ook wijs
trix

Golden Member

ik had eigenlijk een practische vraag wat het gebruik van de cubeied betreft.
als ik een deel van een project heb wat werkt, wil ik daar graag altijd op kunnen terug vallen. dus als ik weer ga programmeren, doe ik dat dus liever niet in voorgenoemde project, want dan verander ik het geen wat al werkte.
dus ik wil eigenlijk dat werkend deel van mijn project kopieren, en daarin verder gaan.
maar dat kopieren in project explorer werkt toch niet zoals verwacht, als ik dan de MX wil openen dan krijInvalid Input: Must be project's active .ioc file.g ik een error: .

hoe doen jullie dit eigenlijk ?

eigenwijs = ook wijs