Forum: Mikrocontroller und Digitale Elektronik STM32F030 Timer 14 tut nichts


von Christoph N. (christoph_n)


Lesenswert?

Liebe Community,

ich versuche gerade Timer 14 beim STM32F030 zum laufen zu bringen. Mit 
unten gpostetem Code ging es mit Timer 15, aber hier nicht. Es scheint 
einen Unterschied zu geben, der vermutlich einfach ist, aber ich komme 
nicht drauf.
Er kommt einfach nicht in die ISR (Breakpoint wird nicht erreicht, GPIO 
tut nix).

- GCC5.2
- STM-Standard-Periph.
- Nacktes Eclipse
1
void INTTIM_Config(void)
2
{
3
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
4
5
  NVIC_InitTypeDef NVIC_InitStructure;
6
  /* Enable the TIM2 gloabal Interrupt */
7
  NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
8
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
9
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
10
  NVIC_Init(&NVIC_InitStructure);
11
12
  /* TIM2 clock enable */
13
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
14
15
  /* Time base configuration */
16
  /* Berechnung der Frequenz:
17
   *
18
   * F_CLK=48Mhz
19
   * F_Timer=40kHz
20
   * TM_Period = F_CLK/F_Timer
21
   * <=> TM_Period = 48Mhz/40Khz = 1200
22
   * wenn Prescaler und Devision = 0
23
   *
24
   */
25
  TIM_TimeBaseStructure.TIM_Period = 1200; 
26
  TIM_TimeBaseStructure.TIM_Prescaler = 1; /
27
  TIM_TimeBaseStructure.TIM_ClockDivision = 1;
28
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
29
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
30
  TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
31
  /* TIM IT enable */
32
  TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE);
33
  /* TIM2 enable counter */
34
  TIM_Cmd(TIM14, ENABLE);
35
}
36
37
void TIM14_IRQHandler(void)
38
{
39
    TIM14->SR = ~0x0001;
40
    GPIOB->BSRR = GPIO_Pin_4;
41
    GPIOB->BRR = GPIO_Pin_4;
42
}

Was ist mein Problem, habe ich irgendeinen Wert nicht konfiguriert oder 
eine Clock vergessen?

Vielen Dank für Eure Hilfe

Christoph

von hp-freund (Gast)


Lesenswert?

Christoph N. schrieb:
> RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

?

von Christoph N. (christoph_n)


Lesenswert?

... Ist das falsch?

von Cyblord -. (cyblord)


Lesenswert?

Christoph N. schrieb:
> ... Ist das falsch?

Offensichtlich ja. Schau genau hin.
Tipp: Schau dir von solchen Funktionen den Kommentar an. Dort stehen 
alle möglichen Parameter und schau dass dein Timer dabei steht. Wenn 
nicht -> falsche Clock.

von hp-freund (Gast)


Lesenswert?

APB2 und APB1 beachten.

von hp-freund (Gast)


Lesenswert?

Hat dein µC überhaupt ein APB2?
Vermutlich eher nicht.

von Christoph N. (christoph_n)


Lesenswert?

Stimmt dann irgendwas mit der Lib nicht, oder habe ich etas falsh 
verstanden, denn in der .h-Datei steht:
1
/** @defgroup RCC_APB2_Peripherals 
2
  * @{
3
  */
4
5
#define RCC_APB2Periph_SYSCFG            RCC_APB2ENR_SYSCFGEN
6
#define RCC_APB2Periph_ADC1              RCC_APB2ENR_ADC1EN
7
#define RCC_APB2Periph_TIM1              RCC_APB2ENR_TIM1EN
8
#define RCC_APB2Periph_SPI1              RCC_APB2ENR_SPI1EN
9
#define RCC_APB2Periph_USART1            RCC_APB2ENR_USART1EN
10
#define RCC_APB2Periph_TIM15             RCC_APB2ENR_TIM15EN
11
#define RCC_APB2Periph_TIM16             RCC_APB2ENR_TIM16EN
12
#define RCC_APB2Periph_TIM17             RCC_APB2ENR_TIM17EN
13
#define RCC_APB2Periph_DBGMCU            RCC_APB2ENR_DBGMCUEN
14
15
#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFB8A5FE) == 0x00) && ((PERIPH) != 0x00))
16
17
/**
18
  * @}
19
  */ 
20
21
/** @defgroup RCC_APB1_Peripherals 
22
  * @{
23
  */
24
25
#define RCC_APB1Periph_TIM2              RCC_APB1ENR_TIM2EN    /*!< Only applicable for STM32F051 and STM32F072 devices */
26
#define RCC_APB1Periph_TIM3              RCC_APB1ENR_TIM3EN
27
#define RCC_APB1Periph_TIM6              RCC_APB1ENR_TIM6EN
28
#define RCC_APB1Periph_TIM7              RCC_APB1ENR_TIM7EN    /*!< Only applicable for STM32F072 devices */
29
#define RCC_APB1Periph_TIM14             RCC_APB1ENR_TIM14EN
30
#define RCC_APB1Periph_WWDG              RCC_APB1ENR_WWDGEN
31
#define RCC_APB1Periph_SPI2              RCC_APB1ENR_SPI2EN
32
#define RCC_APB1Periph_USART2            RCC_APB1ENR_USART2EN
33
#define RCC_APB1Periph_USART3            RCC_APB1ENR_USART3EN  /*!< Only applicable for STM32F072 devices */
34
#define RCC_APB1Periph_USART4            RCC_APB1ENR_USART4EN  /*!< Only applicable for STM32F072 devices */
35
#define RCC_APB1Periph_I2C1              RCC_APB1ENR_I2C1EN
36
#define RCC_APB1Periph_I2C2              RCC_APB1ENR_I2C2EN
37
#define RCC_APB1Periph_USB               RCC_APB1ENR_USBEN     /*!< Only applicable for STM32F072 and STM32F042 devices */
38
#define RCC_APB1Periph_CAN               RCC_APB1ENR_CANEN    /*!< Only applicable for STM32F072 and STM32F042 devices */
39
#define RCC_APB1Periph_CRS               RCC_APB1ENR_CRSEN     /*!< Only applicable for STM32F072 and STM32F042 devices*/
40
#define RCC_APB1Periph_PWR               RCC_APB1ENR_PWREN
41
#define RCC_APB1Periph_DAC               RCC_APB1ENR_DACEN     /*!< Only applicable for STM32F051 and STM32F072 devices */
42
#define RCC_APB1Periph_CEC               RCC_APB1ENR_CECEN     /*!< Only applicable for STM32F051, STM32F042 and STM32F072 devices */

Die müsste ich dann verbiegen.

Sorry, dass ich so dumm frage, aber ich stehe hier echt auf dem 
Schlauch...

Viele Grüße

Christoph

von Christoph N. (christoph_n)


Lesenswert?

Er hat einen APB2, sonst wäre TIM15 nicht gegegangen.

von Christian D. (chris83)


Lesenswert?

Christoph N. schrieb:
> /* TIM2 clock enable */
>   RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
           ^
Die Funktion ist für APB2, Timer 14 ist aber APB1.

von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

Bin jetzt zu faul ins Datenblatt zu sehen.
CubeMX Config im Bild.
Welcher F030 ist es genau?

von Christoph N. (christoph_n)


Lesenswert?

Ahh. Wie dumm von mir!

Christian D. schrieb:
> Christoph N. schrieb:
>> /* TIM2 clock enable */
>>   RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
>            ^
> Die Funktion ist für APB2, Timer 14 ist aber APB1.

Es geht wie im Anhang, falls das noch mal jemand braucht.

Vielen Dank allen Helfern!
1
void INTTIM_Config(void)
2
{
3
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
4
5
  NVIC_InitTypeDef NVIC_InitStructure;
6
  /* Enable the TIM2 gloabal Interrupt */
7
  NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
8
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
9
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
10
  NVIC_Init(&NVIC_InitStructure);
11
12
  /* TIM2 clock enable */
13
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
14
15
  /* Time base configuration */
16
  /* Berechnung der Frequenz:
17
   *
18
   * F_CLK=48Mhz
19
   * F_Timer=40kHz
20
   * TM_Period = F_CLK/F_Timer
21
   * <=> TM_Period = 48Mhz/40Khz = 1200
22
   * wenn Prescaler und Devision = 0
23
   *
24
   */
25
  TIM_TimeBaseStructure.TIM_Period = 1200; 
26
  TIM_TimeBaseStructure.TIM_Prescaler = 0; 
27
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
28
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
29
  TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
30
  /* TIM IT enable */
31
  TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE);
32
  /* TIM2 enable counter */
33
  TIM_Cmd(TIM14, ENABLE);
34
}
35
36
void TIM14_IRQHandler(void)
37
{
38
    TIM14->SR = ~0x0001;
39
    GPIOB->BSRR = GPIO_Pin_4;
40
    GPIOB->BRR = GPIO_Pin_4;
41
}

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.