클럭생성 및 클럭설정, 시스템이 동작하기 위한 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 |