STM32 cube ide

trix

Golden Member

ben ik mee bezig ;)
dit is dus een call:
HAL_TIM_Base_Stop(&htim3);

eigenwijs = ook wijs
Stijnos

Golden Member

Ja dat is gewoon een functie net zoals die die zelf ook enkele gemaakt hebt.
Maar er is dus geen enkele reden om hem buiten je main te willen hebben.
Je moet hem wel buiten je While loop

[Bericht gewijzigd door Stijnos op 21 april 2022 21:09:06 (42%)

trix

Golden Member

dat had ik straks ook zo gedaan, maar toen werkte het om een of andere reden niet.....weet even niet waarom :?
wel goed dat je me er op wijst dat HAL_TIM_Base_Stop(&htim3); gewoon een functie is natuurlijk.

[Bericht gewijzigd door trix op 21 april 2022 21:16:45 (32%)

eigenwijs = ook wijs
Stijnos

Golden Member

je timer gaat pas lopen na de functie MX_TIM3_Init().

daarvoor die stop aanroepen heeft geen zin.

trix

Golden Member

dat deed ik wel inderdaad |:(

eigenwijs = ook wijs
trix

Golden Member

ben ik weer met een vraag wat betreft HAL.
ik ben bezig om de code van sparkyGSX te implementeren:
https://www.circuitsonline.net/forum/view/message/2024863#2024863
stepper sturing inc. acc. & decc.
dit heeft goed gewerkt op mijn AVR (met wat kleine aanpassingen)
en nu wil ik dit natuurlijk ook op de STM32F422RE.

nu moet je in de int main(void) en voor de while (1) deze interupt "vrijgeven" (weet niet de juiste term) met:
HAL_TIM_Base_Start_IT(&htim3);
alleen zorgt de instructie er ook voor dat de interrupt routine ook 1x word uit gevoerd (zie ik bij het debuggen), en dat moet dus niet.
hoe geef ik aan dat interrupt actief moet zijn zonder dat deze de interrupt routine uitvoert ?

lijkt mij sowieso een beetje dubbelop, in de MX moet je ook een vinkje zetten voor interrupt gebruik. en dan moet je dat in de code nog een keer "zeggen".

eigenwijs = ook wijs

Op 24 april 2022 12:28:08 schreef trix:
hoe geef ik aan dat interrupt actief moet zijn zonder dat deze de interrupt routine uitvoert ?

Die moet je uitleggen.

Als een interrupt actief is dan wordt de interrupt routine aangeroepen. Dat is de bedoeling.

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

Golden Member

bij de AVR moet je in een timer register een bit hoog maken voor interrupt enable en in de sei de "global interrrupt bit hoog maken".
dit om er voor te zorgen dat de interrupt überhaupt werkt.

wat moet je in cubeide doen om er voor te zorgen dat de interrrupt kan werken ?

eigenwijs = ook wijs

Ik denk dat de global interrupt al aanstaat.

Maar inderdaad, er zijn een zwik bitjes die de interrupt werking allemaal blokkeren.

In de hardware module (timer hier) zitten een aantal interrupt-enable bitjes van: "Je moet een interrupt triggeren als dit, dat, of dat." Allemaal uit -> geen interrupts.

Daarnaast moet je in de NVIC de IRQ aanzetten waar die timer op is aangesloten.

Ik zou verwachten dat als je via de HAL zegt dat functie X de timer functie is die aangeroepen moet worden als tim3 afgaat dat die dat voor je regelt. Maar ik heb geen ervaring met HAL.

Ik liep op dag 1 al tegen zo'n dingetje aan waar jij eerder ook al tegenaan liep: code bij mekaar geclickt en dan maakt ie sourcecode voor je, maar als je dan wijzigingen in dat stuk source hebt en vervolgens de clicketyclick ding weer saved, dan zijn je wijzigingen weg (tenzij je toevallig in het stuk tussen de "user code here" tags hebt gewijzigd... Dat vond ik een show-stopper.

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

Golden Member

ik heb denk ik beet, ik dacht namelijk dat je de onderstaande instructies beide moest gebruiken, de 1e om de interrupt actief te maken en de 2e om de timer daad werkelijk te starten. maar blijkbaar als je de interrupts gebruikt moet je alleen de 1e gebruiken.
ga ik verder testen.

HAL_TIM_Base_Start_IT(&htim3);

HAL_TIM_Base_Start(&htim3);

eigenwijs = ook wijs
trix

Golden Member

het lijkt net of de timer niet loopt, hij komt maar 1x in de interrupt routine, die voert hij uit, maar daarna komt hij helemaal niet meer in de interrupt routine. dit weet ik omdat ik daar een LED toggle en ik zie de variabele niet meer wijzigen.
nu wil ik dus controleren of de timer überhaupt wel loopt. hiervoor wil ik in de debug mode naar de variabele kijken waar de teller ophoogt (en reset).
maar hoe heet die variabele ?

eigenwijs = ook wijs

Om te zorgen dat je niet perongeluk ALLEEN maar met die interrupt bezig gaat (dus dat ie voordat ie terugkeert naar main, dat ie alweer de volgende ziet), moet je de interrupt bevestigen.

Ik denk dat het TIMx->SR.UIF is Die mag je weer op nul schrijven als je vind dat je een volgende interrupt wil hebben. Iets als

c code:

TIM1->SR &= ~TIM_SR_UIF;
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

Rew, dat handeld de code van cube mx hal al af.
Als jenhet goed doet hoeft trix alleen maar een callback functie te registreren die dan wordt aangeroepen door de interrupt afhandeling.

Ik zou het gebruik van de cube mx hal en losse registeren operaties persoonlijk niet combineren.
Trix zet gewoon eens een breakpoint in die interrupt en kijk of hij daar ook maar 1x komt. Misschien werkt je led toggle functie wel niet. Je weet maar nooit met jou ;)

Ik heb zelf nogal een afkeer aan al die /* User code begin here. */ commentaren, en heb nogal veel moeite met de manier waarop die Cube software probeert te "helpen".

Aan de andere kant, werkt het configureren van b.v de CPU klok en de distributie daarvan door alle PLL's, schakelaars en MUX'en weer wel best goed.

Daarom denk ik nu aan een tussenliggende oplossing.
Ik genereer een "begin" project met de Cube IDE, en doe er dan zelf mee wat ik wil in een kopie. Als ik dan later iets in de configuratie wil veranderen wat de Cube software beter kan dan ik, dan doe ik dat niet in mijn project zelf, maar in een apart project. Dan kun je daar bestuderen wat voor voorbeeld code is gegenereerd, en je plukt er uit wat je nodig hebt.

Dit kun je verder automatiseren door alles in GIT te stoppen en dan verschillende "branches" te beheren.

trix

Golden Member

Op 25 april 2022 19:25:59 schreef Stijnos:
Trix zet gewoon eens een breakpoint in die interrupt en kijk of hij daar ook maar 1x komt. Misschien werkt je led toggle functie wel niet. Je weet maar nooit met jou ;)

dat is waar :+ maar die toggle werkt, en die breakpoint in de interrupt routine had ik natuurlijk ook al gedaan, hij komt echt maar 1x daar.

eigenwijs = ook wijs
Stijnos

Golden Member

heb je bij die timer init

htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

staan?
er is een auto reload optie

trix

Golden Member

c code:


   htim3.Instance = TIM3;
   htim3.Init.Prescaler = 32000;
   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
   htim3.Init.Period = stepper_speed;
   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
   {
     Error_Handler();
   }
   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
   {
     Error_Handler();
   }
   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
   {
     Error_Handler();
   }

staat er tussen, alleen dan disabled.
die moet dan dus enabled worden ?
doe ik dat het best in de MX ?

hier heb ik bij de 4e 1000 in stepper_speed veranderd, op de manier zoals henri62 op de vorige pagina voorstelde.

eigenwijs = ook wijs
trix

Golden Member

.

[Bericht gewijzigd door trix op 26 april 2022 19:32:08 (100%)

eigenwijs = ook wijs
Stijnos

Golden Member

Laat eens het hele stuk zien hoe je dat gedaan hebt dan.

Die auto reload moet enabled zijn ja, en ja dat doe je het best vanuit cubemx, maa4 dat ligt eraan hoe je dat truckjes van Henry hebt gedaan, of dat gaat werken.
Je kan de period na init ook nog wel veranderen, wat je hier in de init doet heeft toch 0,0 zin met een variabele, want als je denkt dat nu de periode veranderd als je een andere waarde in de stopper speed variabele schrijft heb je het mis :p
In htim3 zit gewoon het register dat de periode bevat dacht ik. Heel misschien is er zelfs ook een hal functie voor maar dacht t niet

trix

Golden Member

dit functioneert, ik kan de variabele stepper_speed gewoon gebruiken. als ik naar de MX ga en iets wijzig waarna de code opnieuw word opgebouwd word stepper_speed niet terug veranderd naar 1000.

tim.c

c code:


/* TIM3 init function */
void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  // below looks like it is double, but is needed to make stepper_speed is not setting back to 1000
  // after reset or power-up

  /* USER CODE BEGIN TIM3_Init 1 */
  #if 0
  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 32000;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 1000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */
#endif

  htim3.Instance = TIM3;
   htim3.Init.Prescaler = 32000;
   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
   htim3.Init.Period = stepper_speed;
   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
   {
     Error_Handler();
   }
   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
   {
     Error_Handler();
   }
   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
   {
     Error_Handler();
   }
  /* USER CODE END TIM3_Init 2 */

}

eigenwijs = ook wijs
trix

Golden Member

Op 26 april 2022 21:33:25 schreef Stijnos:
want als je denkt dat nu de periode veranderd als je een andere waarde in de stopper speed variabele schrijft heb je het mis

nee dat werkt als ik een led laat togglen, dan kan ik met een andere waarde van stepper_speed de frequentie van togglen veranderen.
maar is er een variabele waar ik de waarde vam de timer kan zien, zo kan ik dus kijken of er bij de compare match naar de interrupt routine word gesprongen. ik heb nu als ik handmatig door de code stap in de debugger geen idee welke waarde de timer heeft.

edit:
net nog eens getest. als ik stepper_speed in de declaratie forceer naar 1000, toggled de led die in de interrupt routine staat wel.
lijkt toch dat de timer de "compare match" waarde niet haalt, daarom zou ik ook zo graag de waarde van die timer willen bekijken.

eigenwijs = ook wijs
Stijnos

Golden Member

de waarde van de timer staat in het CNT register.
Deze en alle alle registers kun je benaderen via:

code:

htim3->Instance->CNT

bijvoorbeeld

maar zet die htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

eens enabled
en die periode gaat zo echt niet veranderen door die stepper_speed variabele te veranderen. want dit gebeurt 1x bij initialisatie.

je kan runtime de periode aanpassen door het ARR register een nieuwe waarde te geven, dit kun je ook doen door:

code:

htim3->Instance->ARR

te schrijven.
let wel dat je dit misschien wel onder bepaalde condities moet doen, om heen hickups in je timing te krijgen.

[Bericht gewijzigd door Stijnos op 29 april 2022 21:36:15 (63%)

trix

Golden Member

Op 29 april 2022 21:31:20 schreef Stijnos:
maar zet die htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
eens enabled

heb ik gedaan.

en die periode gaat zo echt niet veranderen door die stepper_speed variabele te veranderen. want dit gebeurt 1x bij initialisatie.

ik had dit inderdaad getest met iedere keer een initialisatie. en niet "on de run".

ik kan de timer nu zien in de debug mode, het werkt nog niet, maar weer een stapje verder.

edit:
in de interrupt routine word een berekening gedaan:

c code:

stepper_speed = RunInterval + ( StartInterval - RunInterval ) * ( RampSteps - RampCounter ) / RampSteps;

hier is de bedoeling dat de "compare waarde" word gewijzigd.
als ik dit verander in:

c code:

htim3->Instance->ARR = RunInterval + ( StartInterval - RunInterval ) * ( RampSteps - RampCounter ) / RampSteps;

krijg ik een error:
error: invalid type argument of '->' (have 'TIM_HandleTypeDef' {aka 'struct <anonymous>'})
hij kan dus denk ik niet om gaan met ->.
ik kan het wel in de debug mode gebruiken bij de variabelen:
htim3->Instance->CNT

eigenwijs = ook wijs
trix

Golden Member

ik ben nu met de instructie:
__HAL_TIM_GET_COUNTER(&htim3);
aan het testen, dit lijkt voor als nog te werken.
kan de waarde (CNT) van de timer hier mee uitlezen.
nu nog naar toe zien te schrijven.

eigenwijs = ook wijs