Bu registerı nasıl okuyabilirim?

Başlatan Kırambor, 26 Temmuz 2022, 11:26:48

Kırambor

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.






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ı ?

RaMu

__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    
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

volkanunal

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

Primum nil nocere