STM32F407 pin giriş çıkış hızları hakkında

Başlatan ziyaretci, 16 Ekim 2017, 11:02:27

ziyaretci

Merhaba, bu pin giriş çıkış hızları tam olarak nedir? Her giriş veya çıkış bağımsız olarak kontrol mü ediliyor? Ve hızdan kasıt ilgili pini yoklama frekansı mıdır?


volkanunal

#1
4 çeşit hız parametresi bulunuyor diye biliyorum. Bunlar;

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

GPIO'nun üretebileceği maximum frekans değerine eşit , yüksek hızlarda güç tüketimi de artacaktır tabi.
Primum nil nocere

ferdem

"Datasheet" teki ifadeyi direkt alıp buraya kopyalarsanız daha doğru cevaplar gelir.
Örneğin STM32F103C8 in "datasheet" inden aldığım bir cümle:
"I/Os on APB2 with up to 18 MHz toggling speed"
Bir anlamı şu ki pinden alabileceğiniz en yüksek frekanslı karedalganın frekansı 18 MHz olabiliyormuş.

seco06

#3
Alıntı yapılan: ferdem - 16 Ekim 2017, 11:23:57
"Datasheet" teki ifadeyi direkt alıp buraya kopyalarsanız daha doğru cevaplar gelir.
Örneğin STM32F103C8 in "datasheet" inden aldığım bir cümle:
"I/Os on APB2 with up to 18 MHz toggling speed"
Bir anlamı şu ki pinden alabileceğiniz en yüksek frekanslı karedalganın frekansı 18 MHz olabiliyormuş.


Benim yaptığım uygulamada cpu frekansı 72 Mhz ayarlandığında toggle maksimum 2 Mhz olabiliyor. Bunu 18 Mhz olarak gören oldumu.

kantirici

Hal lib. veya ST standart lib. ile o hızlara ulaşamazsınız. Eğer onları kullanıyorsanız direk reg. yazım yapmayı deneyin.

seco06

#5
Alıntı yapılan: kantirici - 16 Ekim 2017, 20:04:51
Hal lib. veya ST standart lib. ile o hızlara ulaşamazsınız. Eğer onları kullanıyorsanız direk reg. yazım yapmayı deneyin.
https://www.picproje.org/index.php/topic,71012.0.html
Burada yaptığımda timer ile o frekanslara ulaşamadım.
Neden olmaz açıklayabilirmisiniz.Mümkünse bir örnek yazarmısınız.

ferdem

18 MHz çıkış almıştım, denediğim bilgisayarda kodu bulabilirsem buraya yazarım.
kantirici'nin söylediğini ben de söyleyecektim, bir pinden en hızlı çıkışı almak için en temel komutları kullanmanız gerekir, mümkünse assembly sinde yazılır.
PORTC=0x01;
PORTC=0x00;
PORTC=0x01;
PORTC=0x00;
Bu gibi bir kodla hız denemesi yapılır, eğer set_pin(PORTC,1) gibi bir fonksiyon kullanırsanız çıkış yavaşlar. Sebebi malum, fonksiyona gitmesi gelmesi süreyi uzatır.
Diğer başlıkta hız denemesini timer kesmesi ile yapıyorsunuz, kesme ile bu hıza yetişilmez çünkü kesme olayı olduktan sonra işlemcinin kesme rutine gitmesi belirli bir süre alıyor ki belirtilen en yüksek I/O hızına göre uzun bir süre alır.

seco06

İşlemci kesme ye gidene kadar harcayacağı zaman 72Mhz lik bir işlem hıznda çok kısa olmalı diye düşünüyorum ki ben zaten kesmede kullanacağım hız 2Mhz . Birde neden HAL kütüphanesi bu kadar basit bir işi bile yapamıyor. Hata bende mi ondamı merak etmiştim:). Hazır kütüphane başka işlemcilerde çok kullandım ve de hepsinde istediğimi yaptım. Bu işlemciyi (STM32F103) merak edip ve de ucuz diye bir proje de kullanmayı düşündüm. Verdiğim örnek kod sadece kesme kısmıydı. Ben USB , SPI, DMA modüllerini kulandım (HAL kütüphanesinin) sorun çıkmadı. Ama bu kesme işini bir türlü beceremedim. Merak edip sadece main de toggle yaptım ( delay yok) O bile maximum 2Mhz oldu. Ben bu işi kesme ile yapmalıyım ve de istediğim zaman kesmeyi kapatabilmeliyim. Teşekkürler

Cemre.

Alıntı yapılan: seco06 - 16 Ekim 2017, 23:41:43
İşlemci kesme ye gidene kadar harcayacağı zaman 72Mhz lik bir işlem hıznda çok kısa olmalı diye düşünüyorum ki ben zaten kesmede kullanacağım hız 2Mhz . Birde neden HAL kütüphanesi bu kadar basit bir işi bile yapamıyor. Hata bende mi ondamı merak etmiştim:). Hazır kütüphane başka işlemcilerde çok kullandım ve de hepsinde istediğimi yaptım. Bu işlemciyi (STM32F103) merak edip ve de ucuz diye bir proje de kullanmayı düşündüm. Verdiğim örnek kod sadece kesme kısmıydı. Ben USB , SPI, DMA modüllerini kulandım (HAL kütüphanesinin) sorun çıkmadı. Ama bu kesme işini bir türlü beceremedim. Merak edip sadece main de toggle yaptım ( delay yok) O bile maximum 2Mhz oldu. Ben bu işi kesme ile yapmalıyım ve de istediğim zaman kesmeyi kapatabilmeliyim. Teşekkürler

Madem yüksek doğrulukta toggle olan bir sinyale ihtiyacınız var ve istediğinizde kapatabilmek istiyorsunuz, neden timer kesme rutininde pin toggle etmekle uğraşıyorsunuz ki? Timer'ın bir kanalını OC Toggle modunda çalıştırıp istediğinizi çok kolay ve kesmeye dallanmadan yapabilirsiniz zaten...

ferdem

Kodu düzenlediğimden 18 MHz i görmek için tekrar uğraşmam gerekti, frekans 72 MHz, APB2 de 72 MHz de çalışacak şekilde(prescaler ayarı 0 da kalmalı):
while(1){
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
}

Şeklinde denedim, BSRR nin set ve reset bitleri datasheetten bulunacak, bende pin13 için 13 ve 29 oluyor. Compile options dan "optimize for speed" seçilmezse çıkış 4 MHz ler civarında kalıyor. Optimizasyon seçeneğiyle 18 MHz i görebildim, burada neyi optimize etti de hızı arttırdı bilemiyorum. Belki daha doğru yöntemler vardır, benimkisi çalakalem bir deneme oldu.

Cemre'nin bahsettiği OC Toggle olayını bilmiyordum, deneyip görmek lazım.

seco06

Alıntı yapılan: Cemre. - 17 Ekim 2017, 08:06:25
Madem yüksek doğrulukta toggle olan bir sinyale ihtiyacınız var ve istediğinizde kapatabilmek istiyorsunuz, neden timer kesme rutininde pin toggle etmekle uğraşıyorsunuz ki? Timer'ın bir kanalını OC Toggle modunda çalıştırıp istediğinizi çok kolay ve kesmeye dallanmadan yapabilirsiniz zaten...
Onu pdf inde okumuştum ama benim kullanacağım uç aynı zamanda SPI modülünün clk ucu. Yani onu bu şekilde yapmalıyım. Yinede ilgine teşekkür ederim.
Alıntı yapılan: ferdem - 17 Ekim 2017, 10:49:09
Kodu düzenlediğimden 18 MHz i görmek için tekrar uğraşmam gerekti, frekans 72 MHz, APB2 de 72 MHz de çalışacak şekilde(prescaler ayarı 0 da kalmalı):
while(1){
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
BSRR=0x...;
}

Şeklinde denedim, BSRR nin set ve reset bitleri datasheetten bulunacak, bende pin13 için 13 ve 29 oluyor. Compile options dan "optimize for speed" seçilmezse çıkış 4 MHz ler civarında kalıyor. Optimizasyon seçeneğiyle 18 MHz i görebildim, burada neyi optimize etti de hızı arttırdı bilemiyorum. Belki daha doğru yöntemler vardır, benimkisi çalakalem bir deneme oldu.

Cemre'nin bahsettiği OC Toggle olayını bilmiyordum, deneyip görmek lazım.

Optimizasyon seçeneğini denemedim. Bu doğru işlem olabilir. Deneyeceğim

crazy

 TIMx->CCMR1 registerin toogle modunu aktif edince frekans yarıya düşüyor. PWM mode 1 veya 2 mode seçili ise 18Mhz çıkış var.

#include "stm32f10x.h"                  // Device header


int main(void)

{
    RCC->APB2ENR |= 0x00000004;  /*GPIOA clock enable*/
    RCC->APB1ENR |= 0x00000001; /*TIM2 clock enable */
    GPIOA->CRL   &= 0xFFFFFFF0; 
    GPIOA->CRL   |= 0x0000000B;/*AF  mode - 50 MHz  PA0 */
    TIM2->PSC     = 0;
    TIM2->ARR     = 3;
    TIM2->CCMR1  |= 0x006C;/*Output compare 1 preload enable,Output compare 1 fast enable,Bits 6:4 OC1M: Output compare 1 mode PWM mode 1 */
    TIM2->CCER   |= 0x0001; /*CC1E: Capture/Compare 1 output enable*/
    TIM2->CCR1    = 1;    /*Duty*/
    TIM2->CR1    |= 0x081;/*Timer enable*/
	  while (1)

    {

       

        }

    }