STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

bilal0052

tmm hocam boş zamanımda bu konu ile ilgileneceğim eğer işe yarar bişe bulabilirsem burda paylaşırım

z

#481
STM32F407 kitde 2 gundur DMa ile memory den peripherala veri aktarimi yapmak icin ugrasiyorum. Fakat DMA garip davraniyor ve transfer edilmesi gereken veriden cok fazla sayida transfer yapiyor. (!!! 20 tane veri yerine 60 kusur bin tane !!!)

Deneme amaciyla  SPI ve USART calismasi yaptim ancak her ikisinde de ayni sorun olustu. Sorun, Peripheral flow controller olarak peripheral secildiginde ortaya cikiyor. Tersi durumda (DMA flow kontrolu ustlenirse) hata yok ancak bu da isime yaramiyor.

Bu konuda calisma yapan oldumu. Diger STM ciplere register bazinda program yazip isleten varmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 11 Aralık 2011, 16:25:07
STM32F407 kitde 2 gundur DMa ile memory den peripherala veri aktarimi yapmak icin ugrasiyorum. Fakat DMA garip davraniyor ve transfer edilmesi gereken veriden cok fazla sayida transfer yapiyor. (!!! 20 tane veri yerine 60 kusur bin tane !!!)

Deneme amaciyla  SPI ve USART calismasi yaptim ancak her ikisinde de ayni sorun olustu. Sorun, Peripheral flow controller olarak peripheral secildiginde ortaya cikiyor. Tersi durumda (DMA flow kontrolu ustlenirse) hata yok ancak bu da isime yaramiyor.

Bu konuda calisma yapan oldumu. Diger STM ciplere register bazinda program yazip isleten varmi?

Merhaba,

Aşağıya bir i2c için interruptlı dma rx, tx örneği ekledim inceleyip yaparsın. Bit bazında olduğu için kolay anlaşılır. DMA hazırlama kısmına bakarak yapabilirsin. DS1337 için kullandığım bir programdı.

void DMAChannel6_IRQHandler(void)
{
    dma_ccr6.bits.EN=0;
    dma_ifcr.bits.CTCIF6=1;
}

void DMAChannel7_IRQHandler(void)
{
    dma_ccr7.bits.EN=0;        
    dma_ifcr.bits.CTCIF7=1;
    i2c1_cr1.bits.STOP=1;
// event disable
    i2c1_cr2.bits.ITEVTEN=0;
    i2c_trans.bits.okundu=1;
}

void I2C1_ER_IRQHandler(void) // flagleri sil
{       
    i2c1_sr1.bits.OVR=0;
    i2c1_sr1.bits.AF=0;
    i2c1_sr1.bits.ARLO=0;
    i2c1_sr1.bits.BERR=0;
}

void I2C_Config(void){
    rcc_ahbenr.bits.DMAEN=1;
    
    I2c_Init();                 // i2c hazırla
    
    I2C_RCV_DMA_INIT();         // rcv dma hazırla
    I2C_TX_DMA_INIT();          // tx dma hazırla
    RTC1337.ChipId=ds1337_id;   // chip id yükle
    RTC1337.DMAuse=idle;        // boşta
    RTC1337.State=idle;         // boşta
}


/*8bit interface, memory'den peripheral'e */
void I2C_TX_DMA_INIT(void)
{
    dma_cpar6.b32=(u32)I2C1_DR_ADR;
// gonderilen adres
    dma_cmar6.b32=(u32)&RTC1337.WrBuffer[0];
    dma_ccr6.bits.DIR=1;            // Mem2Perip
// dma_cndtr6.b32=16;               // 16 adet kayıt registeri
    dma_ccr6.bits.MINC=1;           // memory adresini arttır 
    dma_ccr6.bits.PL=3;             // high piority
// dma/i2c event/error'lar enable ve priorityler 9
    dma_ch6_int_set(pri_9);
    i2c1_ev_int_set(pri_9);
    i2c1_er_int_set(pri_9);
}

void I2C_RCV_DMA_INIT(void)
{
    dma_cpar7.b32=(u32)I2C1_DR_ADR;
// alınacak adres
    dma_cmar7.b32=(u32)&RTC1337.RdBuffer[0];
    dma_ccr7.bits.DIR=0;            // Per2Mem
//  dma_cndtr7.b32=16;              // 16 adet kayıt registeri
    dma_ccr7.bits.MINC=1;           // memory adresini arttır
    dma_ccr7.bits.PL=3;             // high piority

    dma_ch7_int_set(pri_9);
    i2c1_ev_int_set(pri_9);
    i2c1_er_int_set(pri_9);
}

void RTCBufWr(u8 adres, u8 *ptrbuf, u8 datasayisi)
{ 
    u8 i;       
//  i2c1_cr1.bits.PE=0;                 // I2c disable
    RTC1337.State=ds1337_wr;            // yazma
    RTC1337.DMAuse=DMA_tx;              // dma tx
    RTC1337.WrBuffer[adres]=adres;      // adres=0 datasayisi=3 ise  RTC1337.WrBuffer[0]=0   
    datasayisi+=adres;                  // datasayisi=3       
    for(i=adres;i<datasayisi;i++)       // 0-1-2,RTC1337.WrBuffer[1-2-3], ptrbuf+0=timeregs[0]'ı gösteriri
        RTC1337.WrBuffer[i+1]=*(ptrbuf+i);  // ptrbuf, Timeregs'i gösterir 
    dma_cmar6.b32=(u32)&RTC1337.WrBuffer[adres]; // 0-1-2-3 gönderilir
    dma_cndtr6.b32=datasayisi+1;        // ilk gönderilecek adr'de eklendi

    dma_ccr6.bits.TCIE=1;               // complete int
    i2c1_cr2.bits.DMAEN=1;              // DMA enable
    i2c1_cr2.bits.ITEVTEN=1;            // int enable
    i2c1_cr1.bits.START=1;              // start bit
}

void RTCBufRd(u8 adres, u8 datasayisi)
{
    u8 c;
    if(datasayisi==1) datasayisi++;      
    RTC1337.Rdadres=adres;
    RTC1337.State=ds1337_rd;
    RTC1337.DMAuse=DMA_tx;
    i2c_trans.bits.okundu=0;
// alınacak adres
    dma_cmar7.b32=(u32)&RTC1337.RdBuffer[adres];
    dma_cndtr7.b32=datasayisi;
    dma_ccr7.bits.TCIE=1;

    i2c1_cr2.bits.LAST=1;               // DMA'da son data için nack 
    i2c1_cr2.bits.DMAEN=1;              // DMA enable
    i2c1_cr2.bits.ITEVTEN=1;            // int enable
    i2c1_cr1.bits.START=1;              // start bit 
    while(!i2c_trans.bits.okundu);

    datasayisi+=adres;                  
    for(c=adres;c<datasayisi;c++)       
    TimeRegs.Dizi[c]=RTC1337.RdBuffer[c];                                                                                    
}
Knowledge and Experience are Power

mcan

#483
Selamlar,
Bu gün bütün günümü yiyen bir olayı paylaşmak istiyorum.
Amacım spi ile iletişim kuran bir lcd  kütüphanesini kopyalayarak spi kısmını özelleştirmekti.
Kendi port tanımlamalarım,delay fonksiyonum ile birleştirip denedim ve çalışmadı ,uğraş uğraş ... sonunda debugger ile bakmaya başladığımda kodun 1.2.3.4.5.6.7.8... diye gitmesini beklerken   1.56.57.2.45.58.3.4..7.8... gibi dallanarak gittiğini fark ettim ,oysa ki programın gidişatında bu sekil dallanmalar yoktu. Programı azalta azalta azalta buna indirgedim;

PortB.Output.Pin10 = 1;
	PortB.Output.Pin10 = 0;
	PortB.Output.Pin10 = 1;
	PortB.Output.Pin10 = 0;
	PortB.Output.Pin10 = 1;
	PortB.Output.Pin10 = 0;
	GPIOB->ODR |= 0x20;
	GPIOB->ODR &= 0xFFFFFFDF;
	GPIOB->ODR |= 0x20;
	GPIOB->ODR &= 0xFFFFFFDF;
	GPIOB->ODR |= 0x20;
	GPIOB->ODR &= 0xFFFFFFDF;


Sonra debug ettiğimde debug "ok" u sadece baştan ikinci "PortB.Output.Pin10 = 0;" komutu işleyip sonra "GPIOB->ODR |= 0x20;" atlıyor.Her işlediği koda *1 yazıyor.Ancak arada ki kodlara hiç birşey yazmıyor .Zaten GPIO debug penceresinde de hiç birşey gözükmüyor...Eğer aralara delay(1) gibi bir fonksiyon atarsam hepsine  *1 verip hepsini adım adım işliyor.Neyse ki daha sonra proje ayarlarından optimizasyonun level 3 de oldugunu gördüm onu default a çektim ancak gene sıkıntı yaşadım.Optimizasyon sıfır ile problemsiz çalıştı...

Sorularım şunlar ;
1-programın belli kesimleri için farklı farklı optimizasyon levelleri ayarlayabilirmiyiz.
2-Yüksek optimizasyon seviyelerinde verdiğim örnekdeki kodun herbir adımının çalışması için ne yapmak lazım?
3-default seviyesi seviye kaçtır?
4-Keilin kendi hazır kodunda bunu kullanıyor pin erisimi icin
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_BIT_ACTION(BitVal)); 
  
  if (BitVal != Bit_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = GPIO_Pin;
  }
}
Bu kodu ard arda calıstırsam da degısık optımızasyon seviyelerinde sıkıntı yaratmıyor, bunun sebebi fonksiyon tipinde olup için de birazcık kod olması mı? Yani diğer bir deyişle benim araya koyduğum delay(1) gibi yayarmı sağlıyor.


Not : Port pinlerine erişim için tanımladığım structure içeriği ve kendisine "volatile" değimi eklediğimde optimizasyon seviyesi 3 olsa bile programım ve debugger ekranı çok güzel çalışıyor.

z

#484
2 gundur ot yoldugum program parcacigi asagida. Hatayi hala bulamadim ve ayni seylere tekrar tekrar bakmaktan usandim.
Cok basit bir hata oldugundan eminim fakat goremiyorum.

#include "STM32F4xx.h"

char RxBuf[128];
char TxBuf[128];
int cntr=0;
unsigned char WAdr,RAdr;

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/

void SystemInit()
{
unsigned int i;
      for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
      RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
      RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin       
      while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
      RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim   168 Mhz
      RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
      while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
      FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
      RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
      while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
      RCC->AHB1ENR |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
      GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

/*********************************************************************************
      USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/

void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
     cntr++;
}

void UsartInit()
{
     WAdr=0;RAdr=0;

// USART3 MODULUNU AKTIF HALE GETIRELIM

      RCC->APB1ENR|=0x00040000;   // USART3 Clk Enable (Rehber Sayfa 113)
      RCC->APB1RSTR|=0x00040000;  // USART3 Resetlendi
      GPIOB->AFR[1]=0x07777700;   // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
      GPIOB->MODER|=0x2AA00000;   // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)

// USART3 MODULUNU AYARLAYALIM    // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)

      RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim
      USART3->BRR=0X1112;         // 9600 Baud

      USART3->CR1|=0x0000202C;    // USART3 enable
      USART3->CR3|=0x80;          // DMA Transfer Enable (Transmit)
      NVIC->ISER[1]|=0x80;        // NVIC da USART3 interrupta izin verelim
}

// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir

int main()
{
volatile int i;

      UsartInit();
     
//    Bu programin yaptigi isi aciklayayim
//    USART a veri gelirse bu veri int rutininde aliniyor ve rama yaziliyor.
//    Alinan verilerin sayisini sayac degiskeninde gorebilirsiniz.       

//    DMA ise, Ramdan 20 adet veriyi tek tek USARTa yollluyor.
//    Bu da demektir ki 20 adet veri yollanacak ve rx tx birbirine telle bagli oldugu icin
//    20 adet veri alinacak ve sayac degiskenimiz 20 ye kadar sayacak.

//    Fakat DMA 20 gonderimde durmuyor. (Durmadigi icin DMA islemini baslatip, delay yapip ardindan ben durduruyorum)
//    DMA i durdurdugumda 80 kusur byte yollanmis oldugunu goruyorum. Durdurmasam 60 kusur bin byte yollayacak.

      RCC->AHB1ENR |= 0x00200000;        // DMA1 clock'u aktif edelim
      while(DMA1_Stream4->CR&1);         // DMA1 nin isi varsa bitmesini bekleyelim
      DMA1_Stream4->M0AR=(int)&TxBuf[0]; // Nereden okuyacagiz
      DMA1_Stream4->PAR=(int)&USART3->DR;// Nereye yazacagiz
      DMA1_Stream4->FCR&=~0xFFFFFF40;
      DMA1_Stream4->CR=(DMA1_Stream4->CR & 0xF0100000)| 0x0E000460;      // CH7 vs

      for(i=0;i<128;i++) TxBuf=i+1;

      DMA1_Stream4->NDTR=(DMA1_Stream4->NDTR & 0xFFFF0000)|20;   // 20 adet veri tasiyacagiz

      USART3->SR&=~0x40;
      DMA1_Stream4->CR|=1;              // Transferi baslat 

//    Bundan sonraki kodlar hatayi bulmak icin yazdigim kodlar
//    20 byte transfer ardindan DMA'in durmasi lazim ancak durmuyor 

//    Asagidaki delay 82 byte transferine neden oluyor Bu da ilginc !!!

      for(i=0;i<0x1FFFFF;i++);         

//    20 byte transfer tamamlandiginda DMA islemi durdurmasi lazim fakat durmuyor
//    Biz durduralim
       
      DMA1_Stream4->CR&=~1;             // Transferi Durdur 

//    Simdi rami gozleyin ne gitmis ne gelmis vs 

      while(1);

}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Ustteki mesaji edit etmeme ragmen sistem israrla degisiklik yaptirmiyor. Yeniden yollamak zorunda kaldim.   2 gundur ot yoldugum program parcacigi asagida. Hatayi hala bulamadim ve ayni seylere tekrar tekrar bakmaktan usandim.
Cok basit bir hata oldugundan eminim fakat goremiyorum.

#include "STM32F4xx.h"

char RxBuf[128];
char TxBuf[128];
int cntr=0;
unsigned char WAdr,RAdr;

/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/

void SystemInit()
{
unsigned int i;
      for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
      RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
      RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin       
      while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
      RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim   168 Mhz
      RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
      while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
      FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
      RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
      while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
      RCC->AHB1ENR |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim
      GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
      GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

/*********************************************************************************
      USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/

void USART3_IRQHandler()
{
volatile int Sts;
     Sts=USART3->SR;
     RxBuf[WAdr]=USART3->DR;
     WAdr=(WAdr+1)&0x7F;
     cntr++;
}

void UsartInit()
{
     WAdr=0;RAdr=0;

// USART3 MODULUNU AKTIF HALE GETIRELIM

      RCC->APB1ENR|=0x00040000;   // USART3 Clk Enable (Rehber Sayfa 113)
      RCC->APB1RSTR|=0x00040000;  // USART3 Resetlendi
      GPIOB->AFR[1]=0x07777700;   // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
      GPIOB->MODER|=0x2AA00000;   // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)

// USART3 MODULUNU AYARLAYALIM    // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)

      RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim
      USART3->BRR=0X1112;         // 9600 Baud

      USART3->CR1|=0x0000202C;    // USART3 enable
      USART3->CR3|=0x80;          // DMA Transfer Enable (Transmit)
      NVIC->ISER[1]|=0x80;        // NVIC da USART3 interrupta izin verelim
}

// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir

int main()
{
volatile int i;

      UsartInit();
     
//    Bu programin yaptigi isi aciklayayim
//    USART a veri gelirse bu veri int rutininde aliniyor ve rama yaziliyor.
//    Alinan verilerin sayisini sayac degiskeninde gorebilirsiniz.       

//    DMA ise, Ramdan 20 adet veriyi tek tek USARTa yollluyor.
//    Bu da demektir ki 20 adet veri yollanacak ve rx tx birbirine telle bagli oldugu icin
//    20 adet veri alinacak ve sayac degiskenimiz 20 ye kadar sayacak.

//    Fakat DMA 20 gonderimde durmuyor. (Durmadigi icin DMA islemini baslatip, delay yapip ardindan ben durduruyorum)
//    DMA i durdurdugumda 80 kusur byte yollanmis oldugunu goruyorum. Durdurmasam 60 kusur bin byte yollayacak.

      RCC->AHB1ENR |= 0x00200000;        // DMA1 clock'u aktif edelim
      while(DMA1_Stream4->CR&1);         // DMA1 nin isi varsa bitmesini bekleyelim
      DMA1_Stream4->M0AR=(int)&TxBuf[0]; // Nereden okuyacagiz
      DMA1_Stream4->PAR=(int)&USART3->DR;// Nereye yazacagiz
      DMA1_Stream4->FCR&=~0xFFFFFF40;
      DMA1_Stream4->CR=(DMA1_Stream4->CR & 0xF0100000)| 0x0E000460;      // CH7 vs

      for(i=0;i<128;i++) TxBuf [ i ] =i+1;

      DMA1_Stream4->NDTR=(DMA1_Stream4->NDTR & 0xFFFF0000)|20;   // 20 adet veri tasiyacagiz

      USART3->SR&=~0x40;
      DMA1_Stream4->CR|=1;              // Transferi baslat 

//    Bundan sonraki kodlar hatayi bulmak icin yazdigim kodlar
//    20 byte transfer ardindan DMA'in durmasi lazim ancak durmuyor 

//    Asagidaki delay 82 byte transferine neden oluyor Bu da ilginc !!!

      for(i=0;i<0x1FFFFF;i++);         

//    20 byte transfer tamamlandiginda DMA islemi durdurmasi lazim fakat durmuyor
//    Biz durduralim
       
      DMA1_Stream4->CR&=~1;             // Transferi Durdur 

//    Simdi rami gozleyin ne gitmis ne gelmis vs 

      while(1);

}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Rehber Sayfa 177 de sorunumun sebebi anlatilmis.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMG81

#487
Ben STM32 Kartımı çok önceden almıştım. Fakat işten güçten anca dün adam biraz ilgilenebildim. Oturdum HD44780 chipli 2x16 Lcd için kod yazdım. Dün elimde Lcd olmadığı için deneyemedim. Aslında bu gün de deniyemiyecektim ama Tesadüfen elime bir tane geçti. Denedim Tüm Fonksiyonlar çalışmakta.

Main.c;
#include "STM32F4xx.h"
#include "Delay.c"
#include "HD44780.c"


void SystemInit(void)
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000000F;    // GPIO A,B,C,D clock'u aktif edelim
    
	GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
	GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.

    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
	GPIOB->OSPEEDR= 0x00000000;	  // AYnı şey GPIOB içinde geçerli
	GPIOC->OSPEEDR= 0xFFFFFFFF;
	GPIOD->OSPEEDR= 0xFFFFFFFF;
}


int main(void)
{
	void SystemInit();

	while(1)
	{ 
	  	
	  Lcd_init();
	  Lcd_Imlec_Yok();
	  Lcd_Yaz("    PicProje"); Lcd_Git(2,6);
	  Lcd_Yaz("Emg81");

	  Delay_ms(2000);

//    Bit Banding
		
      GPIO_D(15)=1;
	  Delay_ms(1000);
	  GPIO_D(15)=0;
	  Delay_ms(1000);
	  GPIO_D(14)=1;
	  Delay_ms(1000);
	  GPIO_D(14)=0;
	  Delay_ms(1000);

	}
}


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 Delay_ms(unsigned long Bekle)
{
	Bekle = Bekle * 21008;	// mSn ye ye çevirdik. OSC 168Mhz de uçuyor.
	while(Bekle>0){Bekle--;}
}

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

Delay.h;
extern void Delay_ms(unsigned long Bekle);
extern void Delay_us(unsigned long Bekle);

HD44780.c;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//		  LCD data Portu GPIOD
//        RS. GPIOB.4
//        E.  GPIOB.5  olarak kullanılmıştır.
//
//	      Kullanılışı;
//		  Lcd_init();         // 2x16 LCD yi kullanıma hazır hale getirir.
//		  Lcd_Veri();         // Lcd ye KOmut göndermek için kullanılır.
//		  Lcd_Git(1,2);       // Lcd nin 1. satırının 2. sütununa imleci konumlandırır.
//		  Lcd_Yaz("Merhaba"); // Lcd ye Merhaba Stringini gönderir.
//                Yaz();              // Bu kullanılmayacak.
//                Lcd_Sil();          // Lcd yi silmek için kullanılır.
//		  Lcd_Imlec_Var();	  // İmleç YanSön Moduna sokar.
//		  Lcd_Imlec_Yok();	  // İmleç i yok eder.
//
//
#include "hd44780.h"


void Lcd_init(void)
{

	GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
	GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.

    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
	GPIOB->OSPEEDR= 0x00000000;	  // AYnı şey GPIOB içinde geçerli

	GPIO_B(4)=0;	GPIO_B(5)=0;  //	 Genel
	GPIOD->ODR= 0x00000000;		  //	 Temizlik

	Delay_ms(20);

	Lcd_Veri(0x30); // Lcd Reset
	Lcd_Sil();
	Lcd_Veri(56);   // 2 satır kullanacağımızı yazdık
	Lcd_Veri(15);   // Display i aç
	Lcd_Veri(0x06); // Kursör 1 artan modda.
	Lcd_Sil();	    // Lcd yi temizle

}

void Lcd_Veri(unsigned char veri)
{
 	GPIO_B(4)=0;  Delay_ms(10);
	GPIOD->ODR = veri;
	GPIO_B(5)=1;  Delay_ms(10);  GPIO_B(5)=0;
}

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)
{
	Delay_ms(10);
	while(*lcd_data)  Yaz(*lcd_data++);
}

void Yaz(unsigned dat)
{
 	GPIO_B(4)=1;  Delay_ms(10);
	GPIOD->ODR = dat;
	GPIO_B(5)=1;  Delay_ms(10);  GPIO_B(5)=0;
}
	
void Lcd_Sil(void)
{
	Lcd_Veri(1);
	Delay_ms(10);
}

void Lcd_Imlec_Yok(void)
{
	Lcd_Veri(0x0C);
	Delay_ms(10);
}

void Lcd_Imlec_Var(void)
{
 	Lcd_Veri(0x0F);
	Delay_ms(10);
}

HD44780.h;
#define GPIO_A(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOA->ODR) << 5) + ((b) << 2)))
#define GPIO_B(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOB->ODR) << 5) + ((b) << 2)))
#define GPIO_C(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOC->ODR) << 5) + ((b) << 2)))
#define GPIO_D(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOD->ODR) << 5) + ((b) << 2)))
#define GPIO_E(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOE->ODR) << 5) + ((b) << 2)))
#define GPIO_F(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOF->ODR) << 5) + ((b) << 2)))
#define GPIO_G(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOG->ODR) << 5) + ((b) << 2)))
#define GPIO_I(b) *((volatile unsigned long *)( 0x42000000 + (((unsigned long)&GPIOI->ODR) << 5) + ((b) << 2)))

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);


Resim1;
[IMG]http://img849.imageshack.us/img849/5027/adsz1xu.jpg[/img]
Resim2;
[IMG]http://img269.imageshack.us/img269/707/adsz2vq.jpg[/img]

z

Kartlar yavaştan yavaştan alıcılarına ulaşmaya başladığına göre bundan sonraki çalışma şekli için bazı yönlendirmelerde bulunacağım.

https://www.picproje.org/index.php/topic,35896.0.html  linkinde yeterince örnek program parçacığımız birikti.

Bunları sıra ile ele almanızı istiyorum.

Bunun için rehber dokumanı açip, örnek programdaki satırları teker teker inceleyip neden bu satırda bu registere bu sayısal değer yüklenmiş sorusunun cevabını anlamanızı istiyorum.

Yaklaşık 15 adet programı satır satır anladığınızda olay bitmiştir. 15 program bittiğinde programlarınızı ister kütüphane fonksiyonları ile  ister registerler üzerinden örneklerdeki gibi yazın.  Fakat bu ilk 15 program, ARM işlemcileri anlamak adına hayati derecede önemli.

Anlamadığınız tek bir satır dahi kalmamalı ve anlamadığınız satırları muhakkak sormalısınız. Deneyimli arkadaşlar da işin içine girince sorularınız çok kısa zamanda cevaplanacaktır.

Rehber dokumani elinizden eksik etmeyin.  Unutmayın. İlmin babası sualdir fakat, Rehber dokümana bakmadan hiç kafa yormadan da sakın soru sormayın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Seckin ALAN

hocam kitim elime geçmedi fakat, bu kit ile programlayabileceğimiz MCUlar neler ? Picten kurtulmak istiyorum:)
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

MC_Skywalker

SWD çıkışından S-LINK in desteklediği tüm Cortex-M mcu ları programlaya biliyorsun.

Bende NXP LPC1768 kit var üzerine ST Cortex-M cuc ile SWD koymuşlar. bu kittekinin aynı.

EMG81

#491
Alıntı yapılan: bunalmis - 16 Aralık 2011, 18:58:27
Kartlar yavaştan yavaştan alıcılarına ulaşmaya başladığına göre bundan sonraki çalışma şekli için bazı yönlendirmelerde bulunacağım.

https://www.picproje.org/index.php/topic,35896.0.html  linkinde yeterince örnek program parçacığımız birikti.

Bunları sıra ile ele almanızı istiyorum.

Bunun için rehber dokumanı açip, örnek programdaki satırları teker teker inceleyip neden bu satırda bu registere bu sayısal değer yüklenmiş sorusunun cevabını anlamanızı istiyorum.

Yaklaşık 15 adet programı satır satır anladığınızda olay bitmiştir. 15 program bittiğinde programlarınızı ister kütüphane fonksiyonları ile  ister registerler üzerinden örneklerdeki gibi yazın.  Fakat bu ilk 15 program, ARM işlemcileri anlamak adına hayati derecede önemli.

Anlamadığınız tek bir satır dahi kalmamalı ve anlamadığınız satırları muhakkak sormalısınız. Deneyimli arkadaşlar da işin içine girince sorularınız çok kısa zamanda cevaplanacaktır.

Rehber dokumani elinizden eksik etmeyin.  Unutmayın. İlmin babası sualdir fakat, Rehber dokümana bakmadan hiç kafa yormadan da sakın soru sormayın.


Bülent abi benim verilen 15 programla herhangi bir sorunum yok. Benim daha çok C ile belli başlı sorunlarım var.
Yukarıda verdiğim kodları yazabilecek kadar C bilmekteyim. Yoksa İşlemci yapısı ve donanımlarının kullanılması hakkında pek sıkıntım yok.

Soruları nereye soracağız ? Mesela C ile ilgli şuan 50 tane soru sorabilirim.

z

Bu zamana kadar temel C ile ilgili tum sorunlarin halledilmemesinden korkuyordum. Sorulariniz icin C dilinde samatalar bolumumuz var.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMG81

Temel C ile sorunum yok İleri C ile sorunlarım var.

MC_Skywalker

web üzerinde Standar C ile ilgili biraz yazı buldum. olanları toplayıp PDF yapacağım yarın yada en geç pazar paylaşırım.