Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 21

Θέμα: Ταχύτητα I/O port με Nucleo και STM32L152RE

  1. #1
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή Ταχύτητα I/O port με Nucleo και STM32L152RE

    Γεια σας,

    εδώ και δύο μέρες προσπαθώ να βρώ γιατί τα πίνς δεν αλλάζουν κατάσταση γρηγορότερα απο 2 MHZ και δεν βγάζω άκρη. Δεν έχω καταφέρει μεγαλύτερη ταχύτητα απο 2 MHZ και θέλω την συμβολή σας.

    Το System clock είναι στα 32 MHZ και για επαλήθευση ρύθμισα το pin MCO ως έξοδο του system clock και μέτρησα ταχύτητα 32 MHZ. Όλα καλά μέχρι εδώ.
    Κώδικας:
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = 16;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
      RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;
    οι ρυθμίσεις για τα υπόλοιπα είναι οι εξής:

    Κώδικας:
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    δηλαδή όλα τα είναι ρυθμισμένα στην μονάδα.

    παρακάτω είναι το κομάτι απο το datasheet που αναφέρει ότι η GPIO είναι συνδεμένη με τον ρολόι AHB. Στην περιπτωσή μου 32 MHZ γιατί δεν έχω divider.

    Output configuration
    When the I/O port is programmed as output:
    β€’
    The output buffer is enabled:
    –
    Open drain mode: A β€œ0” in the Output register activates the N-MOS whereas a β€œ1”
    in the Output register leaves the port
    in Hi-Z (the P-MOS is never activated)
    –
    Push-pull mode: A β€œ0” in the Output register activates the N-MOS whereas a β€œ1” in
    the Output register activates the P-MOS
    β€’
    The Schmitt trigger
    input is activated
    β€’
    The weak pull-up and pull-down resistors are activated or not depending on the value
    in the GPIOx_PUPDR register
    β€’
    The data present on the I/O pin are sampled into the input data register every AHB
    clock cycle
    οπότε περιμένω μια συχνότητα στην GPIO γύρω στα 16 ΜΗΖ το μισό του AHB clock, επειδή σε κάθε χτύπο αλάζει κατάσταση, οπότε απο HIGH σε LOW θέλει δύο χτύπους, άρα 16 ΜΗΖ σήμα.

    ακολουθούν και οι ρυθμίσεις της GPIO :

    Κώδικας:
    GPIO_InitStruct.Pin = GPIO_PIN_9;
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
            HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    
       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
    
       __HAL_RCC_GPIOA_CLK_ENABLE();
    και κάνω την μέτρηση με τον παλμογράφο, 2 ΜΗΖ, με το logic analyzer, τα ίδια.




    Μπορεί κανείς να με βοηθήσει; να το προσπαθήσει και στον δικό του μικροελεγκτή;

    0 Not allowed! Not allowed!

  2. #2
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.381

    Προεπιλογή

    ειμαι άσχετος απο arm αλλά βλέπω οτι λέει
    οτι ο input register διαβάζει τη κατάσταση της IO, με ταχύτητα του AHB ρολογιού

    The data present on the I/O pin are sampled into the input data register every AHB
    clock cycle


    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη picdev : 30-06-17 στις 00:45

  3. #3
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.958

    Προεπιλογή

    ούτε εγώ ξέρω από ARM αλλά αυτό που καταλαβαίνω (νομίζω το ίδιο λέει και ο Άκης) είναι ότι δεν αλλάζει με συχνότητα AHB η έξοδος αλλά ότι τα πιν κάνουν sample την κατάσταση με συχνότητα AHB.
    Δηλαδή πράγματι το πιν ενημερώνεται με συχνότητα 32MHz αλλά δεν αλλάζει κατάσταση γιατί απλά ο επεξεργαστής δεν έχει ακόμα υπολογίσει τη νέα τιμή εξόδου...
    Πάντως διαβάζοντας σιγά σιγά για ARM Cortex-Μ3 (δεν είμαι όμως ακόμα έτοιμος... αφού σκοπεύω να τους χρησιμοποιήσω με assembly και διαβάζω για την αρχιτεκτονική τους σε πρώτη φάση) νομίζω οτι δεν είναι τόσο γρήγοροι όσο θα περίμενε κάποιος ακούγοντας 32Bit Risc και αν κάποιος δεν έχει ανάγκη τα 32bit σε μία απλή εφαρμογή ένας AVR ή ένας 8051 (1 cycle version) ή ένας PIC νομίζω θα είναι πιο γρήγορος... Πάντα με επιφύλαξη και παρακαλώ να με διορθώσει κάποιος που έχει ασχοληθεί... Στους επεξεργαστές αυτούς ο Program Counter είναι ένας από τους καταχωρητές και φαίνεται ότι δεν είναι counter αλλά η ALU καθοδηγούμενη από μικροκώδικα υπολογίζει κάθε φορά την διεύθυνση της επόμενης εντολής (θυμίζει low cost υλοποιήσεις από mini computer με bit Slice ALU ΑΜ2901) . Εφόσον η CPU δουλεύει με αυτό τον τρόπο (κρατώ σημαντικές επιφυλάξεις γιατί ακόμα δεν έχω πλήρη εικόνα της αρχιτεκτονικής ούτε έχω κάνει simulation σε κώδικα για να δω πόσο βοηθάει το pipelinγ) είναι αναμενώμενο οτι η CPU δεν θα μπορεί να ενημερώνει τον καταχωρητή εξόδου με τόσο υψηλή ταχύτητα και τα 2MHz μου ακούγονται φυσιολογικά (αν και θα περίμενα γύρω στα 4... ή το πολύ 8 )

    0 Not allowed! Not allowed!

  4. Ένα μέλος ευχαρίστησε τον chip για αυτό το χρήσιμο μήνυμα:

    nestoras (30-06-17)

  5. #4
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.381

    Προεπιλογή

    η αλήθεια ειναι οτι για να αλλάξεις την κατάσταση ενώς pin χρειάζεται μπορεί και 10 εντολές σε αντίθεση με τη risk που θέλει μία εντολή σε asembly.
    Αν προσθέσεις οτι ειναι πολύπλοκοι επεξεργαστές και χρησημοοποιείς τις έτοιμες βιβλιοθήκες για να δουλέψεις πχ το GPIO , τότε θα δεις οτι για να κάνεις toggle ενα pin θα γράψεις 1kb πρόγραμα.
    Δεν έχω ασχωληθεί πολύ ακομα, ενα βιβλίο έχω διαβάσει αλλά σίγουρα οι 32bit risk κάνουν ακόμα τη δουλειά τους.
    Βέβαια ανάλογα την εφαρμογή οι arm έχουν πολλά περιφερειακά και πολλά dma ρολόγια κτλ αλλά πολύ κοπο για να τους στήσεις.
    Επίσης δεν ξέρω αν έχεις καμια ελπίδα να στήσεις ολα τα περιφερικά τους με assembly , οι ρυθμίσεις ειναι άπειρες.

    Το μεγάλο + ειναι οτι παίρνουν RTOS γιατί έχει προβλεφθεί στην αρχιτεκτονική τους

    0 Not allowed! Not allowed!

  6. Ένα μέλος ευχαρίστησε τον picdev για αυτό το χρήσιμο μήνυμα:

    nestoras (30-06-17)

  7. #5
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.958

    Προεπιλογή

    και οι ARM είναι RISC (Αdvanced Risc Machine αν και παλαιότερα σήμαινε Acorn Risc Machine)
    οι ARM, τουλάχιστον στην έκδοση Cortex M3 (στην οποία ανήκουν και οι STM32F1...), έχουν περιοχές μνήμης που λέγονται bit-banged και οι οποίες είναι αρκετά μεγάλες ώστε πιθανόν ολόκληρη η μνήμη των υπαρχόντων μικροελεγκτών είναι μέσα στα όρια αυτής και στα οποία με μία εντολή αλλάζεις ένα Bit. Βέβαια όπως εξηγεί στην αρχιτεκτονική το κάθε bit δεν διευθυνσιοδοτείται ξεχωριστά δηλαδή δεν μπορεί η CPU να αλλάξει ένα bit απ ευθείας αλλά διαβάζει το byte (ή Word δεν θυμάμαι) και εκτελώντας μικροκώδικα (πρόγραμμα στον πυρήνα της CPU που εκτελεί σύνθετες εντολές με την χρήση απλούστερων) χρησιμοποιώντας εντολή OR ή AND σου αλλάζει το bit που θέλεις. Ο λόγος που δεν μπορεί απ ευθείας να αλλάζει ένα bit μόνο του (αλλά κάνει Read-modify-Write) είναι οτι το τσιπ θα ήταν πολύ μεγαλύτερο (υψηλότερο κόστος).

    0 Not allowed! Not allowed!

  8. Ένα μέλος ευχαρίστησε τον chip για αυτό το χρήσιμο μήνυμα:

    picdev (30-06-17)

  9. #6
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή

    Νομίζω οτι βγαίνουμε εκτός θέματος, απλά επειδή αναφέρθηκε, για την αλλαγή της καταστασης του πιν δεν χρησημοποιώ τις συναρτήσεις που είναι διαθέσιμες αλλά γράφω αμέσως στον register. GPIOA->ODR |=1<<9;
    Δεν έχω τον κώδικα πρόχειρο αλλά θα ρίξω και μια ματία στην assembly με την πρώτη ευκαιρία και θας σας ενημερώσω.

    0 Not allowed! Not allowed!

  10. #7
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.958

    Προεπιλογή

    δεν ξεφεύγουμε καθόλου... αυτό που θέλω να πω είναι οτι μάλλον αυτή είναι η ταχύτητα που η CPU αλλάζει την κατάσταση των pin. και προσπαθώ να εξηγήσω το ότι μου ακούγεται λογική λόγω το τρόπου που δουλεύει η CPU αφού χρησιμοποιεί μικροκώδικα για την εκτέλεση των εντολών και όχι hardware logic, η αλλαγή Bit γίνεται με μικροκώδικα κάνοντας read-modify-write, και ο program counter μάλλον ειναι register και η alu αφιερώνει χρόνο και για τον υπολογισμό του program counter.

    Φυσικά να τονίσω ότι δεν λέω ότι οι ARM είναι αργοί, αλλά ότι δεν πρέπει να θεωρούμε οτι την ταχύτητα που παίρνουμε με έναν 8Bit σε κάποια συχνότητα θα την πάρουμε και σε εναν ARM σε όλες τους τύπους λειτουργιών.... σε άλλες λειτουργίες ο ARM θα είναι πιο γρήγορος σε άλλες πιο αργός....

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη chip : 30-06-17 στις 21:43

  11. #8
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Post

    βρήκα και την assembly τώρα που ήρθα σπίτι, έχουμε τα εξής :
    Κώδικας:
      
    121         while(1) {GPIOA->ODR |=  ((1<<9)&0xFFFFFFFF);
    08001b5a:   ldr     r3, [pc, #24]   ; (0x8001b74 <main+44>) // 2 κτύπους
    08001b5c:   ldr     r2, [r3, #20] // 2 κτύπους
    08001b5e:   orr.w   r2, r2, #512    ; 0x200 // 1 κτύπο
    08001b62:   str     r2, [r3, #20] // 2 κτύπους
    122               GPIOA->ODR &=  ~((1<<9));}
    08001b64:   ldr     r2, [r3, #20] // 2 κτύπους
    08001b66:   bic.w   r2, r2, #512    ; 0x200 // 1 κτύπο
    08001b6a:   str     r2, [r3, #20]  // 2 κτύπους
    08001b6c:   b.n     0x8001b5a <main+18> // 1 κτύπο
    οπότε αν καταλαβαίνω σωστά κάθε 6-7 χτύπους αλλάζει κατάσταση η πόρτα, δηλαδή με 32 MHZ κάθε κτύπος χρειάζεται 30 νανοδευτερόλεπτα, οπότε σε 210 νανοδευτερόλεπτα έπρεπε να είχα αλλαγή κατάστασης, ήτοι 210 ns = 4,7 ΜΗΖ σωστά?

    0 Not allowed! Not allowed!

  12. #9
    Μέλος
    Εγγραφή
    Apr 2006
    Περιοχή
    Κέρκυρα
    Μηνύματα
    5.958

    Προεπιλογή

    μα... 13 κτύπους μετράω στο loop που έδωσες.....

    0 Not allowed! Not allowed!

  13. #10
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από chip Εμφάνιση μηνυμάτων
    μα... 13 κτύπους μετράω στο loop που έδωσες.....
    εγω μιλάω για μια αλλαγή κατάστασης, για όλο το loop ναι είναι 7+6. Αλλά δέν βλέπω πάντος να είναι πρόβλημα του hardware, o compiler το έχει κάνει έτσι.
    Τώρα είμαι με τον debugger και βλέπω ότι ο r3 εχει την διευθυνση της GPIOA και ο r2 το offset για τον ODR register. Και κάθε φορά κάνει αυτήν την λούπα. Διαβάζει την τιμή της πόρτας, κάνει orr και μετά την ξανα γράφει.
    Ενώ το ίδιο πρόγραμμα με τον Atmel compiler για avr το κάνει πολύ πιο απλά.
    Κώδικας:
    00004860 <LEDfunction>:
        4860:    41 98           cbi    0x08, 1    ; 8
        4862:    42 9a           sbi    0x08, 2    ; 8
        4864:    fd cf           rjmp    .-6          ; 0x4860 <LEDfunction>
    δηλαδή κατευθείαν στην διεύθυνση set και clear του αντίστοιχου bit.

    0 Not allowed! Not allowed!

Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Ταχύτητα βεντιλατέρ κλιματιστικού
    By PUNTOmania in forum Ηλεκτρολογικά
    Απαντήσεις: 16
    Τελευταίο Μήνυμα: 14-10-19, 00:47
  2. Arduino - PCF8574 και LCD (port expander.
    By karabill93 in forum Μικροελεγκτές
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 16-04-16, 10:55
  3. Απαντήσεις: 3
    Τελευταίο Μήνυμα: 21-07-14, 18:14
  4. Απαντήσεις: 3
    Τελευταίο Μήνυμα: 05-07-14, 03:11
  5. Βοηθεια για χειρισμο Com και Parallel port μεσω visual basic
    By triplex in forum Λογισμικά Σχεδίασης
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 09-10-05, 21:08

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας