STM32F1xx GPOI denemesi

Başlatan SpeedyX, 03 Şubat 2013, 16:14:23

SpeedyX

Merhaba

STM32F103RC ile led yak söndür programını Std periph lib ile yapmaya çalıştım fakat sonuç negatif.
init:
GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12;
	GPIO_Init(GPIOB, &GPIO_InitStructure);


main while(1) döngüsünde
sat++;
		
		if(sat == 0)
		{
			GPIO_SetBits(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);
		}
		else if(sat == 0xFFFF/2)
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);
		}


Pinler sürekli "0", hiç "1" olmuyorlar, problem nerede olabilir?

X-Fi

Hocam bu şekilde init etmelisiniz.

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

SpeedyX

#2
Merhaba,

Öyle yapınca aşağıdaki hatayı alıyorum.
usbd_STM32F103.c(107): error:  #20: identifier "GPIO_Mode_OUT" is undefined


mesaj birleştirme:: 03 Şubat 2013, 17:07:51

Tüm main.c içeriğini ekliyorum, belki faydası olur.

#include <RTL.h>
#include <rl_usb.h>
#include <stm32f10x.h>                         /* STM32F10x Definitions      */
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void SetupPeriph(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	/*
	GPIO_DeInit(GPIOA);
	GPIO_DeInit(GPIOB);
	GPIO_DeInit(GPIOC);
	GPIO_DeInit(GPIOD);
	GPIO_AFIODeInit();
	*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}


void SysTick_Handler(void)
{
/*	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == Bit_SET)
	{
		GPIO_ResetBits(GPIOC,GPIO_Pin_8);
	}
	else
	{
		GPIO_SetBits(GPIOC,GPIO_Pin_8);
	}
	*/
}

int main (void) {
	SystemInit();
	SetupPeriph();
  //usbd_init();                          /* USB Device Initialization          */
  //usbd_connect(__TRUE);                 /* USB Device Connect                 */

	//SysTick_Config(SystemCoreClock/1000000);
	
  while (1) {
	GPIO_SetBits(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);
  }
}

muhittin_kaplan

Hocam Kolay Gelsin.

önce kullanacağımız dosyaları projeye dahil edeceğiz.  daha sonra tanımlamaları yapacağız.

GPIO_InitTypeDef  GPIO_InitStructure;


daha sonra RCC yi kuracağız.

void SetSysClockHSI(void)
    {
       RCC_DeInit();
 
       RCC_HSICmd(ENABLE);
       RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCKL(AHB) 64mhz
       RCC_PCLK1Config(RCC_HCLK_Div2);  //PCLK2(APB2) 32Mhz
       RCC_PCLK1Config(RCC_HCLK_Div1);    //PCLK1(APB1) 64Mhz
 
       FLASH_SetLatency(FLASH_Latency_2);
       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
 
       RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_CFGR_PLLMULL16);//64mhz
       RCC_PLLCmd( ENABLE);
 
            while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            {
            }
 
            RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
 
            while (RCC_GetSYSCLKSource() != 0x08)
            {
            }

}


sonrasında GPIO lara Ayarlayacağız

void GPIO_Configuration(void)
{
 /*GPIO lara ve AFIO ya clock uygulanıyor*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD
            | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);


/*
 * GPIOC12 giriş olarak GPIOD.2 çıkış olarak ayarlanıyor
 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}



SpeedyX

Tüm projeyi ekliyorum;

_HID_test.rar - 2.0 Mb

C:\Keil\ARM\Boards\Keil\MCBSTM32\RL\USB\Device\HID projesini kopyalayıp üzerinde değişiklikler yaptım.

Kütüphanelere erişim için projeyi C:\Keil\ARM\Boards\Keil\MCBSTM32\ klasöründe tutuyorum.

muhittin_kaplan

main fonksiyonda ise önce SetSysClockHSI yi sonrasında GPIO_Configuration çağıracağız

void main()
{
SetSysClockHSI();
GPIO_Configuration();

GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET); //GPIO_SetBit(LED_PORT,GPIO_LedPin)
bekleme......
GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);//GPIO_ResetBit(LED_PORT,GPIO_LedPin)
bekleme......

}

SpeedyX

Hepsini yaptım ama değişiklik yok, program atıyorum fakat pinler sabit "0". Donanımsal bir problem olabileceğinden şüpheleniyorum

Bana test amaçlı PC8 i saniyede bir toggle yapan programın hex kodunu göndermeniz mümkün mü? Böylece devreyi deneyebilirim.
Port B -> GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12 pinleri de aynı şekilde toggle yapılabilir.

İşlemci olarak STM32F103RCT6 seçilecek.

muhittin_kaplan


SpeedyX

#8
Tamamdır hocam teşekkürler, hem Keil in Blinky projesi hemde senin gönderdiğin dosya çalışıyor.
Blinky de hem _md.s hem _hd.s ile denedim, ikisinde de aynı davranıyor. 1s arayla led yak söndür yapıyor. Yalnız orada system init çağırılmıyor, sanırsam 8mhz de çalışıyor.
Senin gönderdiğinde ise led çok hızlı yanıp sönüyor.

Şimdi asıl mesele, buraya yüklemiş olduğum projeyi o hale nasıl getirebilirim..

En basitinden PC1 PC2 adc kanallarından okunanı PA4 PA5 DAC kanallarına aktarmak istiyorum, ister dma ister direkt... StdPeriph kullanımını oturtsam gerisi gelecek.


mesaj birleştirme:: 03 Şubat 2013, 19:49:20

İlla Keil kullanmak şart değil, CoCoox da kullanabilirim.

muhittin_kaplan

#9
hocam ben alalade bir while döngüsü kurdum. zaman tam 1sn değildir.
keil e gelince ben hala kullanamıyorum

mesaj birleştirme:: 03 Şubat 2013, 19:51:39

benim gönderdiğim HSI, 48mhz de PLL ile çalışıyor.

SpeedyX

Keil projesinde yardımcı olabilecek yok mu?