Thank you for your reply.
I tried many things, but I failed.
I'm using a personal pcb, not a pcb of nxp.
I'm still a trainee, but I think I should let this go. It's hard because the current doesn't decrease and I don't wake up. MCU died twice during the attempt. Thank you so much.
If you have time later, please give me your last advice.
I'll leave some but not all of them.
void Sleep(void)
{
PTC->PSOR |= (1<<6); //MCU CAN off
PTA->PSOR |= (1<<10)|(1<<11);//A3922 reset, A3922 ENABLE off
NVIC_DisableIRQ(LPIT0_Ch0_IRQn);//저전력 타이머 슬립모드 관련 지어야 할듯 LPIT가 맞나 LPTMR이 맞나..15초 후 슬립모드 가는거면 LPTMR이 나을듯TMR할거면 2.2예제
NVIC_DisableIRQ(FTM1_Ovf_Reload_IRQn); // 오버플로우 인터럽트 끄기 ISR OFF
NVIC_DisableIRQ(PORTC_IRQn); //PORTC 인터럽트 홀카운트 끄기
FTM0->SC &= ~FTM_SC_CLKS_MASK;//FTM끄기
FTM1->SC &= ~FTM_SC_CLKS_MASK;//FTM끄기
CAN0->MCR |= CAN_MCR_MDIS_MASK;//CAN OFF
PCC->PCCn[PCC_FTM0_INDEX] = PCC_PCCn_PCS(0) | PCC_PCCn_CGC(0); //클럭활성화, FTM0 활성화
PCC->PCCn[PCC_FTM1_INDEX] = PCC_PCCn_PCS(0) | PCC_PCCn_CGC(0); // 클럭활성화, FTM1 활성화
PCC->PCCn[PCC_ADC0_INDEX] = PCC_PCCn_PCS(0) | PCC_PCCn_CGC(0); // ADC0에 출력
//ADC0->SC1[0] = ADC_SC1_AIEN(0); //ADC OFF 채널4,5 활성화
init_SIRC();//1MHz
SCG->RCCR = SCG_RCCR_SCS(2); // SIRC를 시스템 클럭으로 선택
//while(SCG->CSR & SCG_CSR_SCS_MASK); // 클럭 스위칭이 완료될 때까지 대기
//SCG->SPLLCSR = SCG_SPLLCSR_SPLLEN(0);
//SCG->FIRCCSR = SCG_FIRCCSR_FIRCEN(0);
//SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN(0);
S32_SCB->SCR = S32_SCB_SCR_SLEEPDEEP_MASK;
SMC->PMPROT = SMC_PMPROT_AVLP_MASK; // VLPS 허용
SMC->PMCTRL = SMC_PMCTRL_STOPM(2); // VLPR 동작, VLPS SMC_PMCTRL_RUNM(2)|
PMC->REGSC = PMC_REGSC_BIASEN(1) | PMC_REGSC_CLKBIASDIS(1)|PMC_REGSC_LPODIS(1);
//SCG->VCCR=SCG_VCCR_SCS(2); //SIRC사용 8Mhz
STANDBY(); //인터럽트 대기
}
void wake(void)
{
//SCG->SPLLCSR = SCG_SPLLCSR_SPLLEN(1);
//SCG->FIRCCSR = SCG_FIRCCSR_FIRCEN(1);
//SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN(1);
SCG->RCCR = SCG_RCCR_SCS(6); // SIRC를 시스템 클럭으로 선택
while(SCG->CSR & SCG_CSR_SCS_MASK); // 클럭 스위칭이 완료될 때까지 대기
NVIC_EnableIRQ(LPIT0_Ch0_IRQn);//저전력 타이머 슬립모드 관련 지어야 할듯 LPIT가 맞나 LPTMR이 맞나..15초 후 슬립모드 가는거면 LPTMR이 나을듯TMR할거면 2.2예제
NVIC_EnableIRQ(FTM1_Ovf_Reload_IRQn); // 오버플로우 인터럽트 끄기 ISR OFF
NVIC_EnableIRQ(PORTC_IRQn); //PORTC 인터럽트 홀카운트 끄기
FTM0->SC |= FTM_SC_CLKS(3);//FTM끄기
FTM1->SC |= FTM_SC_CLKS(3);//FTM끄기
CAN0->MCR &= ~CAN_MCR_MDIS_MASK;//CAN OFF
//PCC->PCCn[PCC_FlexCAN0_INDEX] |= PCC_PCCn_CGC_MASK; //CAN0 활성화
PCC->PCCn[PCC_FTM0_INDEX] = PCC_PCCn_PCS(1) | PCC_PCCn_CGC_MASK; //클럭활성화, FTM0 활성화
PCC->PCCn[PCC_FTM1_INDEX] = PCC_PCCn_PCS(1) | PCC_PCCn_CGC_MASK; // 클럭활성화, FTM1 활성화
PCC->PCCn[PCC_ADC0_INDEX] = PCC_PCCn_PCS(1) | PCC_PCCn_CGC_MASK; // ADC0에 출력
PTC->PCOR |= (1<<6); //MCU CAN
PTA->PCOR |= (1<<10)|(1<<11);//A3922 리셋 A3922 ENABLE
}
void BoardInit(void)
{
PCC->PCCn[PCC_PORTA_INDEX] = PCC_PCCn_CGC_MASK; //포트A에 클럭 출력
PCC->PCCn[PCC_PORTB_INDEX] = PCC_PCCn_CGC_MASK; //포트B에 클럭 출력
PCC->PCCn[PCC_PORTC_INDEX] = PCC_PCCn_CGC_MASK; //포트C에 클럭 출력
//PCC->PCCn[PCC_PORTD_INDEX] = PCC_PCCn_CGC_MASK; //포트D에 클럭 출력
PCC->PCCn[PCC_PORTE_INDEX] = PCC_PCCn_CGC_MASK; //포트E에 클럭 출력
PTA->PDDR = (0<<0)|(0<<1)|(1<<10)|(1<<11)|(0<<13); //PTA0 입력(IGN),PTA1 입력(스위치),PTA10은 A3922리셋,PTA11은 A3922EN,13은 언락스위치
PTB->PDDR = (1<<5); //PTB2 출력 크리스탈 타이머 / PTB4 출력 CCW / PTB5 출력 CW/ PTB6 입력 크리스탈/ PTB7 출력 크리스탈 |(0<<6)|(1<<7) (1<<2)|
PTC->PDDR = (1<<1)|(0<<3)|(1<<6); //PTC3번은 홀센서 인풋, PTC6은 MCU CAN
//PTD->PDDR = (1<<0)|(1<<1)|(1<<2)|(1<<3); //게이트 드라이버 시리얼 머시기 인데 보류
PTA->PCOR = (1<<10)|(1<<11);
PTC->PCOR = (1<<6); //MCU CAN
PORTA->PCR[0] = PORT_PCR_MUX(1);//|PORT_PCR_ISF(1)|PORT_PCR_IRQC(9); //PTA1번 GPIO로 설정 (IGN스위치)
PORTA->PCR[1] = PORT_PCR_MUX(1); //PTA1번 GPIO로 설정 (CS스위치)
PORTA->PCR[13] = PORT_PCR_MUX(1); //PTA13번 GPIO로 설정 (UL스위치)
//PORTB->PCR[2] = PORT_PCR_MUX(1); //PTB2번 GPIO로 설정 (타이머)
PORTA->PCR[10] = PORT_PCR_MUX(1);
PORTA->PCR[11] = PORT_PCR_MUX(1);
PORTB->PCR[4] = PORT_PCR_MUX(2); //PTB4번 PWM로 설정
PORTB->PCR[5] = PORT_PCR_MUX(1); //PTB5번 GPIO로 설정
PORTE->PCR[8] = PORT_PCR_MUX(2); //PTE8번 PWM로 설정
PORTC->PCR[1] = PORT_PCR_MUX(1); //PTC1번 GPIO로 설정
PORTC->PCR[6] = PORT_PCR_MUX(1); //PTC6 MCU CAN
PORTE->PCR[4] = PORT_PCR_MUX(5); //PTE4 CAN RX
PORTE->PCR[5] = PORT_PCR_MUX(5); //PTE5 CAN TX
//-----------SDI PTD1 CS PTD3 SDO PTD2 SCK PTD0
PORTC->PCR[3] = PORT_PCR_MUX(1)|PORT_PCR_ISF(1)|PORT_PCR_IRQC(9); //홀센서 PTC3번 GPIO, 인터럽트, 라이징
}
int main(void)
{
SOSC_init_8MHz();
SPLL_init_160MHz();
NormalRUNmode_40MHz();
CAN0_Init();//CAN 설정
PWM_Init(); // PWM주파수, 클럭, 분주비 등 설정
TIMER_Init();//주파수, 클럭, 분주비 등 설정
LPIT_Init(); //저전력 타이머
ADC_Init();//채널, 트리거, 평균값, 분주비, 비트 등 설정
BoardInit(); //핀 및 클럭
NVIC_EnableIRQ(LPIT0_Ch0_IRQn);//저전력 타이머 슬립모드 관련 지어야 할듯 LPIT가 맞나 LPTMR이 맞나..15초 후 슬립모드 가는거면 LPTMR이 나을듯TMR할거면 2.2예제
NVIC_EnableIRQ(FTM1_Ovf_Reload_IRQn); // 오버플로우 인터럽트 활성화
NVIC_EnableIRQ(PORTA_IRQn); //PORTC 인터럽트 홀카운트 관련
NVIC_EnableIRQ(PORTC_IRQn); //PORTC 인터럽트 홀카운트 관련
//Sleep();
while(1)
{
CAN0RX();
ADC0->SC1[0] = ADC_SC1_ADCH(4); // ADC0 채널4번 활성화
while(((ADC0->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT) == 0); // 변환이 완료되어 SC1_COCO가 1로 설정 될 때 까지 대기
ADC_Result_Channel4 = ADC0->R[0]; // ADC0 R(A)의 값을 저장
ADC0->SC1[0] = ADC_SC1_ADCH(5); // ADC0 채널5번 활성화
while(((ADC0->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT) == 0); // 변환이 완료되어 SC1_COCO가 1로 설정 될 때 까지 대기
ADC_Result_Channel5 = ADC0->R[0]; // ADC0 R(A)의 값을 저장
ADC_Current = (ADC_Result_Channel4/140)-0.1; // 게이트 드라이버 전류센서 기존과 변경 값 달라서 보류
ADC_Voltage = (((float)ADC_Result_Channel5 * 5) / 4095)*4+0.5;
if(UnderVoltage<=ADC_Voltage && ADC_Voltage<=OverVoltage){ // 약 11V<전압<13V 내에서만 동작 수치 조정 가능
if(Direction==0){ // 정지
ST();
}
if(Direction==1){ // 정방향
CW();
}
if(Direction==2){ // 역방향
CCW();
}
}
else
{
ST();//전압 범위에서 벗어날 경우 정지
}
}
}