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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.