STM32 Timer Interrupt nach CCR1?

#7090052
Lesenswert?

Hallo Zusammen,

Ich versuche auf einem STM32L081CBT6 
(https://www.st.com/content/ccc/resource/technical/document/datasheet/ab/81/9e/a3/49/a9/46/be/DM00162467.pdf/files/DM00162467.pdf/jcr:content/translations/en.DM00162467.pdf) 
einen one-shot Timer zum laufen zu bringen, der mir nach einem 
einstellbaren Intervall einen Interrupt generiert. Dabei soll der Timer 
nach dem Interrupt sofort stoppen.

Mit folgender Initialisierung (HAL Treiber) kann ich den one-shot Timer 
triggern, aber ich bekomme immer nur einen Interrupt, wenn der Counter 
überläuft und ich sehe nicht, warum das so ist. Ich möchte im Prinzip 
bei CCR1 compare einen Interrupt triggern.
1
//Init Funktion:
2
static void MX_TIM2_Init(void)
3
{
4

5
  /* USER CODE BEGIN TIM2_Init 0 */
6

7
  /* USER CODE END TIM2_Init 0 */
8

9
  TIM_MasterConfigTypeDef sMasterConfig = {0};
10
  TIM_OC_InitTypeDef sConfigOC = {0};
11

12
  /* USER CODE BEGIN TIM2_Init 1 */
13

14
  /* USER CODE END TIM2_Init 1 */
15
  htim2.Instance = TIM2;
16
  htim2.Init.Prescaler = 31;
17
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
18
  htim2.Init.Period = 65535;
19
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
20
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
21
  if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
22
  {
23
    Error_Handler();
24
  }
25
  if (HAL_TIM_OnePulse_Init(&htim2, TIM_OPMODE_SINGLE) != HAL_OK)
26
  {
27
    Error_Handler();
28
  }
29
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
30
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
31
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
32
  {
33
    Error_Handler();
34
  }
35
  sConfigOC.OCMode = TIM_OCMODE_ACTIVE;
36
  sConfigOC.Pulse = 1500;
37
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
38
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
39
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
40
  {
41
    Error_Handler();
42
  }
43
  /* USER CODE BEGIN TIM2_Init 2 */
44

45
  /* USER CODE END TIM2_Init 2 */
46

47
}
48

49
//Main
50
void main()
51
{
52
...
53

54
//Start des Timers:      
55
HAL_TIM_OC_Start_IT(&htim2,TIMER_CHANNEL_1);
56
TIM2->CCR1 = 25000;
57

58
...
59
}
60

61
//Callback
62
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
63
{
64
  if(htim->Instance == TIM2)
65
  {
66
      TIM2->CR1 &= ~TIM_CR1_CEN; //This re-enables the One-Shot Timer
67
  TIM2->CR1 |= TIM_CR1_CEN;
68

69
    /************/
70
    /* Debug     */
71
    /************/
72
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
73

74
  }
75

76
}

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