STM32 cube ide

Stijnos

Golden Member

Op 9 april 2022 01:55:05 schreef benleentje:

Toch denk ik wel moet je vandaag beginnen waarom zou je nu plain C gebruiken?

Omdat dat nou eenmaal de standaard in microcontrollers is. Ook in C kun je gewoon object structuren maken met structs en pointers.

Ik vind c++ wat meer geschikt voor op de pc of wat zwaardere platformen zoals een Linux os of pc. Al vind ik voor op de pc C# dan weer 100x fijner en makkelijker dan c++

trix

Golden Member

Maar Trix, idd een goede basis cursus c zou je goed doen.
In je code voorbeeld met die if constructie heb je nog je timer registers van je AVR staan. Dat gaat niet werken op je stm he

:) nee dat weet ik. ik ben een sturing van een stepper motor (inc. acc. en decc.)aan het omzetten van een ATMEGA2560 naar een STM32F411re.
dus ik had dat 1 op 1 gecopieerd, een hoop errors natuurlijk, en die was ik 1 voor 1 aan het weg tackelen. toen ik bij die ene kwam waar mijn vraag over ging, heb ik hier om raad gevraagd.
dus dat register gebeuren staat er nog in.

die stepper motor sturing, heb ik gekopieerd van sparkyGSX.
https://www.circuitsonline.net/forum/view/message/2024863#2024863
die wil ik dus implementeren in mijn STM32F411re.

ik ga alle antwoorden nog aandachtig lezen, ik zit momenteel krap in mijn tijd (moeten werken vandaag, etentje om 5 uur en vanavond nog een feest)
iedereen bedank voor de inbreng, word zeer gewardeerd.

eigenwijs = ook wijs

Als je C nog niet goed onder de knie hebt kun je C++ wel helemaal vergeten.
C++ is aanzienlijk complexer om het goed te gebruiken.
Ik herhaal "goed te gebruiken" want daar schort het in zo ongeveer alle gevallen aan met projecten die in C++ geschreven zijn.
Ik denk dat ruim 90% van alle C++ projecten ronduit slecht zijn geschreven.

Inderdaad is het verstandig om eerst eens een cursus C te volgen. Want dat is ook de basis van C++.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.
trix

Golden Member

ik hoef ook niet zo nodig C++ te leren, C is genoeg voor het geen wat ik doe.

eigenwijs = ook wijs
bprosman

Golden Member

De jongere generatie loopt veel te vaak zijn PIC achterna.

Op 10 april 2022 21:09:06 schreef trix:
ik hoef ook niet zo nodig C++ te leren, C is genoeg voor het geen wat ik doe.

Welke van de 2 moet je zelf maar kiezen, ik zou wel een Udemy cursus nemen ipv een boek doorlezen. Van de cursus die ik heb gedaan was er wel een goede diepgang en werden ook veel gemaakte fouten en valkuilen uitgelegd. En voordat laatste is zo belangrijk aan programmeren al die verborgen valkuilen dat je zet kent en weet en ook wat voor compiler fouten erbij horen. In de cursus werden dan door de leraar bewust soms fouten gemaakt om te zien wat er gebeurt, wamt niet elke fout levert een compiler error op maar wel een programma die iets heel anders doet dan je verwacht zonder die fout.

Omdat je momenteel problemen hebt met het begrijpen van de programma flow is het zeker belangrijk om je daarin te gaan verdiepen.

trix

Golden Member

https://www.udemy.com/course/c-programming-for-beginners-/
dat bestaat dus eigenlijk voor het grootste deel uit filmpjes (niks mis mee overigens). maar bij die 2 cursussen die ik heb aan gekocht zaten filmpjes bij van een of andere indische man (denk ik) die zeeeeer gebrekkig engels sprak, de ondertiteling kon er ook niks van maken :).

eigenwijs = ook wijs

Ja dat zou kunnen de ondertiteling is volgens mij door software gemaakt, en verder zo direct gebruikt.

Ik zie dat er een paar proef (preview) video's tussen zitten dan kan je toch zien of het bevalt.

Vergeleken met de cursus die ik heb gedaan is deze denk 1/4 van de lengte. Maar toch denk ik wel dat de goede basis is omdat ik zelf ook voor professional ging.

trix

Golden Member

professional :? ....voor mij gewoon beginners....moeilijk genoeg ;)
die paar preview videos waren wel duidelijk engels.

eigenwijs = ook wijs
trix

Golden Member

zijn er hier ook mensen die met cubeide programeren en gebruik maken van de HAL instructie set ?
en voegt dat iets toe ?

eigenwijs = ook wijs

Op 11 april 2022 19:00:13 schreef trix:
professional :? ....voor mij gewoon beginners....moeilijk genoeg ;)
die paar preview videos waren wel duidelijk engels.

Omdat ik dingen graag wil begrijpen ipv van enkel weten.

de HAL instructie set ?

https://www.st.com/resource/en/user_manual/dm00105879-description-of-s…
Ik heb alleen even de eerste 15 regels doorgelezen. Het gaat dan om bv het direct aansturen van stukken hardware. Dat lijkt me voor jouw project zeker nog niet nodig omdat eigenlijk ook alles wel al in de bibliotheken ziet die je voor de STM gebruikt.

Maar als voorbeeld als je een encoder met de sporen A en B direct in de hardware wil uitlezen en je kan daar geen geschikt bibliotheek voor vinden dan kan je dat met de hal instructie set zelf toevoegen.

Aan de andere kant als ik dingen niet kan vinden die in de standaard meegeleverde software staat of ik weet niet hoe ik iets voor elkaar moet krijgen, dan ga ik zoeken hoe andere dat hebben gedaan en vaak vind je dan wel bruikbare code die je met kleine aanpassingen kan gebruiken.

Op 11 april 2022 21:38:04 schreef benleentje:
omdat eigenlijk ook alles wel al in de bibliotheken ziet die je voor de STM gebruikt.

Hal /is/ een library om de hardware aan te sturen.

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

Golden Member

Als je je code genereerd vanuit cubemx gebruik je al de cube mx HAL.
Het is een abstractielaag voor de hardware (hardware abstraction layer)
Ik zou die zeker gebruiken. Het lost voor jou al een hoop dingen op. Je kan daarmee veel makkelijker gebruik maken van je peripherals en hoeft niet elk registertje meer uit te zoeken en te kennen zoals je bij de avr gewend was. Laat het gewoon los dat je precies wilt weten hoe en waarom in dit geval anders kom je nooit een stap verder.

Ik heb gisteren op de RP2040 even tot op de registers zitten debuggen. Ik wilde PWM signalen hebben, heb de boel ingesteld met een "wrap" of "top" waarde van 4096, maar als ik een waarde opgaf van "4095" dan ging m'n ledje maar heel zwak branden. En met 65535 ging ie normaal branden. De 65536 top-waarde is de default, dus waarom werkt m'n instelling niet? Je moet eerst een config struct instellen en dan een "go do it" functie aanroepen. Eerst de config geprint: Ziet er goed uit. Dan de chip registers geprint... ziet er goed uit. Blijkt dat ik de 12bit waarde vier naar rechts schuif omdat ik er ook op een 8bits schaal wat mee wilde doen.

Eerst elders de schuld heen schuiven is een natuurlijke reactie. Maar "even" in de registers kunnen kijken helpt bij het debuggen. Maar zoek dat soort dingen pas uit als je ze nodig hebt.... In mijn voorbeeld heeft het me overtuigd om beter naar MIJN code te kijken en dat was nodig.

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

Golden Member

die MX brengt een eigenaardigheid met zich mee (en mischien nog wel meerdere).
als ik timer3 in de MX configureer dan kan je bij counter period (auto reload register- 16 bits value) enkel een getal invullen b.v. 1000. maar in het programma heb ik daar een variabele voor nodig: b.v. stepper_speed. dus ik verander dan in tim.c de 1000 in stepper_speed en kan dan ook gewoon met die variabele werken.
echter wanneer ik iets toevoeg of wijzig in de MX en ik ga terug naar de code dan word deze opnieuw opgebouwd, hierbij word stepper_speed weer terug veranderd naar 1000.
hoe kun je dit vermijden ?

eigenwijs = ook wijs

Dat is van "cubemx" en dergelijke het klote systeem.

Voor "max performance" genereren ze je code voor je. Maar dan mag je dus nooit meer wat in de instellingen van je code-generator wijzigen of je mag de gegenereerde files niet wijzigen. 1 van de twee. Een "library" structuur is veel beter.

Anyway. Daarom gebruik ik dat STM spul niet. Nu weet ik het weer.

[Bericht gewijzigd door rew op 12 april 2022 20:05:29 (10%)

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

Golden Member

eigenwijs = ook wijs
Stijnos

Golden Member

dat is inderdaad het vervelende van cubeMX, maar daarvoor staat er overal in je code commentaar als

c code:

 /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

al jouw eigen code moet tussen deze gegenereerde blokken staan, als je wilt dat het behouden blijft bij een nieuwe code generation vanuit cubeMX.

Er staan best veel van die blokken, maar helaas niet altijd exact waar je ze zou willen hebben. Dan heb je simpelweg pech... Je kan niet zelf deze sections definiëren helaas.
Als je jouw code gewoon in eigen file maakt en het gegenereerde en je eigen code zoveel mogelijk scheid, wordt het al minder vervelend.

Ik vind het soms ook erg iritant ja en hij genereerd het net niet zoals ik het zou willen, maar aan de andere kant is het wel even snel.
Een virtual usb compoort is 3x klikken en hij initialiseerd alles al voor je.
Uiteraard kun je altijd kijken wat cube mx genereerd en dat als voorbeeld gebruiken.

Daar ben ik ook al eens tegen aan gelopen, dat heb ik op de volgende "creatieve" manier opgelost:

code:


 /* USER CODE BEGIN 1 */

#if 0
 /* USER CODE END 1 */

 ... HIER DE STANDAARD CODE DIE JE AAN WILT PASSEN ...


 /* USER CODE BEGIN 2 */
#endif

 .. HIER DEZELFDE STANDAARD CODE DIE JE AANGEPAST HEBT ...


 /* USER CODE END 2 */

Tsja, is vreselijk. Maar soms moet je wel.

De #if 0 / #endif zorgt in de preprocessor dat de code verdwijnt, en daarna voeg je je eigen "gehackte" versie er weer aan toe.

Dan moet er natuurlijk wel een blokje BEGIN/END voor/achter staan anders is het echt jammer.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.
Stijnos

Golden Member

Maar als je in cube mx je code genereerd, heeft dat toch nog niks met de preprocessor te maken?
Ik zou verwachten dat waar jij "HIER JE STANDAARD CODE..." hebt staan, dat gewoon overschreven wordt.
Maar dat is mijn verwachting he. Geen zin om het uit te proberen nu :)

ah nee niet goed gelezen :)
dat is inderdaad een optie ja

[Bericht gewijzigd door Stijnos op 14 april 2022 01:10:38 (11%)

trix

Golden Member

dan houd je dus dit over ?

code:


 /* USER CODE BEGIN 1 */

 .. HIER DEZELFDE STANDAARD CODE DIE JE AANGEPAST HEBT ...

 /* USER CODE END 2 */

eigenwijs = ook wijs
Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.
trix

Golden Member

net de gelegenheid gehad om te testen, en het werkt.
tnx.

eigenwijs = ook wijs
trix

Golden Member

ik loop nu tegen iets simpels aan (tenminste dat denk ik).
ik maak gebruik van de HAL instructies, nu wil het geval dat ik deze binnen de int main(void) gewoon kan gebruiken, maar voor de int main(void) niet. dan krijg ik bij het compileren de error:
error: expected declaration specifiers or '...' before '&' token

de bedoeling is om na reset of power-up te starten met de timer uit.

dit werkt:

c code:


#include "gpio.h"
...
...
...
int main(void)
{
HAL_TIM_Base_Stop(&htim3);

     while (1)
  {

  }
}

dit werkt niet: (geeft ook aan dat dit een syntax error is).

c code:


#include "gpio.h"
...
HAL_TIM_Base_Stop(&htim3);
...
int main(void)
{
     while (1)
  {

  }
}
eigenwijs = ook wijs
Stijnos

Golden Member

Trix jongen, doe die C cursus nou ff ;)

Je kunt calls alleen in functies aanroepen.
Wat jij wilt gebeurd al in dat 1e voorbeeld wat wel werkt.
Na power kom je in main. Alle initiele dingen doe je voor je oneindige While lus