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?
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.
Hocam zaten yukardaki adres ODR'nin
Problemi gorunce dogrudan set reset registere ulastigini dusundum. Adresi hesaplamadim ama adresi bir daha kontrol et derim.
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.
0x18 ile neden topluyorsun?
Hocam ODR'nin offseti.
0x0C değilmi?
Edit: Yalniz STM32F10x diye baktim, F45de hakli olabilirsin. F4 dokumanina bakmadim.
Hocam şu an farkettim ODR'nin offseti 0x14 müş.Yani durum sizin dediğiniz gibi oluyor.0x18 BSRR nin offseti'ymiş.:)
@yamak hocam
neden standart peripheral library 'i kullanmıyorsunuz ?
orada register seviyesinde uğraşmazsınız kolayca yazarsınız
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.