Stm32f4 Bit-Banding problemi

Başlatan yamak, 26 Kasım 2014, 11:51:01

yamak

Stm32f401'de bit-banding ile gpio'lara erişmeye çalışıyorum.Fakat istediğim gpio yu set edebilirken reset edemiyorum.Örneğin GPIOD-13 pinine aşağıdaki gibi eriştiğimde set edebiliyorum

*((unsigned int*)0x42418334)=1;


fakat aşağıdaki gibi yaptığımda reset edemiyorum

*((unsigned int*)0x42418334)=0;


Gözümden kaçırdığım bi kısım mı var acaba?

z

GPIO set ve reset registerleri ayri ayri. Bir de output registeri var.

Output registerinden 1 ve 0 yaparak pini 1/0 yapabilirsin. Fakat Set registerine 1 yapip pini 1 yaparken 0 yazarak pini 0 yapamazsin.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam zaten yukardaki adres ODR'nin

z

Problemi gorunce dogrudan set  reset registere ulastigini dusundum. Adresi hesaplamadim ama adresi bir daha kontrol et derim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam adres hesabım aşağıdaki gibi:
#define BITBAND_BASE_ADDRESS 0x42000000
#define PERIPHERAL_BASE_ADDRESS 0x40000000
#define BITBAND_ADDRESS(gpio_base,bit) ((unsigned int*)(BITBAND_BASE_ADDRESS+((gpio_base+0x18-PERIPHERAL_BASE_ADDRESS)<<5)+ (bit<<2)))

Kullanım şeklimde aşağıdaki gibi:
*BITBAND_ADDRESS(GPIOD_BASE,13)=1;
*BITBAND_ADDRESS(GPIOD_BASE,13)=0;

şeklinde.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak


z

0x0C değilmi?

Edit: Yalniz STM32F10x diye baktim, F45de hakli olabilirsin. F4 dokumanina bakmadim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam şu an farkettim ODR'nin offseti 0x14 müş.Yani durum sizin dediğiniz gibi oluyor.0x18 BSRR nin offseti'ymiş.:)

magnetron

@yamak hocam

neden standart peripheral library 'i kullanmıyorsunuz ?

orada register seviyesinde uğraşmazsınız kolayca yazarsınız

yamak

Hocam Std library i gerekli durumlarda kullanıyorum.Şimdi yazdığım programda yaklaşık 60 adet gpio'yu USB den gelen bilgiye göre kontrol etmem gerekiyodu.Ben de kontrol edilecek tüm pinlerin bit-band adreslerini bir dizide tutup gelen veriyi parse edip diziye index olarak veriyorum ve o pini yine gelen dataya göre 1 veya 0 yapıyorum.O sebepten bu şekilde yapmam daha cazip geldi bana.