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