TEKNİK YAZI

Tiva Not-7 : EEPROM (e2prom) Yapısı , Okuma ve Yazma İşlemi

Tivaware EEPROM Api’si mikrodenetleyici üzerinde bulunan EEPROM ile basitçe etkileşim sağlayan bir yapıya sahiptir. Bu Api 3 işlevi sağlamaktadır.

  1. Okuma ve Yazma İşlemi
  2. Koruma
  3. Kesme Kontrolü

Tiva EEPROM Modülü word-by-word ( Tek yazmada 32 bit ) olarak programlanabiliyor. En güzel yanı da flash yapısından farklı olarak yazmadan önce silme gerektirmiyor.

Tiva EEPROM denetleyicisi mesela korumalı bölgelere erişim sağlamak istendiğinde kesme üreterek sizi uyarabiliyor. Bu bahsettiğim koruma hakkında daha sonradan bir yazı yazacağım. Yukarıda bahsettiğimiz gibi okuma,yazma gibi işlemlerin sonucu olarak ta kesme üretilebiliyor. Bu kesmeler sayesinde komutun başarılı olarak çalışıp çalışmadığından emin olabiliyoruz.

Tiva mikrodenetleyicilerinde EEPROM modülünün büyüklüğü mikrodenetleyici modelleri arasında farklılık gösterebilir. Bunun için Tivaware Api’sinde  EEPROMSizeGet() ve EEPROMBlockCountGet()  adında fonksiyonlar bulunmaktadır. Şimdi örneğimize geçelim.

  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include "inc/hw_memmap.h"
  4. #include "inc/hw_types.h"
  5. #include "inc/hw_gpio.h"
  6. #include "inc/hw_ints.h"
  7. #include "driverlib/gpio.h"
  8. #include "driverlib/pin_map.h"
  9. #include "driverlib/sysctl.h"
  10. #include "driverlib/interrupt.h"
  11. #include "driverlib/eeprom.h"
  12. #include "utils/uartstdio.h"
  13.  
  14.  
  15. #define E2PROM_TEST_ADRES 0x0000 // EEPROM'un hangi adresinden itibaren işlem yapacağımızı belirttiğimiz direktif
  16.  
  17. /* Kendi oluşturduğumuz bir yapıyı direkt olarak EEPROM bölgesine yazabilir ve
  18. oradan direkt olarak aynı yapı içerisine okuyabiliriz.
  19. Sizde kendinize özgü bir yapı kurabilirsiniz. */
  20.  
  21. struct E2PROM
  22. {
  23. uint8_t degisken1;
  24. uint8_t degisken2;
  25. uint16_t degisken3;
  26. uint8_t degisken4[12];
  27. };
  28.  
  29.  
  30.  
  31. struct E2PROM e2prom_dolu_yapi = {5,7,9826, "MerhabaDunya"}; /* Yazacağımız yapi */
  32. struct E2PROM e2prom_bos_yapi = {0,0,0,""}; /* İçini dolduracağımız boş yapı */
  33.  
  34.  
  35. int main(void)
  36. {
  37. uint32_t e2size,e2block;
  38.  
  39. SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); // islemcimizi 80 Mhz'e ayarlıyoruz.
  40.  
  41. /* UART AYARLARINI YAPIYORUZ */
  42. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  43. GPIOPinConfigure(GPIO_PA0_U0RX);
  44. GPIOPinConfigure(GPIO_PA1_U0TX);
  45. GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
  46. UARTStdioConfig(GPIO_PORTA_BASE,115200,SysCtlClockGet());
  47. /*******************************/
  48.  
  49. /* EEPROM AYARLARINI YAPIYORUZ */
  50. SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0); // EEPROM modülü aktifleştiriyoruz.
  51. EEPROMInit(); // EEPROM Modülünü çalışır hale getiriyoruz.
  52. /*******************************/
  53.  
  54. UARTprintf("EEPROM Test Programı ,, Teknikyazi.com\r\n");
  55.  
  56.  
  57. e2size = EEPROMSizeGet(); // EEPROM Modülünün büyüklüğünü alıyoruz. EEPROMSizeGet fonksiyonu uint32_t değer dönmektedir.
  58. UARTprintf("EEPROM buyuklugu %d bytes\n", e2size);
  59.  
  60. e2block = EEPROMBlockCountGet(); // EEPROM Modülünde bulunan blok sayısını alıyoruz. EEPROMBlockCountGet fonksiyonu uint32_t değer dönmektedir.
  61. UARTprintf("EEPROM Blok sayisi: %d\n", e2block);
  62.  
  63. UARTprintf("Yazma Denemesi > Adres %u: Yapi : {%u,%u,%u,%s}\n", E2PROM_TEST_ADRES, e2prom_dolu_yapi.degisken1, e2prom_dolu_yapi.degisken2, e2prom_dolu_yapi.degisken3, e2prom_dolu_yapi.degisken4);
  64. EEPROMProgram((uint32_t *)&e2prom_dolu_yapi, E2PROM_TEST_ADRES, sizeof(e2prom_dolu_yapi)); //e2prom_dolu_yapi yapısı içerisindeki dataları EEPROM'un 0x0000 adresinden itibaren yazıyoruz.
  65.  
  66. EEPROMRead((uint32_t *)&e2prom_bos_yapi, E2PROM_TEST_ADRES, sizeof(e2prom_bos_yapi)); //EEPROM'un 0x0000 adresinden itibaren bulunan dataları e2prom_bos_yapi yapısına okuyoruz.
  67. UARTprintf("Okuma Denemesi > Adres %u: Yapi : {%u,%u,%u,%s}\n", E2PROM_TEST_ADRES, e2prom_bos_yapi.degisken1, e2prom_bos_yapi.degisken2, e2prom_bos_yapi.degisken3, e2prom_bos_yapi.degisken4);
  68.  
  69. while(1)
  70. {
  71. }
  72.  
  73. }