Forum: Mikrocontroller und Digitale Elektronik STM32F446RE TIM14


von Hans-Georg L. (h-g-l)


Lesenswert?

Ich habe hier ein kleines Programm das über den Timer alle Sekunde eine 
Messung starten soll. Dazu benutze ich den TIM14 das Programmskelett 
wurde mit CubeMX erzeugt. Time.c initialisiert den Timer und der 
Interrupthandler
steckt in stm32f4xx_it.c. In meinem Code starte ich den Timer
mit SET_BIT(TIM14->CR1, 1); Aber es kommt kein Interrupt an.

Kann mit vieleicht jemand auf die Schnelle sagen ob da noch was fehlt 
oder wie ich unter Atollic Studio den SFR-Register View zum Laufen 
bekomme ?
1
// tim.c 
2
3
void MX_TIM14_Init(void)
4
{
5
6
  htim14.Instance = TIM14;
7
  htim14.Init.Prescaler = 8400;
8
  htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
9
  htim14.Init.Period = 10000;
10
  htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
11
  htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
12
  if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
13
  {
14
    Error_Handler();
15
  }
16
17
}
18
19
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
20
{
21
22
  if(tim_baseHandle->Instance==TIM14)
23
  {
24
  /* USER CODE BEGIN TIM14_MspInit 0 */
25
26
  /* USER CODE END TIM14_MspInit 0 */
27
    /* TIM14 clock enable */
28
    __HAL_RCC_TIM14_CLK_ENABLE();
29
30
    /* TIM14 interrupt Init */
31
    HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0);
32
    HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
33
  /* USER CODE BEGIN TIM14_MspInit 1 */
34
35
  /* USER CODE END TIM14_MspInit 1 */
36
  }
37
}
38
39
40
// stm32f4xx_it.c
41
void TIM8_TRG_COM_TIM14_IRQHandler(void)
42
{
43
  /* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 0 */
44
  TDC_TIM_MeasureStart();
45
  /* USER CODE END TIM8_TRG_COM_TIM14_IRQn 0 */
46
  HAL_TIM_IRQHandler(&htim14);
47
  /* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 1 */
48
49
  /* USER CODE END TIM8_TRG_COM_TIM14_IRQn 1 */
50
}

von Daniel (Gast)


Lesenswert?

Hast du auch den clock des Timers einschaltet?

von Hans-Georg L. (h-g-l)


Lesenswert?

Daniel schrieb:
> Hast du auch den clock des Timers einschaltet?

siehe code:

    /* TIM14 clock enable */
    __HAL_RCC_TIM14_CLK_ENABLE();

von Hans-Georg L. (h-g-l)


Lesenswert?

Manchmal sieht man den Wald vor lauter Bäumen nicht ...
Im Timer Register DIER muss noch der Überlauf Interrupt aktiviert 
werden:-)

von Martin B. (ratazong)


Lesenswert?

Warum startest Du den Timer nicht mit:

HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);

wenn Du schon CubeMX benutzt?

von Hans-Georg L. (h-g-l)


Lesenswert?

Martin B. schrieb:
> Warum startest Du den Timer nicht mit:
>
> HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
>
> wenn Du schon CubeMX benutzt?

Das hatte ich mal so drin und weil es nicht funktioniert hat durch den 
direkten Zugriff aufs Register ersetzt .... war aber nicht das Problem 
;-)

von Harry L. (mysth)


Lesenswert?

Und für deinen Interrupt solltest du die vorgesehene Callback-Routine 
nutzen:
1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
2
{
3
  if (htim == &htim14)
4
  {
5
6
// dein Code hier...
7
8
  }
9
}

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.