Ynt: STM32F4 Std_LIB Kullanımı (Örnek)

Başlatan Klein, 26 Ekim 2012, 16:10:47

matador

Keilde pwm kullanımıyla uğraşıyorum anlamadığım bir şey var. Hazır örneklerde ki kodun noktası virgülüne aynısını yazıyorum tek fark örnekte discovery üstünde ki ledlerin bağlı d12,d13,d14,d15 bitleri kullanılmış ben bunlar yerine c12,c13,c14,c15 bitlerini kullanmak istiyorum tek yaptığım hazır koddaki "D" leri "C" yapmak ama çalışmıyor. Atladığım bir yer mi var?

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* TIM4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOC, &GPIO_InitStructure); 

  /* Connect TIM4 pins to AF2 */  
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_TIM4);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource13, GPIO_AF_TIM4);
}

void pwm()
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 21000000) - 1;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 2099;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM4, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM4, ENABLE);

  /* TIM4 enable counter */
  TIM_Cmd(TIM4, ENABLE);
}

sseedat

Alıntı yapılan: mir_as82 - 16 Aralık 2013, 07:13:47
LCD te yazma programini kendiniz mi yazdiniz yoksa. Hazir kutuphane mevcut mu?

Kendiniz yazdiysaniz kodlari kisaca açıklar mısınız?

Merhaba Coocox Ide de hd44780 driver bulunmakta  isterseniz kullanabilirsiniz.Fakat coocox un yazılımı karışık geldi ondan kendim yazdım.

kullandığım yazılımın tamamı, pin bağlantılarını  belirledim;

-lcd'nin RS adlı bacağı  STM kitinin B portunun 4. pinine bağlı
-E bacağı B portunun 5. pinine bağlı
-R/W bacağını toprağa verdik :)
-VCC kaynağını kit üzerindeki +5v bacağından besledik
-VSS/GND yine kit üzerindeki GND pinine bağladık
-Lcd veri ilteme portunu kitin D portu ile sağlıyoruz(GPIOD'nin 0,1,2 ve 3. bacaklarına bağladık)
GPIOD_pin0---->lcdPort_D4
GPIOD_pin1---->lcdPort_D5
GPIOD_pin2---->lcdPort_D6
GPIOD_pin3---->lcdPort_D7   şeklinde

Bağlantılar bu şekilde.
Lcd ye veri gönderirken 8 bit olarak değil de 4 bit olarak gönderiyoruz(4 bacak az kullandık fakat veri iletim hızını da 2 kat düşürmüş olduk:))


  Şimdi lcd için yazdığımız kaynak dosyaları yazalım;

lcd.h dosyası;

extern void lcd_init(void);
extern void lcd_veri(unsigned char veri);
extern void lcd_git(unsigned char p1,unsigned char p2);
extern void yaz(unsigned dat);
extern void lcd_yaz(unsigned char *lcd_data);
extern void lcd_sil(void);
extern void lcd_imlec_var(void);
extern void lcd_imlec_yok(void);

lcd.c dosyası;

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "lcd.h"
#include "Delay.h"


/*Lcd RS pin GPIOB pin 4
*Lcd E pin GPIOB pin 5
*Lcd Data port GPIOD(pin 0,1,2,3)
*
*
*/
    GPIO_InitTypeDef lcd_port;

void lcd_init()
{

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    //GPIOB
    lcd_port.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
    lcd_port.GPIO_Mode=GPIO_Mode_OUT;
    lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
    lcd_port.GPIO_OType=GPIO_OType_PP;
    lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB,&lcd_port);

    //GPIOD

    lcd_port.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
    lcd_port.GPIO_Mode=GPIO_Mode_OUT;
    lcd_port.GPIO_Speed=GPIO_Speed_2MHz;
    lcd_port.GPIO_OType=GPIO_OType_PP;
    lcd_port.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD,&lcd_port);

    GPIO_ResetBits(GPIOB,GPIO_Pin_4 | GPIO_Pin_5);
    GPIO_ResetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

    delayms(20);

    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    lcd_veri(0x03);
    lcd_sil();
    lcd_veri(40); 
    lcd_veri(15); 
    lcd_veri(0x06);
    lcd_sil();       
    lcd_veri(128);

}

void lcd_veri(unsigned char veri)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
    delayms(10);

     GPIOD->ODR =(veri & 0xF0)>>4; 
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
     delayms(1);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
      delayms(1);

       GPIOD->ODR=((veri & 0x0F));   
      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
      delayms(10);
}

void lcd_git(unsigned char p1,unsigned char p2)
{
    if (p1==1)
    {
     lcd_veri(0x80+(p2-1));
   
    }
    else
    {
        lcd_veri(0xC0+(p2-1));
       
        }
}

void lcd_yaz(unsigned char *lcd_data)
{
    delayms(10);
    while(*lcd_data)  yaz(*lcd_data++);
}

void yaz(unsigned  dat)
{
     GPIO_SetBits(GPIOB,GPIO_Pin_4);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
     delayms(10);

    GPIOD->ODR = (dat & 0xF0)>>4;
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
     delayms(1);
     GPIO_SetBits(GPIOB,GPIO_Pin_5);
     delayms(1);

    GPIOD->ODR = ((dat & 0x0F));
     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
void lcd_sil(void)
{
    lcd_veri(1);
    delayms(10);
}

void lcd_imlec_yok(void)
{
    lcd_veri(0x0C);
    delayms(10);
}

void lcd_imlec_var(void)
{
     lcd_veri(0x0F);
    delayms(10);
}

Kullandığımız Geçikme fonksiyonu;

Delay.h
extern void delayms(unsigned long Bekle);
extern void delayus(unsigned long Bekle);

Delay.c



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//         Kullanılışı;
//         Delay_ms(100);   // 100 msn Bekle.
//         Delay_us(100);   // 100 usn Bekle.
//         Not CPU OSC = 168 mhz - 210 MIPS

#include "Delay.h"

void delayms(unsigned long Bekle)
{
    Bekle = Bekle * 21008;    // mSn ye ye çevirdik. OSC 168Mhz de uçuyor.
    while(Bekle>0){Bekle--;}
}

void delayus(unsigned long Bekle)
{
    Bekle = Bekle * 21;    // uSn ye ye çevirdik. OSC 168Mhz de uçuyor.
    while(Bekle>0){Bekle--;}
}

main.c

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include  "stm32f4xx_adc.h"
#include   "lcd.h"
#include  "Delay.h"



int main(void)
{
    GPIO_InitTypeDef ledPort;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
ledPort.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
ledPort.GPIO_Speed=GPIO_Speed_25MHz;
ledPort.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Init(GPIOD,&ledPort);
   SystemInit();



lcd_init();
lcd_yaz("*****2*16 Lcd****");
lcd_git(2,1);
lcd_yaz("Hello World!!!!");
GPIO_SetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);


    while(1)
    {

    }
}
Görünmez bir mezarlıktır Zaman...

sseedat

Alıntı yapılan: X-Fi - 16 Aralık 2013, 11:37:09
Sorunun temeli hız farkı ile alakalı  GPIO_Write() bir alt fonksiyondur. GPIO->ODR ise işlemcide register adresine karşılık gelir.

CMSIS tanımlamalarını direk veya kendiniz define tanımlayıp kullanırsanız. GPIO_Write() fonksiyonundan daha az kod üretilir.

Hocam
GPIO_Write() kullanımını Debug ederek incelemeye çalıştım fakat nedense istediğim gibi olmadı mesela  GPIO_Write(GPIOD,0xf00000000); değerini yazdığımda 0x00000001 şeklinde register değişimi oluyordu fazla kurcalamadım bende olduğu gibi bıraktım :)
 
  Eğer sorun hız ise GPIO_Write() lcd ye veriyi sağlıklı yollamayacak kadar yavaş mı çalışıyor?
Görünmez bir mezarlıktır Zaman...