Skocz do zawartości
aras

Niekończąca się pętla przez Tim_IRQ_Handler

Pomocna odpowiedź

Chce wykorzystać kod z artykułu wraz z przerwaniem TIM_IT_Update, problem w tym, że gdy mam zsetupowany kontroler przerwań NVIC, to program nie może wyjść z  TIM2_IRQHandler() pomimo tego, że czyszcze flage przez IM_ClearITPendingBit(TIM2, TIM_IT_Update);
Sam TIM2 działa bez zarzutu, i jestem w stanie migać diodą w pętli głównej programu, ale tylko gdy pominę setup NVIC w kodzie.

Co może być powodem tego problemu? Kompilator?

Program pisze pod STM32f103C8 na eclipsowym OpenSTM.

/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/


#include "stm32f10x.h"
			
void TIM2_IRQHandler()
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){
	 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

	if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))
	 GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	else
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
 }
}


int main(void){
 GPIO_InitTypeDef gpio;
 TIM_TimeBaseInitTypeDef tim;
 NVIC_InitTypeDef nvic;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 GPIO_StructInit(&gpio);
 gpio.GPIO_Pin = GPIO_Pin_13;
 gpio.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOC, &gpio);

 TIM_TimeBaseStructInit(&tim);
 tim.TIM_CounterMode = TIM_CounterMode_Up;
 tim.TIM_Prescaler = 7200 - 1;
 tim.TIM_Period = 10000 - 1;
 TIM_TimeBaseInit(TIM2, &tim);

 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
 TIM_Cmd(TIM2, ENABLE);

// nvic.NVIC_IRQChannel = TIM2_IRQn;
// nvic.NVIC_IRQChannelPreemptionPriority = 0;
// nvic.NVIC_IRQChannelSubPriority = 0;
// nvic.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&nvic);

 while (1) {
	 		int timerValue =	 TIM_GetCounter(TIM2);
	 		        if (timerValue > 1000)
	 		            GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
	 		        else
	 		            GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
 }
}

 

Udostępnij ten post


Link to post
Share on other sites

Skąd wiesz, że nie wychodzisz z TIM2_IRQHandler i co przez to rozumiesz?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...