STM32 CubeMX SoftPWM

Gast #5469778
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren