Home > Study > C Language > ARM System Programming > [ex19] TIMER_EVENT_LAB

[ex19] TIMER_EVENT_LAB
Study Language

문제 설명


// timer.c
void TIM4_Repeat_Interrupt_Enable(int en, int time)
{
	if(en)
	{
		Macro_Set_Bit(RCC->APB1ENR, 2);

		TIM4->CR1 = (1<<4)|(0<<3);
		TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1;
		TIM4->ARR = TIME4_PLS_OF_1ms * time;
		Macro_Set_Bit(TIM4->EGR,0);

		// TIM4->SR 레지스터에서 Timer Pending Clear

		// NVIC에서 30번 인터럽트 Pending Clear => NVIC용 Macro 사용

		// TIM4->DIER 레지스터에서 Timer 인터럽트 허용

		// NVIC에서 30번 인터럽트를 허용으로 설정 => NVIC용 Macro 사용

		// TIM4 Start

	}

	else
	{
		NVIC_DisableIRQ(30);
		Macro_Clear_Bit(TIM4->CR1, 0);
		Macro_Clear_Bit(TIM4->DIER, 0);
	}
}

정답 코드


void TIM4_Repeat_Interrupt_Enable(int en, int time)
{
	if(en)
	{
		Macro_Set_Bit(RCC->APB1ENR, 2);

		TIM4->CR1 = (1<<4)|(0<<3);
		TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1;
		TIM4->ARR = TIME4_PLS_OF_1ms * time;

		Macro_Set_Bit(TIM4->EGR,0);
		Macro_Clear_Bit(TIM4->SR, 0);
		NVIC_ClearPendingIRQ(30);
		Macro_Set_Bit(TIM4->DIER, 0);
		NVIC_EnableIRQ(30);
		Macro_Set_Bit(TIM4->CR1, 0);
	}

	else
	{
		NVIC_DisableIRQ(30);
		Macro_Clear_Bit(TIM4->CR1, 0);
		Macro_Clear_Bit(TIM4->DIER, 0);
	}
}

메모


printf 내부의 \n 습관화 필요