Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Interrupt nach CCR1?


von Bert S. (kautschuck)


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
}

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.