STM32 CubeMX SoftPWM

Gast #5469778
Hallo Zusammen,

ich möchte gerne ein Software PWM Signal mit einem STM32F303 
(ST-Nucleo-32) Board generieren.
Ich verwende CubeMX und deren HAL_Library.

Das gewünschte PWM habe ich damit auch generieren können, allerdings mit 
einem Problem. Das PWM Signal "flackert":
|||__|||__||__|||__|||_|||__|||__|||__|||__|||__|||__
1
int main(void)
2
{  
3
  HAL_Init();
4
  SystemClock_Config();
5
  MX_GPIO_Init();
6
  MX_TIM2_Init();
7

8
  HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);                       
9
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1, 0x100);
10

11
}
1
void SystemClock_Config(void)
2
{
3

4
  RCC_OscInitTypeDef RCC_OscInitStruct;
5
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
6

7
    /**Initializes the CPU, AHB and APB busses clocks 
8
    */
9

10
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
11
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
12
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
13
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
14
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
15
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
16
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
17
  
18
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
19
  {
20
    _Error_Handler(__FILE__, __LINE__);
21
  }
22

23
    /**Initializes the CPU, AHB and APB busses clocks 
24
    */
25
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
26
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
27
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
28
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  
29
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
30

31
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
32
  {
33
    _Error_Handler(__FILE__, __LINE__);
34
  }
35

36
    /**Configure the Systick interrupt time 
37
    */
38
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
39

40
    /**Configure the Systick 
41
    */
42
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
43

44
  /* SysTick_IRQn interrupt configuration */
45
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
46
}

1
static void MX_TIM2_Init(void)
2
{
3

4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6

7
  htim2.Instance = TIM2;
8
  htim2.Init.Prescaler = 8;
9
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim2.Init.Period = 0xFFFE;
11
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
12
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
13
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
14
  {
15
    _Error_Handler(__FILE__, __LINE__);
16
  }
17

18
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
19
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
20
  {
21
    _Error_Handler(__FILE__, __LINE__);
22
  }
23

24
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
25
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
26
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
27
  {
28
    _Error_Handler(__FILE__, __LINE__);
29
  }
30

31
}
1
void TIM2_IRQHandler(void)
2
{
3
  
4
switch(c){
5
    
6
  case 1:  //+0xBB8
7
  
8
    
9
    
10

11
        CNT_Current= __HAL_TIM_GET_COUNTER(&htim2);    
12
       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+0xBB8);
13
       GPIOB -> ODR |= GPIO_PIN_3; 
14

15
  c=3;
16
    
17
  break;
18
    
19
    
20
  case 2:            
21
  //kommt später...            
22
  break;
23
            
24
            
25
  case 3: //+0x1F4
26

27
  CNT_Current=__HAL_TIM_GET_COUNTER(&htim2);
28
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+ 0x1F4);
29
        GPIOB -> ODR &= ~GPIO_PIN_3; 
30
        c = 1;
31
     
32
        break;
33

34
      }
35

36
  
37
  HAL_TIM_IRQHandler(&htim2);
38
  
39
}



Ich wäre für eine Lösung bzw. Erklärung sehr dankbar!
Gast #5469819
Sady schrieb:
> am Anfang von stm32f3xx_it.c

Warum die Salamitaktik? Packe alles (wirklich alle Sourcen
die du selbst erzeugt hast) in eine Zip-Datei und poste es hier.

Alles andere ist Chaos.

Sady schrieb:
> HAL_TIM_IRQHandler(&htim2);

Einen IRQHandler ruft man nicht selbst "händisch" auf. Nicht
im Interrupt Kontext und nur dann wenn man wirklich weiss
was man tut ....

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.