I am learning how to set clock by directly accessing the system registers rather than using library.
I have written code for it. I have verified the frequency by toggling the pins.
Can someone verify that steps I have done are ok & should be in this sequence.
Case1 : 16Mhz external oscialltor as system clock
If I call library function then value after library function are , RCC = 0x078C3D40 & RCC2 = 0x07C06800
But if I call my function , RCC = 0x078E3D50 , RCC2 = 0x80406800
void system_clock_init(void)
{
volatile uint32_t u32_dummy;
/* library function bypassed */
// SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ ); /* External 16Mhz crystal as system clock */
/* override RCC2 register settings */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_USERCC2;
/* bypass pll while clock init */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_BYPASS;
/* select crystal value */
SYSCTL->RCC &= (uint32_t)(~RB_SYSCTL_RCC_XTAL_MASK); /* clear xtal filed value */
SYSCTL->RCC |= RB_SYSCTL_RCC_XTAL_16MHZ; /* select 16Mhz crystal */
/* dont use sysdivider, system clock is undivided */
SYSCTL->RCC &= (uint32_t)(~RB_SYSCTL_RCC_USESYSDIV);
/* select oscilaltor source */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_OSCSRC_MASK); /* clear oscsrc mask */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_MOSC;
/* power down PLL */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_PWRDN2;
/* clear sysdiv bits & set divider */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_SYSDIV_MASK); /* divide by 1 i.e sys clock freq */
/* sys clock is osc src */
SYSCTL->RCC2 |= (RB_SYSCTL_RCC2_BYPASS);
/* give some dummy delay */
for(u32_dummy = 0U ; u32_dummy < 100U ; u32_dummy++);
} /* function ends here */
Case2 : 80Mhz using external oscialltor 16Mhz
If I call library function then value after library function are , RCC = 0x014E1540 & RCC2 = 0XC1004000
But if I call my function , RCC = 0x07CE3D50 , RCC2 = 0XC1004000
void system_clock_init(void)
{
volatile uint32_t u32_dummy;
/* library function bypassed */
// SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ );
/* override RCC2 register settings */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_USERCC2;
/* bypass pll while clock init */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_BYPASS;
/* select crystal value */
SYSCTL->RCC &= (uint32_t)(~RB_SYSCTL_RCC_XTAL_MASK); /* clear xtal filed value */
SYSCTL->RCC |= RB_SYSCTL_RCC_XTAL_16MHZ; /* select 16Mhz crystal */
/* use sysdivider */
SYSCTL->RCC |= RB_SYSCTL_RCC_USESYSDIV;
/* select oscilaltor source */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_OSCSRC_MASK); /* clear oscsrc mask */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_MOSC;
/* activate PLL */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_PWRDN2);
/* use 400Mhz PLL */
SYSCTL->RCC2 |= RB_SYSCTL_RCC2_DIV400;
/* clear sysdiv bits & set divider */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_SYSDIV_MASK);
SYSCTL->RCC2 |= REG32_BIT_24; /* setting for 80Mhz */
/* wait for PLL to lock */
while( 0U == (SYSCTL->RIS & RB_SYSCTL_RIS_PLLLRIS) );
/* sys clock is PLL out */
SYSCTL->RCC2 &= (uint32_t)(~RB_SYSCTL_RCC2_BYPASS);
/* give some dummy delay */
for(u32_dummy = 0U ; u32_dummy < 100U ; u32_dummy++);
} /* function ends here */