AVR Libc Home Page AVRs AVR Libc Development Pages
Main Page FAQ Library Reference Additional Documentation Example Projects

<avr/eeprom.h>: EEPROMの取り扱い


Detailed Description

 #include <avr/eeprom.h> 
このヘッダファイルはAVRのデータEEPROMを扱うための簡単なライブラリルーチンのための宣言を行うものです。単純なポーリングモードで実装されています。ウェイトループで無駄に時間を消費しない割り込み制御でEEPROMを扱う必要のあるアプリケーションには、自分でルーチンを作成する必要があります。
Note:
すべての読み書き関数を使う前に、まずEEPROMがアクセス可能状態かどうか確認する必要があります。これには長い待ち時間が必要なこともあるので、タイムクリティカルなアプリケーションでは、読み書き関数をコールする前にまず eeprom_is_ready() を使ってチェックするべきです。

このヘッダファイルはアセンブラを直接呼び出すインライン関数を使っています。これによりコンパイラはcallに伴うレジスタ退避のオーバーヘッドから逃れられます。また、これにより __tmp_reg__ レジスタ、EEPROMアドレスを指定するXレジスタ、メモリアドレスを指定するZレジスタ間のデータのやりとりがスムーズになります。これらの手続きはコードサイズを最小にするよう最適化されています。

現在のところEEPROM関連レジスタセットとしてサポートされているのは以下の2カ所です。
0x1F,0x20,0x210x1C,0x1D,0x1E
( __EEPROM_REG_LOCATIONS__ もご覧ください。).

これらの関数はIOレジスタを変更するので、リエントラント不能な関数となります。もしこれらの関数がメイン側と割り込み側双方で使われる場合は、アプリケーションは適切な保護対策を必要とします(たとえば、これらをアクセスする前に割り込みを禁止するなど).


avr-libc declarations

#define EEMEM   __attribute__((section(".eeprom")))
#define eeprom_is_ready()
#define eeprom_busy_wait()   do {} while (!eeprom_is_ready())
uint8_t eeprom_read_byte (const uint8_t *addr)
uint16_t eeprom_read_word (const uint16_t *addr)
void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
void eeprom_write_byte (uint8_t *addr, uint8_t value)
void eeprom_write_word (uint16_t *addr, uint16_t value)
void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom, size_t n)

IAR C compatibility defines

#define _EEPUT(addr, val)   eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
#define _EEGET(var, addr)   (var) = eeprom_read_byte ((uint8_t *)(addr))

Defines

#define __EEPROM_REG_LOCATIONS__   1C1D1E

Define Documentation

#define __EEPROM_REG_LOCATIONS__   1C1D1E
 

EEPROM関連IOレジスタの位置が異なった場所にあっても、各々にライブラリを用意する必要がないようにるすため、このマクロが設けるられました。デバイスIOヘッダには6桁の英大文字16進数文字列からなるマクロ __EEPROM_REG_LOCATIONS__ が定義されており、これは2桁ずつそれぞれEECR,EEDR,EEARレジスタのアドレスを保持しています。EEPROM関数は__EEPROM_REG_LOCATIONS__ を評価して動作します。
デフォルトの値は 1C1D1E で、大部分のAVRコントローラーに適合します。このシンボル値の値はアセンブラ関数のベースネームに付け加えられます。

※たとえば、mega48/88/168に対しては、 #define __EEPROM_REG_LOCATIONS__ 1F2021 が宣言されています。

#define _EEGET var,
addr   )     (var) = eeprom_read_byte ((uint8_t *)(addr))
 

EEPROMから1バイト読み込み。IAR-Cとの互換のため。

#define _EEPUT addr,
val   )     eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
 

EEPROMへ1バイト書き込み。IAR-Cとの互換のため。

#define EEMEM   __attribute__((section(".eeprom")))
 

.eeprom sectionへ割り当てるためのアトリビュート(属性)表現。

 
#define eeprom_busy_wait
 )     do {} while (!eeprom_is_ready())
 

EEPROMがbusyでなくなるまでloopして待ちます.

Returns: ありません
 
#define eeprom_is_ready
 ) 
 
Returns:
EEPROMが読み書きOKなら 1、そうでないなら 0 を返す


Function Documentation

void eeprom_read_block void *  pointer_ram,
const void *  pointer_eeprom,
size_t  n
 

EEPROMのアドレス addr から n バイトを、SRAMのbufで示されたアドレスへ読み出す。
ブロックサイズ指定が n が定数で256以下の場合はライブラリ関数が使われます。ブロックサイズ指定が変数でコンパイル時未定の場合、およびブロックサイズが256を越える場合はインラインのループが展開されます。

uint8_t eeprom_read_byte const uint8_t addr  ) 
 

EEPROMのアドレス addr から1バイトを読み出す

uint16_t eeprom_read_word const uint16_t addr  ) 
 

EEPROMのアドレス addr から2バイトを読み出す(下位バイトが先).

void eeprom_write_block const void *  pointer_ram,
void *  pointer_eeprom,
size_t  n
 

SRAMのbufで示されたアドレスから n バイトを、EEPROMのアドレス addr へ書き込む.

void eeprom_write_byte uint8_t addr,
uint8_t  value
 

1バイトの値 val をEEPROMのアドレス addr に書き込む.

void eeprom_write_word uint16_t addr,
uint16_t  value
 

2 バイトの値 val をEEPROMのアドレス addr に書き込む.


Automatically generated by Doxygen 1.4.1 on 23 Jan 2006.