Oder auch nicht - nach 10 bis 15 Interrupts bzw. 60-90 ms ist Schluss,
der Flankeninterrupt wird nicht mehr ausgeführt.
Offenbar deaktiviert sich da etwas unbeabsichtig.
Muss man dabei den Timerüberlauf o.Ä. beachten?
Hier mal die Konfiguration des Timers:
1 | TIM_TimeBase_InitStructure.TIM_Period = 9999;
|
2 | TIM_TimeBase_InitStructure.TIM_Prescaler = (SystemCoreClock / 10000) - 1;
|
3 | TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
4 | TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
5 | TIM_TimeBaseInit(TIM4, &TIM_TimeBase_InitStructure);
|
6 | TIM_IC_InitStructure.TIM_Channel = TIM_Channel_2;
|
7 | TIM_IC_InitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
|
8 | TIM_IC_InitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
|
9 | TIM_IC_InitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
|
10 | TIM_IC_InitStructure.TIM_ICFilter = 0x02;
|
11 | TIM_ICInit(TIM4,&TIM_IC_InitStructure);
|
12 | TIM_PWMIConfig(TIM4, &TIM_IC_InitStructure);
|
13 | TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
|
14 | TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);
|
15 | TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
|
16 | TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
|
17 | NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
|
18 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
|
19 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
|
20 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
21 | NVIC_Init(&NVIC_InitStructure);
|
22 | TIM_Cmd(TIM4, ENABLE);
|
Und so versuche ich, die Interrupts einzusetzen:
1 | void TIM4_IRQHandler(void) {
|
2 | if( TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET ) {
|
3 | TIM_ITConfig(TIM4, TIM_IT_CC3, DISABLE);
|
4 | TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
|
5 |
|
6 | TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
|
7 | } else {
|
8 |
|
9 | if( TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET ) {
|
10 | TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
|
11 |
|
12 | GPIOB->BSRR = ((GPIOB->ODR ^ GPIO_Pin_8) & GPIO_Pin_8) | (GPIO_Pin_8 << 16);
|
13 |
|
14 | TIM_ITConfig(TIM4, TIM_IT_CC2, DISABLE);
|
15 |
|
16 | TIM4->CCR3 = TIM4->CNT + 30;
|
17 | TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
|
18 | TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
|
19 | ...
|
Mit den Interruptprioritäten habe ich mich noch nicht beschäftigt -
stimmt bei der Konfiguration alles?