Re: STM32F030 podtaktování

Lukas Osmancik losmancik na unites.cz
Středa Listopad 5 11:02:43 CET 2014


Děkuji za odpovědi.

Použil jsem pro generování excelovský konfigurační tool od ST, který
vytvoří system_stm32f0xx.c. Cube mx nepoužívám jen STD knihovny.
Část zdrojového kódu:

static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/***************************************************************************
***/
/*            PLL (clocked by HSE) used as System clock source
*/
/***************************************************************************
***/

  /* 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 Flash 0 wait state */
    FLASH->ACR = FLASH_ACR_PRFTBE;

     /* HCLK = SYSCLK / 1 */
     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
       
     /* PCLK = HCLK / 1 */
     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration */
    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_PLLMULL2);
    RCC->CFGR2 &= (uint32_t)((uint32_t)~(RCC_CFGR2_PREDIV1));
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV1_DIV2);

    /* 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
*/
  }
}

Mým cílem bylo dostat se s jádrem na 1Mhz. Nechal jsem se zlákat
datasheetem, ale
díval jsem se na špatnou stránku(48), která nepojednává o externím krystalu,
ale externím zdroji.

Původně, jsem opravdu výstupní kmitočet PLL nedodržel, násobička byla přiliš
nízko.

Jak psal pan Buchta, dá se něco ušetřit použitím HSI, dle mých měření na mém
HW je rozdíl 0,5mA.
Jen mám obavy z přesnosti, mám tam napsaný Modbus RTU - proto jsme pro
jistotu dali krystal.

LOs





Další informace o konferenci Hw-list