Hallo bin mir nicht sicher aber könnt ihr mir schreiben ob hier was falsch ist ? Ich will einen 1 ms Timer haben, mein System_clk ist 72 Mhz aber irgendwie kommt nicht so das wie erwartet. TIM_TimeBaseStructure->TIM_Prescaler = 360 - 1; // 72 MHz / 360 = 200 khz TIM_TimeBaseStructure->TIM_Period = 200 - 1; // (1/200khz) * 200 = 1 ms; Kann man mit Hterm das erfassen ?
mhh interessant , wenn ich TIM2_Tick >= 1000 so lasse ,dann blinkt meine LED so schnell das ich sie nicht erfassen kann aber eigentlich 1ms*1000=1s sollte sie ja jede Sekunde blinken . Wenn ich TIM2_Tick >= 1000000 mache dann blinkt die LED in 34 Sek 30 mal....irgendwas ist faul.....
1 | void TIM2_IRQHandler(void) |
2 | {
|
3 | static int TIM2_Tick = 0; |
4 | |
5 | TIM2_Tick++; |
6 | |
7 | if (TIM2_Tick >= 1000) // 1 Second |
8 | {
|
9 | if(check == 0) |
10 | {
|
11 | STM_EVAL_LEDOn(LED1); |
12 | check=1; |
13 | }
|
14 | else
|
15 | {
|
16 | STM_EVAL_LEDOff(LED1); |
17 | check =0; |
18 | }
|
19 | |
20 | TIM2_Tick = 0; |
21 | }
|
22 | |
23 | }
|
1 | void Config_Timer(TIM_TimeBaseInitTypeDef *TIM_TimeBaseStructure, NVIC_InitTypeDef *NVIC_InitStructure) |
2 | {
|
3 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); |
4 | |
5 | /* Enable the Timer2 Interrupt */
|
6 | NVIC_InitStructure->NVIC_IRQChannel = TIM2_IRQn; // configure the Timer2 interrupts |
7 | NVIC_InitStructure->NVIC_IRQChannelPreemptionPriority = 0; // sets the priority group of the TIMER2 interrupts |
8 | NVIC_InitStructure->NVIC_IRQChannelSubPriority = 1; // set the subpriority inside the group |
9 | NVIC_InitStructure->NVIC_IRQChannelCmd = ENABLE; // TIMER2 interrupts are globally enabled |
10 | NVIC_Init(NVIC_InitStructure); |
11 | |
12 | /* Configure Timer which is every 1 ms active*/
|
13 | TIM_DeInit(TIM2); |
14 | TIM_TimeBaseStructInit(TIM_TimeBaseStructure); |
15 | |
16 | /* Time base configuration */
|
17 | TIM_TimeBaseStructure->TIM_Prescaler = 360 - 1; // 72 MHz / 360 = 200 khz |
18 | TIM_TimeBaseStructure->TIM_Period = 200 - 1; // (1/200khz) * 200 = 1 ms; |
19 | TIM_TimeBaseStructure->TIM_ClockDivision = 0; |
20 | TIM_TimeBaseStructure->TIM_CounterMode = TIM_CounterMode_Up; |
21 | TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); |
22 | |
23 | |
24 | |
25 | /* Enable TIM2 Update Interrupt */
|
26 | TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); |
27 | |
28 | /* Enable TIM2 */
|
29 | TIM_Cmd(TIM2,ENABLE); |
30 | |
31 | }
|
32 | |
33 | |
34 | |
35 | void TIM2_IRQHandler(void) |
36 | {
|
37 | static int TIM2_Tick = 0; |
38 | TIM_ClearITPendingBit(TIM2, TIM_IT_Update); |
39 | |
40 | TIM2_Tick++; |
41 | |
42 | if (TIM2_Tick >= 1000) // 1 Second |
43 | {
|
44 | if(check == 0) |
45 | {
|
46 | STM_EVAL_LEDOn(LED1); |
47 | check=1; |
48 | }
|
49 | else
|
50 | {
|
51 | STM_EVAL_LEDOff(LED1); |
52 | check =0; |
53 | }
|
54 | |
55 | TIM2_Tick = 0; |
56 | }
|
57 | }
|
Hab gemerkt das ich den Interrupt zurücksetzen muss und habe noch meinen Handler mit TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ergänzt aber dennoch bekomme ich 10 Ticks bei 19 Sekunden
Da fehlt noch die Konfiguration deiner Clocks. Es gibt von ST ein Excel Sheet mit dem man das sehr übersichtlich einstellen kann. Der Timer2 Takt hängt vom APB1 Prescaler ab, und ich vermute mal, dein Timer läuft nicht mit 72MHz sondern mit 36MHz(falls der Controller selbst denn wirklich mit 72MHz läuft)
:
Bearbeitet durch User
Also ich habe mal meinen SystemCoreClock ausgegeben und de Betrug 72Mhz allerdings könntest was dran sein, was du sagst. Beim TIM2 Eingang ist 36Mhz beim Ausgang aber 72Mhz....nun was ist da richtig ?
Das ist ja nur ein Beispiel und hat nix mit dem zu tun was tatsächlich bei dir Konfiguriert ist.
Oh, stimmt ja. Ich war irgendwie beim F2 da ich mehr mit dem zu tun habe. Dann wie von Pete K. schon vorgeschlagen: http://diller-technologies.de/stm32.html#takt Und wenn man mal von den Standardeinstellung ausgeht, dann scheint der Timer wirklich mit 36MHz zu laufen, aber da musste mal schauen was bei dir eingestellt ist.
Debugger dran? Dann schau in die Register. Wenn nicht, LED dran, 10Sek einstellen & Uhr daneben, sei ein bisl kreativ :-)
Benutzt du ein Discovery Board? Dann wär der Debugger dabei. Oder womit entwickelst du?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.