STM32F407VG çalışma zamanında bir pin analog giriş olarak ayarlanamıyor mu ?

Başlatan AsHeS, 20 Mart 2013, 05:00:15

AsHeS

Merhabalar olabilecek en basit şekliyle STM32F4discovery kitle ADC okumaya çalışıyorum.DMA kapattım sadece ben uyardığım zaman okuyacak şekle soktum(öğrenmek için zorluyorum bunu :) ) fakat şunu farkettim ki bir pin aşağıda ki dijital tanımlandığında çalışma zamanında analoğa döndürmek için bir API fonksiyonu bulamadım.
Not:PA0 buton girişi,PA1 adc okuma için çalışıyorum aşağıda ki gibi PA0 ve GPIOD de ki ledleri açtım.
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA, ENABLE);
 GPIOD_InitStruct.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
	GPIOD_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
	GPIOD_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;
GPIOD_InitStruct.GPIO_OType=GPIO_OType_PP;
	GPIOD_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_Init(GPIOD,&GPIOD_InitStruct);
 GPIOD_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIOD_InitStruct.GPIO_Mode=GPIO_Mode_IN;
GPIOD_InitStruct.GPIO_OType=GPIO_OType_OD;
	GPIOD_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
		GPIO_Init(GPIOA,&GPIOD_InitStruct);

Bu aşamadan sonra GPIOA'ya 1. pinini analog yapmak için baktığım fonksiyonlarda şunu buldum:
void GPIO_PinAFConfig  ( GPIO_TypeDef *  GPIOx,  
  uint16_t  GPIO_PinSource,  
  uint8_t  GPIO_AF  
 )

Fakat bu fonksiyonun aldığı değerler tablosunda analog giriş yok ve bu fonksiyon zaten alternate function registerine etki ediyor benim aradığım ise MODER registerine etki eden ve o pini analoğa dönüştüren fonksiyon fakat bulamadım.



AsHeS




Klein

typedef enum
{
  GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
  GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
  GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOx, &GPIO_InitStructure);

AsHeS

Alıntı yapılan: Klein - 20 Mart 2013, 17:26:38
typedef enum
{
  GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
  GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
  GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOx, &GPIO_InitStructure);
Hocam sıkıntı zaten bu structta ben gpioa da bir giriş tanımlayıp gpio_init fonksiyonu çagirdigimda o pin giriş oluyor ama bir daha gpio_init çağrıldığında o pin kapatılmaz mı??
EDIT:
Soruyu biraz daha özelleştirmeyim a PORTunun yarısını analog giriş yarısını dijital çıkış nasil yaparız

Klein

STM32F4'te Pinler default olarak giriş. Eğer bir pini analog yaptınız. Sonra da bu pinin analog özelliğini kaldırmak istiyorsanız  input yapmanız gerek. Tamamen kapatamazsınız. RCC'den CLk kaynağını kesersiniz ancak tek pini değil  portun tamamını pasif hale getirir.


Örn.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

Analog özelliğini kaldırmak için giriş  yaparız

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

Basit bir fonksiyon yazdım. bunu kullanabilirsin.

void ChangePinMode(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint32_t Mode)
{
GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin
GPIO_InitStructure.GPIO_Mode = Mode;
GPIO_Init(GPIOx, &GPIO_InitStructure);
}


kullanımı

if( PortDigital)
{
    ChangePinMode(GPIOB, GPIO_Pin_0, GPIO_Mode_IN);
}else{
    ChangePinMode(GPIOB, GPIO_Pin_0, GPIO_Mode_AN);
}



AsHeS

Alıntı yapılan: Klein - 20 Mart 2013, 17:44:40
STM32F4'te Pinler default olarak giriş. Eğer bir pini analog yaptınız. Sonra da bu pinin analog özelliğini kaldırmak istiyorsanız  input yapmanız gerek. Tamamen kapatamazsınız. RCC'den CLk kaynağını kesersiniz ancak tek pini değil  portun tamamını pasif hale getirir.


Örn.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

Analog özelliğini kaldırmak için giriş  yaparız

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Klein hocam struct içerisinde hangi pini yazıyorsa sadece o mu etkileniyor

Klein

Evet sadece o etkilenir.

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_1| GPIO_Pin_0| GPIO_Pin_15;

böyle yaptığımızda Pin0,Pin1,Pin3,Pin15  etkilenir.

Eğer GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; yaparsak sadece Pin3 etkilenir.