The Man
02.12.2012, 09:14
Hallo,
ich mache erste Schritte mit dem DISCOVERYF3 Board, hangele mich durch die Beispiele und versuche die üblichen ersten Sachen zu machen (Lampe an, Lampe per delay blinken, Lampe blinken mit Timer pollen...)
Jetzt will ich die Lampe per ISR blinken lassen und das als Compare Match Interrupt. An dieser Stelle bin ich dann nicht richtig durchgestiegen.
In der stm32f30x.h Datei sind ja die verschiedenen Interrups augelistet. Da gibt es jetzt z.B. für den Timer2 keinen "TIM2_CC_IRQn" Eintrag. Kann der also gar keinen Compare Match Interrupt erzeugen? Denn im Reference Maual RM0316 Seite 448 sind Compare Interrupte eingezeichnet. Und wie ist das dann mit der ISR - gibt es für jeden Channel eine eigene ISR oder muss ich das in einer eigenen CompareMatchISR auseinanderklamüsern wer das war?
Unten ein Versuch das mit dem Timer1 zu machen. Es blinkt zwar was, aber ich bin mit recht sicher, dass es kein Match Interrupt ist, da das Verhalten gleich ist, egal ob ich die /* Output Compare Timing Mode configuration: Channel1 */ Struktur auskommentiere oder nicht.
Kann da jemand weiterhelfen?
Der InitCode
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* Enable the TIM3 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 50;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Output Compare Timing Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
ISR Code
void TIM1_CC_IRQHandler(void)
{
tmp++;
if(tmp == 10)
{
GPIOE->BSRR = BSRR_VAL1;
}
if(tmp == 20)
{
GPIOE->BRR = BSRR_VAL1;
tmp = 0;
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
}
ich mache erste Schritte mit dem DISCOVERYF3 Board, hangele mich durch die Beispiele und versuche die üblichen ersten Sachen zu machen (Lampe an, Lampe per delay blinken, Lampe blinken mit Timer pollen...)
Jetzt will ich die Lampe per ISR blinken lassen und das als Compare Match Interrupt. An dieser Stelle bin ich dann nicht richtig durchgestiegen.
In der stm32f30x.h Datei sind ja die verschiedenen Interrups augelistet. Da gibt es jetzt z.B. für den Timer2 keinen "TIM2_CC_IRQn" Eintrag. Kann der also gar keinen Compare Match Interrupt erzeugen? Denn im Reference Maual RM0316 Seite 448 sind Compare Interrupte eingezeichnet. Und wie ist das dann mit der ISR - gibt es für jeden Channel eine eigene ISR oder muss ich das in einer eigenen CompareMatchISR auseinanderklamüsern wer das war?
Unten ein Versuch das mit dem Timer1 zu machen. Es blinkt zwar was, aber ich bin mit recht sicher, dass es kein Match Interrupt ist, da das Verhalten gleich ist, egal ob ich die /* Output Compare Timing Mode configuration: Channel1 */ Struktur auskommentiere oder nicht.
Kann da jemand weiterhelfen?
Der InitCode
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* Enable the TIM3 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 50;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Output Compare Timing Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
ISR Code
void TIM1_CC_IRQHandler(void)
{
tmp++;
if(tmp == 10)
{
GPIOE->BSRR = BSRR_VAL1;
}
if(tmp == 20)
{
GPIOE->BRR = BSRR_VAL1;
tmp = 0;
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
}