Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Kırambor - 26 Temmuz 2022, 11:26:48

Başlık: Bu registerı nasıl okuyabilirim?
Gönderen: Kırambor - 26 Temmuz 2022, 11:26:48
Merhabalar herkese,

Üreticinin GPIO driver kütüphanesine baktığımda GPIO_ReadPin() gibi bir fonksiyon göremedim bu yüzden kendim yazmak istedim. Mikroişlemcinin GPIO registerlarını okuduğumda pin durumunu sorgulamak için fotoğraftaki registerı okuyabileceğimi registerın açıklamasında gördüm.


(https://i.ibb.co/g6Zh260/image.png) (https://ibb.co/g6Zh260)

(https://i.ibb.co/3z4qxXC/1.png) (https://ibb.co/3z4qxXC)

Fakat ben bu registerı nasıl okuyacağımı çözemedim. Mod,interrupt vs registerlarına üreticinin oluşturduğu GPIO_T structure'ından erişebiliyorum. Ama aradığım registerı bulamadım orada.

typedef struct
{
    __IO uint32_t MODE;               /*!< [0x0000] PA I/O Mode Control                                              */
    __IO uint32_t DINOFF;             /*!< [0x0004] PA Digital Input Path Disable Control                            */
    __IO uint32_t DOUT;               /*!< [0x0008] PA Data Output Value                                             */
    __IO uint32_t DATMSK;             /*!< [0x000c] PA Data Output Write Mask                                        */
    __I  uint32_t PIN;                /*!< [0x0010] PA Pin Value                                                     */
    __IO uint32_t DBEN;               /*!< [0x0014] PA De-bounce Enable Control Register                             */
    __IO uint32_t INTTYPE;            /*!< [0x0018] PA Interrupt Trigger Type Control                                */
    __IO uint32_t INTEN;              /*!< [0x001c] PA Interrupt Enable Control Register                             */
    __IO uint32_t INTSRC;             /*!< [0x0020] PA Interrupt Source Flag                                       
}GPIO_T;

Şu şekilde bir fonksiyon oluşturmak istiyorum.

uint8_t GPIO_ReadPin(GPIO_T *port,uint32_t u32Pin)
{
    return(Pin durumu);
}

Nasıl okuyabilirim acaba o registerı ?
Başlık: Ynt: Bu registerı nasıl okuyabilirim?
Gönderen: RaMu - 26 Temmuz 2022, 12:59:26
__I  uint32_t PIN;                /*!< [0x0010] PA Pin Value     Yukarıdaki satırda söylemiş.

 GPIO_T.PIN    gibi bir şeyle ulaşabiliyor olman lazım.
Örneğin
bool pin5durum = PA.5    
Başlık: Ynt: Bu registerı nasıl okuyabilirim?
Gönderen: volkanunal - 27 Temmuz 2022, 12:27:08
ilgili struct yapısını bir adrese cast etmeniz gerekiyor ki memory map içerisinde orayla eşleşsin. Bu adresi datasheet üzerinden bulabilirsiniz.

Örneğin,

#define PERIPH_BASE                 (( uint32_t)0x40000000)     /*!< Perip. Control Register */
#define GPIOH_BASE                  (PERIPH_BASE + 0x041C0UL)   /*!< PORT H Control Register */
#define PH                          ((GPIO_T *)  GPIOH_BASE)    /*!< Casting to PORT H Control Register */
#define GPIO_MODE_OUTPUT            (0x1UL)                     /*!< Output Mode ideinitializer */
#define BIT0                        (0x00000001UL)              //< Bit 0 mask of an 32 bit integer[/b]

Daha sonrasında şu şekilde kullanabilirsiniz.

PH -> MODE |= BIT0; //PH0 Output Mode