stm32f103c8 konfigürasyon ayarları

Başlatan pax, 23 Kasım 2016, 11:10:22

pax

  Keil uVision 5 programında stm32f103c8 ile program yazmaya çalışıyorum. standart library ile  led yakma , buton ile led yakma gibi başlangıç işlemlerini yapabiliyorum.  tabi bunları yaparken stm32f103c8 'nin halihazırdaki (default) configurasyon ayarları ile yapıyorum. şimdi ise konfigurasyon ayarlarını değiştirip işlemciyi 72 Mhz de çalıştırmak istiyorum ancak bunu yapamadım nasıl yapılacağını bilmiyorum. CubeMx ve HAL Library ile bu ayarlamaları yapabiliyorum ancak anlamak açısından kendi kodlarımla bunu yapmak istiyorum.
   
      OSC Seçimi , AHB, APB1, APB2 ,PLL , SYSCLK gibi konfigurasyon ayarlarını standart library ile  nasıl yapacağım konusunda yardımcı olursanız sevinirim

skara1214

bu z nin stm f4 için yazdığı kodlar;
unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000; 
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
Herkes ölür ama herkes gerçekten yaşamaz

pax

 evet bunları yaptım stm32f103c8 in registerlarına göre uyarladım ama başarılı olamadım.

muhittin_kaplan

main içine en başa
systeminit(); yaz. o 72 de koşturuyor.

yok ben yazacağım dersen

void SetSysClockTo72(void)
{
    ErrorStatus HSEStartUpStatus;
    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable HSE */
    RCC_HSEConfig( RCC_HSE_ON);

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        /* Enable Prefetch Buffer */
        //FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        //FLASH_SetLatency( FLASH_Latency_2);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig( RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config( RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config( RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

        /* Enable PLL */
        RCC_PLLCmd( ENABLE);

        /* Wait till PLL is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
    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 */

        /* Go to infinite loop */
        while (1)
        {
        }
    }
}


selimkoc

STM32CubuMx programını indir. Onun üzerinden clock ayarlarını görsel olarak uygula. Sonra ilgili register ayarlarını tamamla.

pax

@muhittin_kaplan  verdiğiniz program üzerinde çalışıp deneyeceğim istediğim buydu .

@selimkoc  cubeMx kullanıyorum zaten ben kendim  @muhittin_kaplan  hocanın verdiği gibi kod yazarak yapmak istiyorum

muhittin_kaplan

systeminit(); fonksiyonunun içerisinden de bakabilirsin.

pax

Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 12:18:08
systeminit(); fonksiyonunun içerisinden de bakabilirsin.

baktım ama işin içinden çıkamadım ne yazıkki  :( nereyi nasıl değiştirceğimi bilemedim.

muhittin_kaplan

72mhz için değişiklik yapmayacaksın.

systeminit i çağırdığına 72mhz e çekiyor ;)

muhittin_kaplan

ve hatta ne demiş stm bakalım.

Alıntı Yap"At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file"

sen hiç systeminit i çağırmasan dahi o falanca dosyadan çağırıyor diyor.

pax

Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 12:28:10
72mhz için değişiklik yapmayacaksın.

systeminit i çağırdığına 72mhz e çekiyor ;)


int main (void)
{
   systeminit();
...............
...............

}

bu şekilde yazdığım zaman olacak orasını anladım.

bir de bu systeminit() fonksiyonunun içeriğini anlamak istiyorum. işler nasıl işliyor görmek istiyorum :)

Klein

"system_stm32f10x.c" dosyasının içinde görebilirsin.
SystemInit() fonksiyonunu ayrıca çağırmana gerek yok.


startup rutininde bu fonksiyon zaten çağırılır. eğer  ide tarafından oluşturulan startup kullanmayacaksan kendin çağırman gerek.

/**
  * @brief  This is the code that gets called when the processor first
  *         starts execution following a reset event. Only the absolutely
  *         necessary set is performed, after which the application
  *         supplied main() routine is called. 
  * @param  None
  * @retval None
  */
void Default_Reset_Handler(void)
{
  /* Initialize data and bss */
  unsigned long *pulSrc, *pulDest;

  /* Copy the data segment initializers from flash to SRAM */
//  pulSrc = &_sidata;
//
//  for(pulDest = &_sdata; pulDest < &_edata; )
//  {
//    *(pulDest++) = *(pulSrc++);
//  }
//
//  /* Zero fill the bss segment. */
//  for(pulDest = &_sbss; pulDest < &_ebss; )
//  {
//    *(pulDest++) = 0;
//  }

  /* Setup the microcontroller system. */
  SystemInit();
	
  /* Call the application's entry point.*/
  main();
}


pax

burada kafamı karıştıran bir nokta var .

   program ilk çalıştığında SystemInit() çağrılmak zorunda , biz çağırmasak da startup onu çağıracak.  systemInit() içeriğinde HSI osc çalıştırılıyor. ben HSE osc ile ve 72Mhz de  çalışmak istiyorsam yapmam gereken şey !!!!
   
SystemInit() içeriğini değiştirmek mi yani  "RCC->CR |= (uint32_t)0x00000001;" kısmını HSE ye göre ayarlamak mı (ve diğer pll ahb,apb gibi ayarları da yapıp) 

void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;



yoksa stm32f103 ilk çalışırken HSI ile çalışmalı sonra  kendi yazdığım main.c içerisinde SystemInit() e benzer @muhittin_kaplan yazdığı gibi

Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 11:41:38

void SetSysClockTo72(void)
{
    ErrorStatus HSEStartUpStatus;
    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable HSE */
    RCC_HSEConfig( RCC_HSE_ON);

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        /* Enable Prefetch Buffer */
        //FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        //FLASH_SetLatency( FLASH_Latency_2);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig( RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config( RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config( RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

        /* Enable PLL */
        RCC_PLLCmd( ENABLE);

        /* Wait till PLL is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
    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 */

        /* Go to infinite loop */
        while (1)
        {
        }
    }
}






  bir fonksiyon yazıp HSE yi aktif edip 72 Mhz ulaşmam mı gerekir

muhittin_kaplan

HSE_VALUE=8000000 i biryerlerde define etmen yeterli. Harici Xtal Kullanımı için