STM32F4 Port Config header dosyası

Başlatan Klein, 15 Ocak 2012, 18:52:59

Klein

V1.1.0
Alternatif fonksiyon tanımlamaları eklendi.  Bu eklemeyle portlar tamamlanmış oldu.

Kullanımı:
Portu başka donanımlarla ilişkilendirmek için;
AFR registerlerinden o port için hangi alternatif fonksiyonu kullanacağımızı seçeriz.
MODER registerinden, portu alternatif fonksiyona yönlendiririz.

Bunun için önce o portun hangi alternatif fonksiyonları olduğunu bulmak veya istediğimiz fonksiyona hangi portun sahip olduğunu bulmak gerekir.

Örneğin USART3 kullanmak istiyoruz.
Önce Hard:49 dan USART3'ü buluyoruz. Buradan USART3 ile ilişkili portların PB10..PB14 olduğunu görüyoruz. USART3 yazan sütunun en üstüne baktığımızda ise bu fonksiyonun AF7 ( alternatif fonksiyon 7 ) olduğunu görürüz.
Şimdi portlarımızı USART3 ile ilişkilendirelim.

PB->AFR.pin.p10 = PORT_AF7_USART3;                  // PORTB_10 pinimizi USART3 ile ilişkilendirdik.  Bu pin TX (Hard:49)
PB->MODER.pin.p10 = PORT_ALTERNATE_FUNC;    // PORTB_10 pinimizi alternatif fonksiyon ile kullanmak istediğimizi bildirdik.
 
PB->AFR.pin.p11 = PORT_AF7_USART3;                 // PORTB_11 pinimizi USART3 ile ilişkilendirdik.  Bu pin RX (Hard:49)
PB->MODER.pin.p11 = PORT_ALTERNATE_FUNC;   // PORTB_11 pinimizi alternatif fonksiyon ile kullanmak istediğimizi bildirdik.

eğer RTS, CTS, CK fonksiyonu kullanılacaksa bunlar da ilişkilendirilir.


stm32f4xx_regs.h
/**
  ******************************************************************************
  * @dosya    stm32f4xx_regs.h
  * @yazar  Picproje
  * @version V1.1.0
  * @date    25-August-2011
  * @özet    STM32F4 - Cortex-M4 register tanımlamaları. 
  *				STM32F4xx.h tanım dosyası ile birlikte kullanılır. tek başına kullanılmaz.
  *				register isimlendirmelerinde STM32F4xx.h ve ilgili dokümanlardaki isimlendirmelere 
  *				sadık kalınmaya çalışılmıştır.
  * @revizyon geçmişi 
  *				V1.0.0	16.01.2012  Başlangıç. GPIO portlarına ilişkin tanımlamalar.
  *				V1.0.1	16.01.2012	Portların BASE adreslerindeki hata düzeltildi.
  *				V1.0.2	17.01.2012	T_uint32_4BitType tipi veri tipler ve boyutu arasındaki uyumsuzluk düzeltilerek, 
  *									veri tipi 64 bit tiple güncellendi. T_uint64_4BitType olarak değiştirildi.
  *									işlev tanım kümelerinin isimleri hangi register ile ilgili olduğunu 
  *									gösterecek şekilde değiştirildi.
  *				V1.1.0	18.01.2012	Portların alternatif fonksiyonlarının tanımları yapıldı.			
  * 
  ******************************************************************************
  */ 


#include "STM32F4xx.h" 

enum PORTMODER {PORT_INPUT,	PORT_OUTPUT, PORT_ALTERNATE_FUNC, PORT_ANALOG};
enum PORTOTYPER {PORT_PUSH_PULL,	PORT_OPEN_DRAIN};
enum PORTOSPEEDR {PORT_LOW_SPEED, PORT_MED_SPEED, PORT_FAST_SPEED, PORT_HI_SPEED};
enum PORTPUPDR {PORT_NOPU_NOPD, PORT_PULL_UP, PORT_PULL_DN, PORT_UNDEFINED};
enum PORTLCKR {PORT_CFGLOCK_PASSIVE,PORT_CFGLOCK_ACTIVE};
enum PORTAFR {	PORT_AF0_SYSTEM =0, 
				PORT_AF1_TIM1 =1, PORT_AF1_TIM2 =1,
				PORT_AF2_TIM3 =2, PORT_AF2_TIM4 =2, PORT_AF2_TIM5 =2,
				PORT_AF3_TIM8 =3, PORT_AF3_TIM9 =3, PORT_AF3_TIM10 =3, PORT_AF3_TIM11 =3,
				PORT_AF4_I2C1 =4, PORT_AF4_I2C2 =4, PORT_AF4_I2C3 =4,
				PORT_AF5_SPI1 =5, PORT_AF5_SPI2 =5,
				PORT_AF6_SPI3 =6,
				PORT_AF7_USART1 =7, PORT_AF7_USART2 =7, PORT_AF7_USART3 =7,
				PORT_AF8_USART4 =8, PORT_AF8_USART5 =8, PORT_AF8_USART6 =8,
				PORT_AF9_CAN1 = 9, PORT_AF9_CAN2 =9, PORT_AF9_TIM12 =9, PORT_AF9_TIM13 =9, PORT_AF9_TIM14 =9,
				PORT_AF10_OTGFS =10, PORT_AF10_OTGHS =10,
				PORT_AF11_ETH =11,
				PORT_AF12_FSMC =12, PORT_AF12_SDIO =12, PORT_AF9_OTGHS =12, // FS KONFİGÜRASYONUNA BAK
				PORT_AF13_DCMI =13,
				PORT_AF14_NONE =14,
				PORT_AF15_EVENTOUT =15
				 
				};


#define PA               ((PORTIO_TypeDef *) GPIOA_BASE)
#define PB               ((PORTIO_TypeDef *) GPIOB_BASE)
#define PC               ((PORTIO_TypeDef *) GPIOC_BASE)
#define PD               ((PORTIO_TypeDef *) GPIOD_BASE)
#define PE               ((PORTIO_TypeDef *) GPIOE_BASE)
#define PF               ((PORTIO_TypeDef *) GPIOF_BASE)
#define PG               ((PORTIO_TypeDef *) GPIOG_BASE)
#define PH               ((PORTIO_TypeDef *) GPIOH_BASE)
#define PI               ((PORTIO_TypeDef *) GPIOI_BASE)


//#define PORT_D *(__IO uint32_t *)0x40020C14
typedef union
{
  __IO uint16_t all;
  	struct {
  		__IO uint16_t p0:1;	
  		__IO uint16_t p1:1;	
  		__IO uint16_t p2:1;	
  		__IO uint16_t p3:1;	
  		__IO uint16_t p4:1;	
  		__IO uint16_t p5:1;	
  		__IO uint16_t p6:1;	
  		__IO uint16_t p7:1;	
  		__IO uint16_t p8:1;	
  		__IO uint16_t p9:1;	
  		__IO uint16_t p10:1;	
  		__IO uint16_t p11:1;	
  		__IO uint16_t p12:1;	
  		__IO uint16_t p13:1;	
  		__IO uint16_t p14:1;	
  		__IO uint16_t p15:1;	
	}pin;
}T_uint16_BitType;

typedef union
{
  __IO uint32_t all;
  	struct {
  		__IO uint32_t p0:1;	
  		__IO uint32_t p1:1;	
  		__IO uint32_t p2:1;	
  		__IO uint32_t p3:1;	
  		__IO uint32_t p4:1;	
  		__IO uint32_t p5:1;	
  		__IO uint32_t p6:1;	
  		__IO uint32_t p7:1;	
  		__IO uint32_t p8:1;	
  		__IO uint32_t p9:1;	
  		__IO uint32_t p10:1;	
  		__IO uint32_t p11:1;	
  		__IO uint32_t p12:1;	
  		__IO uint32_t p13:1;	
  		__IO uint32_t p14:1;	
  		__IO uint32_t p15:1;	
  		__IO uint32_t :16;	
	}pin;
}T_uint32_BitType;

typedef union
{
  __IO uint32_t all;
  	struct {
  		__IO uint32_t p0:2;	// 00 input(reset state) , 01 gp out, 10 Alternate , 11 Analog
  		__IO uint32_t p1:2;	
  		__IO uint32_t p2:2;	
  		__IO uint32_t p3:2;	
  		__IO uint32_t p4:2;	
  		__IO uint32_t p5:2;	
  		__IO uint32_t p6:2;	
  		__IO uint32_t p7:2;	
  		__IO uint32_t p8:2;	
  		__IO uint32_t p9:2;	
  		__IO uint32_t p10:2;	
  		__IO uint32_t p11:2;	
  		__IO uint32_t p12:2;	
  		__IO uint32_t p13:2;	
  		__IO uint32_t p14:2;	
  		__IO uint32_t p15:2;	
	}pin;
}T_uint32_2BitType;

typedef union
{
  __IO uint64_t all;
 __IO uint32_t all32_lo;
 __IO uint32_t all32_hi;
  	struct {
  		__IO uint64_t p0:4;	// 00 input(reset state) , 01 gp out, 10 Alternate , 11 Analog
  		__IO uint64_t p1:4;	
  		__IO uint64_t p2:4;	
  		__IO uint64_t p3:4;	
  		__IO uint64_t p4:4;	
  		__IO uint64_t p5:4;	
  		__IO uint64_t p6:4;	
  		__IO uint64_t p7:4;	
  		__IO uint64_t p8:4;	
  		__IO uint64_t p9:4;	
  		__IO uint64_t p10:4;	
  		__IO uint64_t p11:4;	
  		__IO uint64_t p12:4;	
  		__IO uint64_t p13:4;	
  		__IO uint64_t p14:4;	
  		__IO uint64_t p15:4;	
    }pin;
}T_uint64_4BitType;



typedef struct
{
    T_uint32_2BitType MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  	T_uint32_BitType OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  	T_uint32_2BitType OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  	T_uint32_2BitType PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  	T_uint32_BitType IDR; 		 /*!< GPIO port input data register,         Address offset: 0x10      */
  	T_uint32_BitType ODR;     	 /*!< GPIO port output data register,         Address offset: 0x14      */
  	T_uint16_BitType BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  	T_uint16_BitType BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  	T_uint32_BitType LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  	T_uint64_4BitType AFR;   /*!< GPIO alternate function registers,     Address offset: 0x24-0x28 */
} PORTIO_TypeDef;

CLR

Klein güzel olmuş. Bende benzer yapı oluşturmuştum. Şimdiki kullandığım kütüphanenin bir eski versiyonuna ait görüntüleri aşağıdaki linkte bulabilirsin.

http://www.uicroarm.com/stm32-ozel-kutuphane

Yenisi ise benzer ama daha fonksiyonel ve aynı asm çıktısına sahip. STM32nin tüm registerleri için bu yapıyı oluşturdum. Fikir olsun diye aşağıya bazı örnekler yazdım.


// 32bit erişim
GpioaRegs->crh.b32=0x22222222;    // bu 32bit erişim

// 16bit erişim
GpioaRegs->crh.b16.low=0x2222;     // bu 32bitin low halfword'una erişim
GpioaRegs->crh.b16.high=0x2222;     // bu 32bitin high halfword'una erişim

// 8bit erişim, 2 şekilde yapılabilir, dizi veya doğrudan
GpioaRegs->crh.b8.B0=0x12;
GpioaRegs->crh.b8.B1=0x12;
GpioaRegs->crh.b8.B2=0x12;
GpioaRegs->crh.b8.B3=0x12;
// dizi olarak erişim (özellikle can bus veya byte türünden transferlerde oldukça faydalı)
GpioaRegs->crh.Bytes[x]=0x12;  

// bit modunda ama registerde kaç bir ise o kadar , mesela mode ve cnf 2bitliktir
GpioaRegs->crh.bits.MODE9=GpioMODE_50mhz_out;    // 50mhz out
GpioaRegs->crh.bitsCNF9=GpioCNF_PUPD_in_APP_out;  // alternate pushpull veya alternernatif fonksiyon

RccRegs->cr.bits.HSION=1;
while(!RccRegs->cr.bits.HSIRDY);
Knowledge and Experience are Power

aykerme

niye bunlarla ugrasiyorsunuz ki zaten bunlar hazir olarak var. ST nin standart peripheral library leri var.

CLR

Çünkü asm temelinden gelen alışkanlık,  işlemci donanım bilgisini arttırmak , C 'nin derinlemesine kullanımı, programda hata yapımını azaltmak (bu göreceli olabilir, bit veya bitler bazında çalışmakta çok kolaylık sağlıyor), bit bazında erişim ve hep zor yolu seçme ve detaylarla uğraşmak diyebiliriz.   

ST nin standart peripheral library'sine gelince onu sisteme entegre çok kolay. 
Knowledge and Experience are Power

XX_CİHAN_XX

+1

Ayrıca standart librarydeki en basit bit set, reset fonksiyonları bile asm sadeliğine sahip değil belli standartları ve konforu yakalamak için bu sadelikten ödün verilmiş.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.