Skocz do zawartości

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


aras

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);
 }
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.