MikroC ile STM32F103C8'de FLASH Bellek'e kayıt yapma

Başlatan mg1980, 20 Aralık 2016, 15:31:02

mg1980

Sayın Hocalarım,
Bir konuda yardımınıza ihtiyacım var. Meşhur MikroC ARM kitabından Discovery örneklerini STM32F103C'ye adapte etmeye çalışıyorum. Çözemediğim konuları programı bölümler halinde çalıştırarak çözümlüyorum. FLASH Bellek'e yazıp okuma konusunda takıldım. Kısa programımda bir sayaç çalışıyor. Sayacın sayımını LCD ekranda görüyorum. Sayaç değerleri 25 ve 35 olduğunda FLASH Bellek'e kaydediyorum. Kaydın yapıldığını yükleyiciye kodları okutarak ilgili adreste görüyorum.
Ama gelin görün ki elektrik kesilme senaryosunda; READ komutu olmadığı için pointer değişkeni başka bir değişkene eşitleyerek (kitapta anlatıldığı gibi) okuma yaptığında pointer değişkenin adresi DECİMAL olarak LCD ekranda görülüyor. Ne yaptıysam bellekte kaydını gördüğüm sayaç değerlerini okutamadım. Bilgisi olan arkadaşların ilgisini bekliyorum. Kod ve program dosyası aşağıdadır. Şimdiden teşekkür ediyorum.

https://drive.google.com/open?id=0B1XWQs68BUsoU01SWHF6cUEtb0U

  //STM32F103C8.....8MHz.KRİSTAL





  //LCD bağlantıları tanımlanıyor.

sbit LCD_RS at GPIOA_ODR.B0;
sbit LCD_EN at GPIOA_ODR.B1;
sbit LCD_D4 at GPIOA_ODR.B2;
sbit LCD_D5 at GPIOA_ODR.B3;
sbit LCD_D6 at GPIOA_ODR.B4;
sbit LCD_D7 at GPIOA_ODR.B5;

unsigned long hafiza5=0x08001400;
unsigned long *g=&hafiza5;
unsigned long hafiza6=0x08001800;
unsigned long *h=&hafiza6;


unsigned long  saklananSayi=0;
char txt[12];
char txtt[12];

char sayac=0;


void sayma()   //*************************************************
{
 sayac=sayac+1;
 Delay_ms(1000);

 Lcd_Out(1,1,"SAYAC:");
 ByteToStr(sayac,txtt);
 Lcd_Out_CP(txtt);

}


void yazma( )  //*********************************************
{
 if(sayac==25)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(*g);

  Delay_ms(10);
  FLASH_Write_HalfWord(*g,saklananSayi);

 }

 if(sayac==35)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(*h);
  Delay_ms(10);
  FLASH_Write_HalfWord(*h,saklananSayi);

 }
}

void main()       //****************************************************
{

 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,6,"BELLEK");
 Delay_ms(3000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(1,1,"B:");

 
 saklananSayi=*g;
 Delay_ms(100);
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(2,1,"B:");

 saklananSayi=*h;
 Delay_ms(100);
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

  do
  {
   sayma();
   yazma();
  }while(1);
}

LukeSkywalker

Buradaki sorunuzdan pointerın ne olduğunu ve nasıl kullanıldığını bilmediğiniz kanısına vardım. C'de pointer kullanımına çalışmanızı tavsiye ederim.

Daha sonra sayma ve yazma işlemleriniz bittikten sonra lcd de görüntüleme işlemi yapmanız gerektiğini de belirtmem gerek.






mg1980

#2
Hocam siz programa iyi baktıysanız o görüntülemelerin yapıldığını görebilirsiniz. Program çalışıyor. g ve h pointerlere yüklenen adreslere yazma yapılıyor.Elektrik kesilince o adreslerde bu değerleri görüyorum. Üstelik sizin kitabınızdaki formatı defalarca uyguladım ve olmayınca sadeleştirdim.Her şeyi tam anlamıyla bildiğimi söyleyemem ama CCS C- Serdar ÇİÇEK, Arduino- Fahrettin ERDİNÇ, Her Yönüyle C-Tevfik KIZILÖREN,C-Kaan ARSLAN  ve sizin kitabınız  yeterli midir? READ komutu ihtiyacını nasıl gidereceğiz ? Kitabınızdaki çözüm olmuyor.Benim amacım bu işlemleri LCD'de göstermek değil. Daha geniş başka bir programdaki bu kayıt ihtiyacı giderilemeyince basit bir programda bu işlemi çözmek idi. Program amacıma hizmet için yeterlidir. main içindeki okuma konusunda tecrübelerinizden yararlanmak isterim.Saygılar.

LukeSkywalker

LCD de görüntüleme işlemi tam olarak nerede yapılıyor?

mg1980

main içinde  B:           (1,1 de),
                  B:            (2,1 de).....Elk.kesilip geldiğinde program ilk çalışırken. Ayrıca sayaç her 1 sn.de (yaklaşık) döngüde.

LukeSkywalker

#5
-

LukeSkywalker

#6
-

LukeSkywalker

Hocam benim de kafamı karıştuırdınız vallahi :)
İşin doğrusu şöyle olacak;

           //STM32F103C8.....8MHz.KRİSTAL





  //LCD bağlantıları tanımlanıyor.

sbit LCD_RS at GPIOA_ODR.B0;
sbit LCD_EN at GPIOA_ODR.B1;
sbit LCD_D4 at GPIOA_ODR.B2;
sbit LCD_D5 at GPIOA_ODR.B3;
sbit LCD_D6 at GPIOA_ODR.B4;
sbit LCD_D7 at GPIOA_ODR.B5;

unsigned long hafiza5=0x08001400;
unsigned long *g;
unsigned long hafiza6=0x08001800;
unsigned long *h;


unsigned long  saklananSayi=0;
char txt[12];
char txtt[12];

char sayac=0;


void sayma()   //*************************************************
{
 sayac=sayac+1;
 Delay_ms(1000);
 GPIOC_ODR.b13=~GPIOC_ODR.B13;

 Lcd_Out(1,1,"SAYAC:");
 ByteToStr(sayac,txtt);
 Lcd_Out_CP(txtt);

}


void yazma( )  //*********************************************
{
 if(sayac==25)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(hafiza5);

  Delay_ms(10);
  FLASH_Write_HalfWord(hafiza5,saklananSayi);

 }

 if(sayac==35)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(hafiza6);
  Delay_ms(10);
  FLASH_Write_HalfWord(hafiza6,saklananSayi);

 }
}

void main()       //****************************************************
{
 g= (unsigned long*)hafiza5;
 h=(unsigned long*)hafiza6;
 GPIO_Digital_Output(&GPIOC_BASE,_GPIO_PINMASK_13);
 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,6,"BELLEK");
 Delay_ms(3000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(1,1,"B:");

 

 Delay_ms(100);
 saklananSayi=*g;
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(2,1,"B:");


 Delay_ms(100);
 saklananSayi=*h;
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

  do
  {
    sayma();
    yazma();
  }while(1);
}


Pointer konusuna çalışın...

mg1980

Hocam,
Kitabınızdaki formatta hata yaptım galiba.Sizin cevabınızı okuyana kadar çözüldü.Düzenleyip kodu birazdan koyacağım.

LukeSkywalker


mg1980

#10
Hocam teşekkür ediyorum.Hakkınızı helal edin.Bir hafta sonra nihayet oldu.Sizin kitabınıza uygun olarak. Kod aşağıda.Bu arada bir sorum var. Bu hafıza adreslerinin boyutu çok büyük. Ara adreslere (sektör?) nasıl ulaşırız? Gönderdiğinizi de inceleyeceğim.İnceledim özünde aynı.Çok sağolun.
//STM32F103C8.....8MHz.KRİSTAL





  //LCD bağlantıları tanımlanıyor.

sbit LCD_RS at GPIOA_ODR.B0;
sbit LCD_EN at GPIOA_ODR.B1;
sbit LCD_D4 at GPIOA_ODR.B2;
sbit LCD_D5 at GPIOA_ODR.B3;
sbit LCD_D6 at GPIOA_ODR.B4;
sbit LCD_D7 at GPIOA_ODR.B5;

unsigned long hafiza5=0x08001400;
unsigned long* g;

unsigned long hafiza6=0x08001800;
unsigned long* h;

unsigned long  saklananSayi=0;
char txt[12];
char txtt[12];

unsigned int sayac=0;


void sayma()   //*************************************************
{
 sayac=sayac+1;
 Delay_ms(500);

 Lcd_Out(1,1,"SAYAC:");
 IntToStr(sayac,txtt);
 Lcd_Out_CP(txtt);

}


void yazma( )  //*********************************************
{
 if(sayac==25)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(hafiza5);
  Flash_Write_Word(hafiza5,saklananSayi);
 }

 if(sayac==35)
 {
  saklananSayi=sayac;
  FLASH_ErasePage(hafiza6);
  FLASH_Write_Word(hafiza6,saklananSayi);

 }
}

void main()       //****************************************************
{

 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,6,"BELLEK");
 Delay_ms(3000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(1,1,"B:");

 g=(unsigned long*)hafiza5;
 saklananSayi=*g;
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

 Lcd_Out(2,1,"B:");
 
 h=(unsigned long*)hafiza6;
 saklananSayi=*h;
 LongWordToStr(saklananSayi,txt);
 Lcd_Out_CP(txt);
 Delay_ms(4000);
 Lcd_Cmd(_LCD_CLEAR);

  do
  {
   sayma();
   yazma();
  }while(1);
}