Hallo Community,
kämpfe seit Stunden mit einem STM32 (STM103F103RBT6 - Olimex Protoboard)
und bringe es nicht zustande, einen Capture-Compare-Interrupt
auszulösen.
Es handelt sich um den LED-Blink-Beispielcode von Olimex für die EWARM,
der Code arbeitet mit dem Timer1-Update-Interrupt und ich wollte ihn auf
CaptureCompare ummodeln.
Das Oszilloskop zeigt an, dass die CC-Interruptroutine angesprungen
wird, aber erst bei einem Update Event (ca. alle 655 ms, also
0xFFFF-Überlauf). Dass CC1F-Flag dürfte gesetzt werden, löst von alleine
aber noch keinen Interrupt aus.
Ich initialisiere den Timer1:
1 | // Set timer period 0.1 sec
|
2 | TIM_TimeBaseInitStruct.TIM_Prescaler = 720; // 10us resolution
|
3 | TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
|
4 | TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
|
5 | TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
|
6 | TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
|
7 | TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
|
8 |
|
9 | TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;
|
10 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
|
11 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
|
12 | TIM_OCInitStructure.TIM_Pulse=10000;
|
13 |
|
14 | TIM_OC1Init(TIM1, &TIM_OCInitStructure);
|
15 |
|
16 | // Clear update interrupt bit
|
17 | TIM_ClearITPendingBit(TIM1, TIM_IT_CC1|TIM_IT_Update);
|
18 | // Enable update interrupt
|
19 | TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
|
20 |
|
21 | // Enable timer counting
|
22 | TIM_Cmd(TIM1, ENABLE);
|
und den NVIC:
1 | NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
|
2 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
|
3 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
4 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
5 | NVIC_Init(&NVIC_InitStructure);
|
Die Interruptroutine:
1 | void TIM1_CC_IRQHandler(void)
|
2 | {
|
3 | if(TIM_GetITStatus(TIM1, TIM_IT_CC1)!=RESET)
|
4 | {
|
5 | TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
|
6 |
|
7 | state=1;
|
8 | }
|
9 | }
|
(state löst dann in einer Main-while(1)-Schleife das Setzen des
Port-Pins aus)
Alle anderen Einstellungen (Clock, APB2,...) hab ich direkt aus dem
Original-Code übernommen und sollten funktionieren.
Bin ich zu blöd? Hab ich was übersehen? Habe schon alle Timer
durchprobiert, das Problem tritt immer auf.
Ein für jeden Hinweis dankbarer
Peter