55-Timer-Library (STM32F4)

Mit diesen Librarys können die Timer vom STM32F4 im “Count_Up-Mode” benutzt werden.

Es gibt für die Timer “TIM2, TIM3, TIM4, TIM5″ je eine Library.

Beim initialisieren muss der Prescaler und der Periodenwert übergeben werden. Daraus leitet sich dann die FRQ vom Timer-Interrupt ab.
FRQ = 84MHz / (Prescaler+1) / (Periode+1)

Oder (ab Version 1.1) kann die Init-Funktion mit Übergabe von einem Frq-Wert
(in Hz) aufgerufen werden. (Hinweis : durch Rundungsfehler entspricht der Istwert u.U. nicht 100% dem Sollwert…bitte nachrechnen, falls das für das Programm wichtig ist)

Danach muss der Timer noch mit einer Funktion gestartet werden.

Die ISR_CallBack-Funktion wird dann zyklisch aufgerufen und kann nach eigenen wünschen ausprogrammiert werden.

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : TIM, MISC
Benutzte Librarys : keine

Funktionen (für Timer mit TIM2) :

1
2
3
4
5
void UB_TIMER2_Init(uint16_t prescaler, uint16_t periode);  // zum init vom Timer (per Vorteilerwerte)
void UB_TIMER2_Init_FRQ(uint32_t frq_hz);                   // zum init vom Timer (per Frq)
void UB_TIMER2_Start(void);                                 // zum starten vom Timer
void UB_TIMER2_Stop(void);                                  // zum anhalten vom Timer
void UB_TIMER2_ISR_CallBack(void);                          // Diese Funktion muss extern benutzt werden !!

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//--------------------------------------------------------------
// File     : main.c
// Datum    : 20.08.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der Timer Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_tim2.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init der LEDs
  UB_Led_Init();
 
  // Init vom Timer2
  // mit f = 1 Hz
  UB_TIMER2_Init(8399,9999);
 
  // Timer2 starten
  UB_TIMER2_Start();
 
  while(1)
  {
 
  }
}
 
//--------------------------------------------------------------
// ISR von Timer2
//--------------------------------------------------------------
void UB_TIMER2_ISR_CallBack(void)
{
  UB_Led_Toggle(LED_GREEN);	// led blinken lassen
}

Hier die Library zum Download :

ub_stm32f4_timer_v101

Hier der komplette CooCox-Projektordner zum Download :

Demo_55_Timer

11 Antworten auf 55-Timer-Library (STM32F4)

  1. Jan sagt:

    Moin moin,

    da ich zu faul bin, prescaler und periode selbst zu berechnen, habe ich mal eine Funktion hinzugefügt, die das für mich erledigt:

    void UB_TIMER2_Init_WithFrequency( int desiredFreqInHz )
    {
        // Hole Taktfrequenz
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq(&RCC_Clocks);
        int inputClkFreq = RCC_Clocks.PCLK1_Frequency;
    
        // Berechne prescaler und periode
        int frequencyDivNecessary = (float) inputClkFreq / desiredFreqInHz;
        frequencyDivNecessary >> 16;// Schiebe 16 Bit nach links, da 16 Bit breite periode moeglich
        int timerMaxCountValue = ( inputClkFreq / (frequencyDivNecessary + 1) ) / desiredFreqInHz;
    
    // Setze Timer auf
    UB_TIMER2_Init(frequencyDivNecessary, timerMaxCountValue);
    }
    

    Vielleicht ist das ja eine sinnvolle Ergänzung zu deinen Libraries.

    Dazu noch ein Hinweis: Timer2 soll eigentlich an der 42 MHz Clock hängen (das sagt jedenfalls die Funktion IS_RCC_APB1_PERIPH), er scheint aber an der 84er zu hängen, jedenfalls kriegte ich bei 1000er Teilung einen Takt von 84 KHz am Oszi raus. Der obige Code läuft bei mir so jedenfalls 1a.

    Liebe Grüße, Jan

    • Jan sagt:

      Zwei Ergänzungen noch: Der Funktionsparameter ist eigentlich ein Int. Da hat sich der Fehlerteufel eingeschlichen.

      Und: Wenn man alle Timer Libs von dir gleichzeitig einbindet, gibt es Probleme, weil Funktionsnamen gleich sind. Du könntest ja ggfs. die Funktionsnamen mit einem Timerspezifischen Suffix verstehen. Dann läufts :)

      • admin_ub sagt:

        In der Version 1.1 ist jetzt die neue Init-Funktion enthalten. Und die Funktionsnamen müssten schon alle unterschiedlich sein.

    • admin_ub sagt:

      ok, wenn das funktioniert werd ich es für die Library übernehmen.
      P.S. der Eingangs-Clock vom Timer2 ist 42MHz aber alle Timer laufen intern mit dem doppelten Eingangs Wert …hier also 84MHz. Timer-1 läuft z.B. mit 168 MHz (obwohl ABP2 = 84MHz ist)

  2. MC.Einsteiger sagt:

    Hallo Zusammen,
    Erstmal vielen Danke Uwe für die Lib.

    Ich habe folgende Problem und zwar das folgende Programm zeigt mir viele Fehler,die ich bis jetzt nicht nachvollziehen und lösen konnten..!!
    kann jemand vielleicht helfen?

    Liebe Grüße Rick

    #include
    #include
    #include "stm32f4xx.h"
    #include "stm32_ub_led.h"

    void init()
    {

    SysTick_Config(SystemCoreClock/100);

    // GPIOD Takt einschalten
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    // Konfiguriere PD15
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    // Takt für Timer 7 einschalten
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

    // Timer7 konfigurieren
    TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
    TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBase_InitStructure.TIM_Period = 4200;
    TIM_TimeBase_InitStructure.TIM_Prescaler = 1000;
    TIM_TimeBaseInit(TIM7, &TIM_TimeBase_InitStructure);
    TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

    // Timer7 einschalten
    TIM_Cmd(TIM7, ENABLE);

    // Interruptcontroller konfigurieren
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_Init(&NVIC_InitStructure);

    }

    int main(void)
    {
    SystemInit();
    init();
    while(1)
    {
    //leer
    }
    }

    void SysTick_Handler(void)
    {

    }

    void TIM7_IRQHandler()
    {
    UB_Led_Toggle(LED_RED);
    TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
    }

    • admin_ub sagt:

      sind alle Header files eingebunden ?

      #include "stm32f4xx_gpio.h"
      #include "stm32f4xx_rcc.h"
      #include "stm32f4xx_tim.h"
      #include "misc.h"
      

      • MC.Einsteiger sagt:

        so blöd war ich. Ich habe #include “misc.h” vergessen.
        Es funktioniert vielen Dank.

  3. Tine sagt:

    Hallöchen,
    ich habe eine Frage, ist es möglich mit einem Timer mehrer Interruptflags auszulösen?
    Was ich meine ist: ich setze die Periode auf 100, da wird ein Interrupt ausgelöst. Aber ich möchte, dass auch mit dem selben Timer bei 50 ein Interrupt ausgelösst wird. Kann ich das vielleicht mit einem Compare register realisieren?

    • admin_ub sagt:

      ja, das ist möglich (bis zu vier stück mit einem Timer)

  4. Alex sagt:

    Hallo,

    wo finde ich die Libary Version 1.1?

    Kann nur die V1.0 downloaden?

    • admin_ub sagt:

      sicher ? die Version 1.0 liegt gar nicht mehr auf dem Server :-)


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert