Vraag:
PWM aan het werk krijgen op STM32F4 met behulp van ST's HAL-bibliotheken
oboist B
2015-07-10 23:43:37 UTC
view on stackexchange narkive permalink

Ik probeer over te schakelen naar de ST HAL-bibliotheken, maar het lukt me niet om de PWM aan het werk te krijgen. Compileert prima, start gewoon niet.

In mijn main () noem ik de timer-initialisatiefunctie:

  / * TIM3 init-functie * / void MX_TIM3_Init (void) {TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 1300; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init (&htim3); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronisatie (&htim3, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET; sConfigOC.Pulse = 650; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_ConfigChannel (&htim3, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_MspInit (&htim3);} 

De GPIO wordt geïnitialiseerd in de HAL_TIM_PWM_MspInit () functie:

  void HAL_TIM_PWM_Mspandleit (TIM_TIM_PWM_Mspandleit (TIM_TIM_PWM_Mspandleit) htim_pwm) {GPIO_InitTypeDef GPIO_InitStruct; if (htim_pwm->Instance == TIM3) {/ * Perifere klok inschakelen * / __TIM3_CLK_ENABLE (); / ** TIM3 GPIO-configuratie PC9 ------ > TIM3_CH4 PC8 ------ > TIM3_CH3 PC7 ------ > TIM3_CH2 PC6 ------ > TIM3_CH1 * / GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_7 | GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed ​​= GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; HAL_GPIO_Init (GPIOC, &GPIO_InitStruct); }  

}

eindelijk ziet mijn main () er als volgt uit: (ik roep SystemInit () aan vanuit main omdat ik door STCube gegenereerde bestanden gebruik met coocox coide )

  int main (void) {SystemInit (); / * Reset van alle randapparatuur, initialiseert de Flash-interface en de Systick. * / HAL_Init (); / * Configureer de systeemklok * / SystemClock_Config (); / * Initialiseer alle geconfigureerde randapparatuur * / MX_TIM3_Init (); MX_GPIO_Init (); MX_LWIP_Init (); while (1) {}}  
Ik ging terug naar de oude bibliotheken omdat ik ze zonder problemen liet werken - ik werkte aan een proto-board met de stm32F417IG en wilde het gewoon weer aan de praat krijgen!Hopelijk heb ik tijd om hierop terug te komen en de HAL-dingen werkend te krijgen.Bedankt voor alle antwoorden!
Zeven antwoorden:
baron
2016-01-12 22:45:27 UTC
view on stackexchange narkive permalink

Bij gebruik van Cube Mx, initialiseert de gegenereerde code het timer-randapparaat, maar start het niet. De oplossing is zoals voorgesteld door anderen: voeg de Start-functies toe.

  HAL_TIM_Base_Start (&htim3); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_ALL); 

Plaats deze code in het gedeelte "GEBRUIKERSCODE" na de gegenereerde code die MX_TIM3_Init () aanroept.

Ik heb dit geprobeerd voor een Nucleo-32 (microcontroller STM32F042K6), ook voor timer 3. Het werkte *** niet *** met `TIM_CHANNEL_ALL` in de tweede aanroep, maar met` TIM_CHANNEL1` *** in plaats daarvan *** werkte(het begon met de daadwerkelijke PWM-uitvoer op de uitvoerpin).Hetzelfde geldt voor de andere 3 kanalen, met respectievelijk `TIM_CHANNEL2`,` TIM_CHANNEL3` en `TIM_CHANNEL14` in de aanroep naar` HAL_TIM_PWM_Start () `(dus 4 aanroepen in totaal naar` HAL_TIM_PWM_Start () `).
De aanroep naar `HAL_TIM_Base_Start (& htim3);` is *** niet *** nodig (empirisch bepaald en ook in [akohlsmith's antwoord] (http://electronics.stackexchange.com/questions/179546/getting-pwm-to-work-on-stm32f4-met-sts-hal-bibliotheken / 239783 # 239783)).
@PeterMortensen dat is briljant.Verbazingwekkend hoe zo weinig informatie zoveel kan betekenen.Bedankt voor het delen, dit was ook cruciaal op een STM32F412 aangepast bord.
akohlsmith
2016-06-08 04:41:27 UTC
view on stackexchange narkive permalink

Ik ben laat op het feest, maar ik bevond me in een vergelijkbare situatie en heb het echte antwoord, of in ieder geval het antwoord dat ik persoonlijk heb geverifieerd om te werken met mijn eigen STM32-bord en de STM32CubeMx-stuurprogramma's.

  1. Zorg ervoor dat u uw stack-toegewezen structs initialiseert (nul uit). bijv. memset (&sConfigOC, 0, sizeof (sConfigOC)); Lokale variabelen worden niet automatisch geïnitialiseerd en u zult een onverwachte / onbedoelde configuratie hebben omdat de HAL zeer basale aannames maakt over de perifere toestand op basis van deze handle-variabelen. Het is vooral gek als het gedrag verandert van compileren naar compileren of van functieaanroep naar functieaanroep als het stapelgeheugen verandert.
  2. Roep HAL_TIM_PWM_MspInit () niet handmatig aan. Het wordt automatisch aangeroepen wanneer u HAL_TIM_PWM_Init () aanroept, maar u moet ervoor zorgen dat uw handle-variabelen correct zijn geïnitialiseerd (zie # 1 hierboven).
  3. U hoeft niet te bellen HAL_TIMEx_MasterConfigSynchronization () als u niet verandert van de standaardconfiguratie (niet-geketend / gesynchroniseerd). Het doet niets pijn, maar het is ook niet nodig.
  4. Uw MspInit () -functie is goed, behalve dat u ook de klok van het GPIOC-randapparaat moet inschakelen.

En de magie die ervoor zorgt dat het niet werkt:

  1. Je MOET bellen HAL_TIM_PWM_Start () na elke aanroep naar HAL_TIM_PWM_ConfigChannel () - het eerste dat HAL_TIM_PWM_ConfigChannel () doet, is het uitschakelen van de timeruitgangen (de CCxE bits in TIMx_CCER ). HAL_TIM_PWM_ConfigChannel () schakelt de timeruitgangen niet opnieuw in!

Aangezien de enige HAL-manier om de PWM-duty cycle handmatig bij te werken is via HAL_TIM_PWM_ConfigChannel () , moet je altijd HAL_TIM_PWM_Start () aanroepen, anders heb je geen PWM-output . Ik denk dat dit is gedaan omdat de normale manier van werken met PWM is om de _IT () of _DMA () varianten van HAL_TIM_PWM_Start () te gebruiken , en dus werk je de taakcyclus "op de achtergrond" bij om het zo te zeggen.

Sommige van de andere antwoorden (inclusief degene die je oorspronkelijk als geaccepteerd had gemarkeerd) zijn fout:

  1. Roep NIET HAL_TIM_Base_Start () , noch HAL_TIM_Base_Init () aan, noch een van de andere niet-PWM-aanroepen; Ten eerste zal de HAL uw PWM_MspInit () -functie niet aanroepen omdat de randhandgreep niet langer in de reset-status zal zijn, maar wat nog belangrijker is, de PWM (en OC, en andere varianten) noemen allemaal het lage niveau interne functies naar behoren zonder dat u dit handmatig hoeft te doen. Het hele punt van de HAL is dat u zich niet zo veel zorgen hoeft te maken over de details, maar u moet goed weten wat de HAL doet en verwacht. De volledige bron is beschikbaar en redelijk goed gedocumenteerd. U hoeft het alleen maar te lezen.
  2. U hoeft HAL_TIMEx_PWMN_Start () of een van de andere TIMEx -functies niet aan te roepen, tenzij u de gratis uitgangen. Nogmaals, dit is redelijk goed gedocumenteerd in de HAL-bron.
Andere suggesties geprobeerd, maar geen enkele werkte, dit werkte voor mij, met behulp van het Olimex H103-bord.dit is gebaseerd op de STM32F103RBT6.Ik heb gewoon de volgende regel toegevoegd tussen GEBRUIKERSCODE BEGIN 2 EN GEBRUIKERSCODE END 2 in main.c HAL_TIM_PWM_Start (& htim3, TIM_CHANNEL_1);
Shreeyak Sajjan
2016-09-26 13:33:00 UTC
view on stackexchange narkive permalink

Ik gebruik STCubeMX en de gegenereerde HAL-initialisatiebestanden. Proces geverifieerd op mijn F302 Nucleo Board. Ik heb geavanceerde Timer 1 (TIM1) ingesteld met een normale en complementaire uitgang, geen dode tijd.

Zo heb ik PWM geconfigureerd in CubeMX:

  1. In pinout-weergave heb ik twee pinnen geselecteerd als de TIM1_CH & TIM1_CHN pinnen. Stel in het linkerdeelvenster TIM1-kanaal 1 in als "PWM Generation CH1 CH1N".
  2. Op het configuratietabblad heb ik de volgende instelling gezet (TIM1 clk is 64 MHz) CubeMX TIM1 Config Settings
  3. Nadat de code is gegenereerd, moeten we nog steeds de PWM starten. Dit wordt gedaan door de volgende functies aan te roepen in het gebruikerscodegebied vóór while (1), binnen main ():

    HAL_TIM_PWM_Start (&htim1, TIM_CHANNEL_1); // start PWM op CH1 pin HAL_TIMEx_PWMN_Start (&htim1, TIM_CHANNEL_1); // start PWM op CH1N-pin

  4. Gebruik de volgende macro's in stm32f3xx_hal_tim.h om de configuratie-instellingen te wijzigen. HAL_TIM_PWM_ConfigChannel () is niet de enige manier om de PWM-instellingen handmatig bij te werken, zoals gezegd door @akohlsmith.

    __HAL_TIM_GET_AUTORELOAD (&htim1); // haalt de periode op voor PWm __HAL_TIM_SET_COMPARE (&htim1, TIM_CHANNEL_1, dutyCycle); // stelt de PWM-duty-cycle in (Capture Compare Value)

U hoeft niet opnieuw HAL_TIM_PWM_Start () te bellen. Deze macro's veranderen de instelling tijdens runtime.

Kolovskiy
2015-08-09 00:20:11 UTC
view on stackexchange narkive permalink

U moet eerst de timer starten. Voeg de volgende regel toe aan de main () om timer3 te starten op de CH1 :

  HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);  
Alex Shenfield
2015-09-23 21:34:09 UTC
view on stackexchange narkive permalink

Ik denk dat je de GPIO-klok moet initialiseren door te bellen naar __GPIOC_CLK_ENABLE();

Ik heb vergelijkbare code die werkt - maar ik heb de masterconfiguratie weggelaten.

Er is een voorbeeld in de map stm32g-eval dat kan worden aangepast aan het ontdekkingsbord (als dat het bord is dat u gebruikt).

user91515
2015-11-12 13:52:41 UTC
view on stackexchange narkive permalink

Dit heb je nodig:

HAL_TIM_Base_Start_IT(&htim3);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_ALL);HAL_TIMEx_PWMN_Start(&htim3,TIM_CHANNEL_ALL);HAL_TIMEx_PWMN_pm3
Leg uit waar en waarom.
De "_IT" verwijst naar iets met onderbrekingen.Waarom zou dat alleen nodig zijn om PWM-uitvoer te krijgen?
ammar.cma
2015-11-12 17:48:46 UTC
view on stackexchange narkive permalink
  void PWM_Output (void) {TimerPeriod = 1000; / * TIM1 klok inschakelen * / RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM1, ENABLE); / * Time Base-configuratie * / TIM_TimeBaseStructure.TIM_Prescaler = 48; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = TimerPeriod; TIM_TimeBaseStructure.TIM_ClockDivision = 1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit (TIM1, &TIM_TimeBaseStructure); / * Kanaal 1, 2, 3 en 4 Configuratie in PWM-modus * / TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 899; TIM_OC1Init (TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = 899; TIM_OC2Init (TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = 899; TIM_OC3Init (TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = 899; TIM_OC4Init (TIM1, &TIM_OCInitStructure); / * TIM1 teller inschakelen * / TIM_Cmd (TIM1, ENABLE); / * TIM1 Hoofduitgang inschakelen * / TIM_CtrlPWMOutputs (TIM1, DISABLE); } ongeldig GPIO_init () {RCC_AHBPeriphClockCmd (RCC_AHBPeriph_GPIOA, ENABLE); GPIO_PWMEnPins.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_PWMEnPins.GPIO_Mode = GPIO_Mode_AF; GPIO_PWMEnPins.GPIO_Speed ​​= GPIO_Speed_Level_1; GPIO_PWMEnPins.GPIO_OType = GPIO_OType_PP; GPIO_PWMEnPins.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init (GPIOA, &GPIO_PWMEnPins);
/ * SMT32F0 heeft verschillende configuraties voor toewijzing van alternatieve functies; hieronder is het voorbeeld. STM32F4 heeft mogelijk minder code footprint om alternatieve func te configureren. * / GPIO_PinAFConfig (GPIOA, GPIO_PinSource8, GPIO_AF_2); GPIO_PinAFConfig (GPIOA, GPIO_PinSource9, GPIO_AF_2); GPIO_PinAFConfig (GPIOA, GPIO_PinSource10, GPIO_AF_2); GPIO_PinAFConfig (GPIOA, GPIO_PinSource11, GPIO_AF_2); }  

Deze code werkt in CooCox met standaard STM32f0xx_yyy bibliotheken. U moet ook de GPIOC-klok inschakelen in GPIO init.

Dat werkt misschien, maar de vraag ging over het gebruik van de ST HAL-bibliotheken.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...