Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32 - Konfiguracja pętli PLL

kornik280 18 Kwi 2014 18:40 2310 16
  • #1 18 Kwi 2014 18:40
    kornik280
    Poziom 18  

    Witam

    Mam arma stm32f103rb i kwarc 8Mhz chce gopuścić z pełną szybkością 72 Mhz.
    Czy w środowisku Keil poczas debugowania można w którymś rejestrów sprawdzić z jaką predkością działa arm?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Czy powyższa konfiguracja jest poprawna? Czy mikrokontroler bedzie mi działał z prędkością 72Mhz?

    Jeszcze jedno pytanie jesli konfiguruje GPIO np. tak:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    To jak zrobić aby jeden pin w porcie A był wejściem a drugi wyjściem muszę robi osobną strukture?

    0 16
  • #2 18 Kwi 2014 19:27
    mi14chal
    Poziom 28  

    kornik280 napisał:
    To jak zrobić aby jeden pin w porcie A był wejściem a drugi wyjściem muszę robi osobną strukture?

    No tak, albo nie używać tej biblioteki i pisać normalnie.

    0
  • #3 18 Kwi 2014 19:34
    tadzik85
    Poziom 38  

    mi14chal napisał:
    kornik280 napisał:
    To jak zrobić aby jeden pin w porcie A był wejściem a drugi wyjściem muszę robi osobną strukture?

    No tak, albo nie używać tej biblioteki i pisać normalnie.


    I zapoznać się z podstawami C.

    0
  • #4 18 Kwi 2014 19:53
    kornik280
    Poziom 18  

    A moje pierwsze pytanie odnośnie pętli?

    0
  • #5 18 Kwi 2014 19:55
    tadzik85
    Poziom 38  

    kornik280 napisał:
    A moje pierwsze pytanie odnośnie pętli?


    A sprawdzić nie laska? To wróżek nie ma. By zgadywać jak masz ustawione zegary.

    W przypadku biblioteki jest ciekawe narzędzie w exelu. Odsyłam na stronę ST.

    0
  • #6 18 Kwi 2014 20:28
    kornik280
    Poziom 18  

    Właśnie się pytam cz w Keil w trybie debug można odczytać zegar?

    0
  • #7 18 Kwi 2014 21:03
    Marek_Skalski
    Moderator Projektowanie

    Nie ma znaczenia czy to Keil czy inne środowisko.
    Nie znajdziesz rejestru, z którego możesz odczytać wartość częstotliwości taktowania rdzenia wprost, czyli jawnie np. 72000000. Możesz odczytać poszczególne ustawienia pętli z rejestrów RCC i użyć wzoru, aby obliczyć przybliżoną, rzeczywistą wartość w oparciu o częstotliwość podłączonego do układu kwarcu, jeżeli źródłem sygnału PLL jest HSE.
    Inna metoda, to ustawianie jednego z liczników do generowania sygnału na jednym z pinów i pomiar tej częstotliwości.

    0
  • #8 18 Kwi 2014 21:15
    kornik280
    Poziom 18  

    Marek_Skalski napisał:
    Nie ma znaczenia czy to Keil czy inne środowisko.
    Nie znajdziesz rejestru, z którego możesz odczytać wartość częstotliwości taktowania rdzenia wprost, czyli jawnie np. 72000000. Możesz odczytać poszczególne ustawienia pętli z rejestrów RCC i użyć wzoru, aby obliczyć przybliżoną, rzeczywistą wartość w oparciu o częstotliwość podłączonego do układu kwarcu, jeżeli źródłem sygnału PLL jest HSE.
    Inna metoda, to ustawianie jednego z liczników do generowania sygnału na jednym z pinów i pomiar tej częstotliwości.


    A moja konfiguracja zegara jest poprawna?

    0
  • #9 18 Kwi 2014 21:29
    mi14chal
    Poziom 28  

    Jeśli masz 72 MHz to tak.

    0
  • #10 18 Kwi 2014 21:30
    tadzik85
    Poziom 38  

    mi14chal napisał:
    Jeśli masz 72 MHz to tak.


    Skąd ten wniosek?

    0
  • #11 18 Kwi 2014 21:32
    Marek_Skalski
    Moderator Projektowanie

    Prawdopodobnie tak, ale ja nie korzystam z SPL i nie będę wnikał czy to co wywołujesz realizuje zadanie, ponieważ SPL to inny świat ;)
    Na pewno działa konfiguracja w moim szablonie (link poniżej).
    Poza tym... ustaw odpowiednio jeden z liczników i zmierz częstotliwość; nawet migającą diodą. Przecież łatwo odróżnić np. 0,1s od 0,9s.

    0
  • #12 08 Lip 2014 00:12
    habrat
    Poziom 9  

    mam podobne pytanie, mam na płytce kwarc 14,745 MHz, jak należy poustawiać mnożniki aby puścić go z max prędkością 72MHz...., zestaw to butterfly2
    z STM32F107... da się to zrobić dla HSE czy zostaje powielanie HSI?
    hhmmm podobno nie ma głupich pytań, dodam że jestem prawie laikiem i zaczynam swoją przygodę...

    0
  • #13 08 Lip 2014 08:46
    tadzik85
    Poziom 38  

    Poszukaj na ST. Udostępniają kalkulator w formie Exela. W nowym Cube tez jest to wbudowane

    0
  • #14 08 Lip 2014 11:36
    atom1477
    Poziom 43  

    Tylko warto dodać, że z 14,745 MHz nie uzyskasz równo 72MHz.
    Możesz pomnożyć przez 5 i uzyskasz 73,725 MHz.

    0
  • #15 08 Lip 2014 22:13
    habrat
    Poziom 9  

    tak własnie, martwi mnie ten przecinek, nie wiem czy słusznie..., ale w dalszej części chcę podłączyć uC do transceiwera po I2C który jest z kolei traktowany oddzielnym rezonatorem 12MHz..., potem dojdzie odczyt danych po I2S i ich zapis na kartę SD
    myślicie że warto wymienić kwarc??

    0
  • #16 08 Lip 2014 22:27
    tadzik85
    Poziom 38  

    habrat napisał:
    tak własnie, martwi mnie ten przecinek, nie wiem czy słusznie..., ale w dalszej części chcę podłączyć uC do transceiwera po I2C który jest z kolei traktowany oddzielnym rezonatorem 12MHz..., potem dojdzie odczyt danych po I2S i ich zapis na kartę SD
    myślicie że warto wymienić kwarc??


    To skorzystaj z narzędzia, które ci podałem i zobacz czy uzyskasz odpowiednie częstotliwości dla i2s

    0
  • #17 21 Lip 2014 01:03
    habrat
    Poziom 9  

    dzięki za podpowiedź choć akurat dla STM32F107 jest to troszkę bardziej pogmatwane, konfiguracja z uwzględnieniem magistrali dla I2S wyszła tak, ale pytanie czy tak jest na prawdę pozostaje otwarte....

    Kod: c
    Zaloguj się, aby zobaczyć kod
    void RCC_traktowanie(void)
    {

    //reset ustawien do wartoci domylnych
    RCC_DeInit();
    /*właczanie rezonatora zewnetrznego*/
    RCC_HSEConfig(RCC_HSE_ON);
    //czekanie aż bedzie gotowy
    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);
    /* Konfiguracja ADCCLK */
    RCC_ADCCLKConfig(RCC_PCLK2_Div4);

    /* Konfiguracja PLL -----------------------------------------*/
    /* PREDIV2: PREDIV2CLK = HSE / 4 = 3,6864 MHz */
    RCC_PREDIV2Config(RCC_PREDIV2_Div4);
    /* PLL3 configuration: PLL3CLK = (HSE=25 / 5) * 11 => PLL3_VCO = 110
    MHz */
    /* PLL3: PLL3CLK = (HSE / 4) * 9 = 33,1776 MHz */
    RCC_PLL3Config(RCC_PLL3Mul_9);
    RCC_PLL3Cmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET);

    /* PLL2: PLL2CLK = (HSE / 4) * 12 = 44,2368 MHz */
    RCC_PLL2Config(RCC_PLL2Mul_12);
    RCC_PLL2Cmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET);

    /* PREDIV1: PREDIV1CLK = PLL2 / 5 = 8,84736 MHz */
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2,RCC_PREDIV1_Div4);
    /* PLL1: PLLCLK = PREDIV1 * 8 = 70,77888 MHz */
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_8);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    /* PLL zrodlem zegara systemowego */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //564
    /* Czekaj na poprawny sygnal zegarowy */
    while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08);
    RCC_I2S2CLKConfig(RCC_I2S2CLKSource_PLL3_VCO); //792


    /* Enable peripheral clocks ------------------------------------------------*/
    /* GPIOA, GPIOB and AFIO clocks enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
    RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO, ENABLE);


    // #ifdef USE_STM3210C_EVAL
    // /* GPIOC Clock enable (for the SPI3 remapped pins) */
    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
    // #endif /* USE_STM3210C_EVAL */

    /* (SPI3) and SPI2 clocks enable (RCC_APB1Periph_SPI3 |) */
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE);
    }

    }[/syntax]

    0
  Szukaj w 5mln produktów