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 :
Hier der komplette CooCox-Projektordner zum Download :
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:
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
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
In der Version 1.1 ist jetzt die neue Init-Funktion enthalten. Und die Funktionsnamen müssten schon alle unterschiedlich sein.
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)
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);
}
sind alle Header files eingebunden ?
so blöd war ich. Ich habe #include “misc.h” vergessen.
Es funktioniert vielen Dank.
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?
ja, das ist möglich (bis zu vier stück mit einem Timer)
Hallo,
wo finde ich die Libary Version 1.1?
Kann nur die V1.0 downloaden?
sicher ? die Version 1.0 liegt gar nicht mehr auf dem Server