Hallo Forum,
da meine Suche erfolglos geblieben ist und ich die nötige Information
nicht aus den diversen Manuals herausfiltern kann meine Frage:
Wie muss ich einen Timmer auf einer stm32f30x einstellen, um einen
Interrupt bei CompareMatch zu bekommen?
Ich benutzte das DiscoveryF3 Board und hangele mich durch die
zugehörigen Beispiele der standard Peripheral Library und versuche Stück
für Stück dinge zu kombinieren.
Im Moment eben das blinken einer LED in der ISR zu realisieren. Durch
pures Delay und pollen des Timerstandes habe ich es hinbekommen.
Mit folgenden Inits tut sich zwar was, aber es ist ganz sicher kein
Compare Match, da der Wert den ich TIM_PULSE schreibe keinen Einfluss
hat. Überhaupt ist es kein Unterschied, ob ich den dazugehörigen Block
auskommentiere oder nicht:
1 | /* TIM3 clock enable */
|
2 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
|
3 |
|
4 | /* Enable the TIM3 gloabal Interrupt */
|
5 | NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
|
6 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
7 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
8 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
9 | NVIC_Init(&NVIC_InitStructure);
|
10 |
|
11 | /* Time base configuration */
|
12 | TIM_TimeBaseStructure.TIM_Period = 65535;
|
13 | TIM_TimeBaseStructure.TIM_Prescaler = 50;
|
14 | TIM_TimeBaseStructure.TIM_ClockDivision = 0;
|
15 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
16 | TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
|
17 |
|
18 |
|
19 | /* Output Compare Timing Mode configuration: Channel1 */
|
20 | TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
|
21 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
22 | TIM_OCInitStructure.TIM_Pulse = 15000;
|
23 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
|
24 |
|
25 | TIM_OC1Init(TIM3, &TIM_OCInitStructure);
|
26 |
|
27 | TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
|
28 | TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
|
29 | TIM_Cmd(TIM3, ENABLE);
|
und die ISR
1 | void TIM3_IRQHandler(void)
|
2 | {
|
3 |
|
4 | tmp++;
|
5 | // if(tmp == 10)
|
6 | // {
|
7 | // GPIOE->BSRR = BSRR_VAL1;
|
8 | // }
|
9 | // if(tmp == 100)
|
10 | // {
|
11 | // GPIOE->BSRR = BSRR_VAL2;
|
12 | // GPIOE->BRR = BSRR_VAL1;
|
13 | // tmp = 0;
|
14 | // }
|
15 | if(tmp == 10)
|
16 | {
|
17 | GPIOE->BSRR = BSRR_VAL1;
|
18 | }
|
19 | if(tmp == 20)
|
20 | {
|
21 | GPIOE->BRR = BSRR_VAL1;
|
22 | tmp = 0;
|
23 | }
|
24 | TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
|
25 | }
|
Sieht jemand den Fehler?