클럭생성 및 클럭설정, 시스템이 동작하기 위한 System Clock/Bus Clock/Flash Clock을 생성하는 부분이다.

void SOSC_init_8MHz(void){
	SCG->SOSCDIV=SCG_SOSCDIV_SOSCDIV1(1)|
			SCG_SOSCDIV_SOSCDIV2(1);
	SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2)|
			SCG_SOSCCFG_EREFS_MASK;

	while(SCG->SOSCCSR&SCG_SOSCCSR_LK_MASK);
	SCG->SOSCCSR=SCG_SOSCCSR_SOSCEN_MASK;

	while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK));

}

void SPLL_init_160MHz(void){
	while(SCG->SPLLCSR &SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;
	SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2)|
			SCG_SPLLDIV_SPLLDIV2(3);
	SCG->SPLLCFG = SCG_SPLLCFG_MULT(24);

	while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR |=SCG_SPLLCSR_SPLLEN_MASK;

	while(!(SCG->SPLLCSR &SCG_SPLLCSR_SPLLVLD_MASK));
}


void NormalRUNmode_80MHz(void){
	SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1)
			| SCG_SIRCDIV_SIRCDIV2(1);

	SCG->RCCR=SCG_RCCR_SCS(6)
			|SCG_RCCR_DIVCORE(0b01)
			|SCG_RCCR_DIVBUS(0b01)
			|SCG_RCCR_DIVSLOW(0b10);

	while(((SCG->CSR & SCG_CSR_SCS_MASK) >>SCG_CSR_SCS_SHIFT) != 6){}
}

 

 

48번째 interrupt인 LPIT Channel 0 interrupt에 대한 NVIC설정을 한다.

void NVIC_init_IRQs(void){
	S32_NVIC->ICPR[1] |= 1 << (48 % 32);
	S32_NVIC->ISER[1] |= 1 << (48 % 32);
	S32_NVIC->IP[48] = 0xA;

}

 

 

LPIT Channel 0 Interrupt를 사용하기 위한 설정을 한다.

더보기

<관련 순서 참고>

① PCC_LPIT 레지스터를 통해 Source Clock을 SPLLDIV2_CLK로 설정하고, Clock enable을 한다.

② MCR 레지스터를 통해 모듈의 Clock enable을 한다.

③ MIER 레지스터를 통해 Channel 0에 대한 Interrupt를 Enable 한다.

④ 1초마다 Interrupt가 발생하도록 TVAL 레지스터를 설정한다 ( TVAL = 40000000 )

⑤ TCTRLn 레지스터를 통해 모드를 32-bit periodic counter 모드로 설정하고, LPIT를 동작시킨다 (TCTRLn 레지스터의 Reset value가 0이기 때문에 MODE/TSOT/TSOI/TROT/TRG_SRC/TRG_SEL은 따로 설정하지 않는다).

void LPIT0_init(void){
	PCC->PCCn[PCC_LPIT_INDEX] &= ~PCC_PCCn_PCS_MASK;
	PCC->PCCn[PCC_LPIT_INDEX]|=PCC_PCCn_PCS(6);
	PCC->PCCn[PCC_LPIT_INDEX] |= PCC_PCCn_CGC_MASK;

	LPIT0->MCR |= LPIT_MCR_M_CEN_MASK;

	LPIT0->MIER |=LPIT_MIER_TIE0_MASK;
	LPIT0->TMR[0].TVAL =40000000;
	LPIT0->TMR[0].TCTRL |=LPIT_TMR_TCTRL_T_EN_MASK;
}


void LPIT0_Ch0_IRQHandler(void){
	lpit0_ch0_flag_counter++;
	PTD->PTOR |=1<<0;
	LPIT0->MSR |= LPIT_MSR_TIF0_MASK;
}

 

 

 

포트 설정에관한 부분

void PORT_init(void){
	PCC->PCCn[PCC_PORTD_INDEX] |=PCC_PCCn_CGC_MASK;
	PORTD->PCR[0]&=~PORT_PCR_MUX_MASK;
	PORTD->PCR[0] |= PORT_PCR_MUX(1);
	PTD->PDDR |=1<<0;
}

 

 

 

main 함수

int main(void){
	PORT_init();
	SOSC_init_8MHz();
	SPLL_init_160MHz();
	NormalRUNmode_80MHz();
	NVIC_init_IRQs();
	LPIT0_init();
	for(;;){
		idle_counter++;
	}
}

 

 

 

 

LPIT0_init 에서 설정한대로 1초마다 한번씩 깜빡이는것을 확인할 수 있다.

'NXP&S32DesignStudio' 카테고리의 다른 글

전자시계 만들기  (0) 2021.01.17
PWM  (0) 2021.01.17
ADC  (0) 2021.01.17
GPIO & Switch  (0) 2021.01.17