Hello everyone,
when i want use config HSRUN at 112M clock, i face some problem.
I refer to the instructions of S32K1XX RM 40.4.3.3. If i use the code in the example of S32DS Example Projects for S32K1xx/S32K142_Project_Hello, it happens bus fault. However, when i use the same code in SDK example, the error is missed. I want to use it without SDK. Please tell me the reason if you know, thanks very much.
I use the S32K142EVB, s32 design studio for arm 2.2 and use the opensda.
I uploaded the project.
Following is my clock config code:
void Mode_HSRUN_Clock_Init(void) {
SOSC_init_8MHz();
Handle_For_HSRUN();
SPLL_init_112MHz();
HighSpeedRUNmode_112MHz();
}
void SOSC_init_8MHz(void)
{
/*!
* SOSC Initialization (8 MHz):
* ===================================================
*/
SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1)|
SCG_SOSCDIV_SOSCDIV2(1); /* SOSCDIV1 & SOSCDIV2 =1: divide by 1 */
SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2)| /* Range=2: Medium freq (SOSC betw 1MHz-8MHz) */
SCG_SOSCCFG_EREFS_MASK; /* HGO=0: Config xtal osc for low power */
/* EREFS=1: Input is external XTAL */
while(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK); /* Ensure SOSCCSR unlocked */
SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; /* LK=0: SOSCCSR can be written */
/* SOSCCMRE=0: OSC CLK monitor IRQ if enabled */
/* SOSCCM=0: OSC CLK monitor disabled */
/* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled */
/* SOSCLPEN=0: Sys OSC disabled in VLP modes */
/* SOSCSTEN=0: Sys OSC disabled in Stop modes */
/* SOSCEN=1: Enable oscillator */
while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)); /* Wait for sys OSC clk valid */
}
void Handle_For_HSRUN(void) {
while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); //Ensure SPLLCSR Unlocked
SCG->SPLLCSR = 0x00000000; // disable SPLL
SCG->RCCR = SCG_RCCR_SCS(3); // config FIRC as run mode clock
while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) != 3); // wait success
SCG->HCCR = SCG_HCCR_SCS(3); // config FIRC as hsrun mode clock
while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) != 3); // wait success
SMC->PMPROT |= SMC_PMPROT_AHSRUN_MASK; // enable hsrun mode
SMC->PMCTRL = SMC_PMCTRL_RUNM(0x03); // jump to hsrun
while (SMC->PMSTAT != 0x80);//wait jump success
}
void SPLL_init_112MHz(void) {
/*!
* SPLL Initialization (112 MHz):
* ===================================================
*/
while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */
SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK; /* SPLLEN=0: SPLL is disabled (default) and can be written */
SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(1)| /* SPLLDIV1 divide by 1 */
SCG_SPLLDIV_SPLLDIV2(2); /* SPLLDIV2 divide by 2 */
SCG->SPLLCFG = SCG_SPLLCFG_MULT(12); /* PREDIV=0: Divide SOSC_CLK by 0+1=1 */
/* MULT=12: Multiply sys pll by 16+12=28 */
/* SPLL_CLK = 8MHz / 1 * 28 / 2 = 112 MHz */
while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */
SCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK; /* LK=0: SPLLCSR can be written */
/* SPLLCMRE=0: SPLL CLK monitor IRQ if enabled */
/* SPLLCM=0: SPLL CLK monitor disabled */
/* SPLLSTEN=0: SPLL disabled in Stop modes */
/* SPLLEN=1: Enable SPLL */
while(!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK)); /* Wait for SPLL valid */
}
void HighSpeedRUNmode_112MHz (void) {
/*! Slow IRC is enabled with high range (8 MHz) in reset.
* Enable SIRCDIV2_CLK and SIRCDIV1_CLK, divide by 1 = 8MHz
* asynchronous clock source.
* ==========================================
*/
SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1)
| SCG_SIRCDIV_SIRCDIV2(1);
/*!
* Change to normal RUN mode with 8MHz SOSC, 112 MHz PLL:
* ====================================================
*/
SCG->HCCR = SCG_HCCR_SCS(6) /* Select PLL as clock source */
| SCG_HCCR_DIVCORE(0b00) /* DIVCORE=0, div. by 1: Core clock = 112/1 MHz = 112 MHz */
| SCG_HCCR_DIVBUS(0b01) /* DIVBUS=1, div. by 2: bus clock = 56 MHz */
| SCG_HCCR_DIVSLOW(0b11); /* DIVSLOW=3, div. by 4: SCG slow, flash clock= 28 MHz */
while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6) {} /* Wait for sys clk src=SPLL */
}