보드의 ADC기능을 확인하기위해 가변저항을 사용해 변화되는 전압값에따른 LED의 밝기 차이를 확인할 것이다.
먼저 타이머 코드에서 사용한 클럭설정과 관련된 함수들을 가져오자.
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) {}
}
포트 설정에 관한 부분에서는
ADC 출력 값에 따라 LED 색이 바뀌는 예제이므로 Blue, Red, Green LED 모두를 사용한다.
void PORT_init(void){
PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK;
PORTD->PCR[PTD0] = PORT_PCR_MUX(1);
PORTD->PCR[PTD15] = PORT_PCR_MUX(1);
PORTD->PCR[PTD16] = PORT_PCR_MUX(1);
PTD->PDDR |= 1<<PTD0
|1<<PTD15
|1<<PTD16;
}
본 ADC구현과 관련된 함수들이다.
더보기
ADC초기설정과 관련된 순서는 다음과 같다.
① PCC_ADC0 레지스터를 통해 ADC의 클럭을 선택하고 Enable한다.
② SC1[0] 레지스터를 통해 모듈의 conversion과 interrupt를 Disable한다.
③ CFG1 레지스터를 통해 ADC 입력 클럭과 해상도를 설정한다.
④ CFG2 레지스터를 통해 ADC의 sample time을 설정한다.
⑤ SW Trigger이고, Compare function은 사용하지 않으므로 SC2 레지스터를 0으로 세팅한다.
⑥ Calibration을 하지 않고 One conversion 모드이므로 SC3 레지스터를 0으로 세팅한다.
void ADC_init(void){
PCC->PCCn[PCC_ADC0_INDEX] &= ~PCC_PCCn_CGC_MASK;
PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1);
PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK;
ADC0->SC1[0] |= ADC_SC1_ADCH_MASK;
ADC0->CFG1 &= ~ADC_CFG1_ADIV_MASK;
ADC0->CFG1 |= ADC_CFG1_MODE(1);
ADC0->CFG2 = ADC_CFG2_SMPLTS(12);
ADC0->SC2 = 0x00000000;
ADC0->SC3 = 0x00000000;
}
void convertAdcChan(uint16_t adcChan){
ADC0->SC1[0] &= ~ADC_SC1_ADCH_MASK;
ADC0->SC1[0] |= ADC_SC1_ADCH(adcChan);
}
uint8_t adc_complete(void){
return ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) >>ADC_SC1_COCO_SHIFT);
}
uint32_t read_adc_chx(void){
uint16_t adc_result = 0;
adc_result = ADC0->R[0];
return (uint32_t)((5000*adc_result)/0xFFF);
}
'NXP&S32DesignStudio' 카테고리의 다른 글
전자시계 만들기 (0) | 2021.01.17 |
---|---|
PWM (0) | 2021.01.17 |
Timer Interrupt (0) | 2021.01.17 |
GPIO & Switch (0) | 2021.01.17 |