2015-12-31 08:20 AM
Hi, I have a problem with proper main clock configuration in STM32F030K6T6.
I've connected an external crystal 16 MHz with 2x15 pF caps, but the HSE is not starting. Variable HSEStatus remains 0, so the PLL config doesn't execute. And yes, I've set the HSE_VALUE to ((uint32_t)16000000 in header file. Here's my startup code:void
SystemInit (
void
)
{
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
#if defined (STM32F0XX_MD) || defined (STM32F030X8)
/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
RCC->CFGR &= (uint32_t)0xF8FFB80C;
#else
/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */
RCC->CFGR &= (uint32_t)0x08FFB80C;
#endif /* STM32F0XX_MD or STM32F030X8 */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
RCC->CFGR &= (uint32_t)0xFFC0FFFF;
/* Reset PREDIV1[3:0] bits */
RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
/* Reset HSI14 bit */
RCC->CR2 &= (uint32_t)0xFFFFFFFE;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
SetSysClock();
}
static
void
SetSysClock(
void
)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
}
while
((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if
((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if
(HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
/* PLL configuration = HSE * 3 = 48 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL3);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while
((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while
((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
{
}
}
else
{
/* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
//I turn on here my debug LED
}
2015-01-01 03:35 AM
The marking on my crystal is ''M16.000E7D''. Unfortunately I couldn't find any datasheet for it. Maybe I'll try to get another crystal with known parameters.
ST's code isn't that elegant in it's failure path - yeah, that's completely true.2015-01-05 09:30 AM
I replaced the crystal with a new 8 MHz one (known parameters) and it worked. The MCO shows 48 MHz signal at PLL x6.
Thanks for your advices, clive.2015-01-06 01:05 PM
There is an Application Note at ST, check for AN2867.
2015-01-06 06:28 PM
There is an Application Note at ST, check for AN2867.
Which was cited n the first response.2015-12-31 09:10 AM
Some random crystal, or one of known/chosen electrical characteristics?
http://www.st.com/web/en/resource/technical/document/application_note/CD00221665.pdf
Probably want to view the output indirectly via the MCO (PA8) pin rather than put a scope on the crystal itself and distorting the characteristics of the circuit it's in. You know if you code more robustly you can have it fail-over to the HSI and run the PLL from that too.2015-12-31 09:33 AM
It's a random crystal, I've soldered another 16 MHz and it doesn't work with my code too. Maybe it's the PCB layout problem? Or should I try to solder a parallel load resistor?
I will try to see the MCO pin on the scope.I know I can run PLL from HSI, but I want to use an external crystal.2015-12-31 09:43 AM
The oscillator circuits on the STM32 are a bit fussy. You'd want to evaluate the capacitors and the need for serial or parallel resistance. Perhaps there are adequate markings on your current selection to be able to pull a specification or data sheet?
I was pointing out that ST's code isn't that elegant in it's failure path.