avr-libc  2.0.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

Example Projects

マクロ
<avr/boot.h>: ブートローダサポートユーティリティ

マクロ

#define BOOTLOADER_SECTION   __attribute__ ((section (".bootloader")))
 
#define boot_spm_interrupt_enable()    (__SPM_REG |= (uint8_t)_BV(SPMIE))
 
#define boot_spm_interrupt_disable()   (__SPM_REG &= (uint8_t)~_BV(SPMIE))
 
#define boot_is_spm_interrupt()    (__SPM_REG & (uint8_t)_BV(SPMIE))
 
#define boot_rww_busy()    (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))
 
#define boot_spm_busy()    (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))
 
#define boot_spm_busy_wait()    do{}while(boot_spm_busy())
 
#define GET_LOW_FUSE_BITS   (0x0000)
 
#define GET_LOCK_BITS   (0x0001)
 
#define GET_EXTENDED_FUSE_BITS   (0x0002)
 
#define GET_HIGH_FUSE_BITS   (0x0003)
 
#define boot_lock_fuse_bits_get(address)
 
#define boot_signature_byte_get(addr)
 
#define boot_page_fill(address, data)   __boot_page_fill_normal(address, data)
 
#define boot_page_erase(address)    __boot_page_erase_normal(address)
 
#define boot_page_write(address)    __boot_page_write_normal(address)
 
#define boot_rww_enable()    __boot_rww_enable()
 
#define boot_lock_bits_set(lock_bits)   __boot_lock_bits_set(lock_bits)
 
#define boot_page_fill_safe(address, data)
 
#define boot_page_erase_safe(address)
 
#define boot_page_write_safe(address)
 
#define boot_rww_enable_safe()
 
#define boot_lock_bits_set_safe(lock_bits)
 

説明詳細

#include <avr/io.h>
#include <avr/boot.h>

C言語インタフェースで、AVRプロセッサのブートローダをサポートするための機能を提供するマクロです。これらのマクロは、フラッシュメモリのすべてのサイズで機能するようになっています。

グローバル割込みは、これらのマクロに関して自動的に抑制(disable)されません。これらは、プログラマに任せられています。次のコード例を確認してください。フラッシュを書き込む間に、グローバル割込みを許可しておくことの注意点は、プロセッサのデータシートを参照してください。

注意
すべてのAVRプロセッサーが、ブートローダーを提供しているわけではありません。ブートローダをサポートしているかは、プロセッサのデータシートを見てください。
Todo:
Marekのemailから: 小さなデバイス(ATmega64/128を除くすべて)では、__SPM_REGはI/O空間にあり、短い「in」や「out」命令でアクセスできます。ブートローダーのサイズは限られているため、重要な最適化になります。
API使用例
つぎのコードは、ブートAPIの典型的な使用方法です。
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
void boot_program_page (uint32_t page, uint8_t *buf)
{
uint8_t sreg;
// Disable interrupts.
sreg = SREG;
cli();
boot_spm_busy_wait (); // Wait until the memory is erased.
for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.
uint16_t w = *buf++;
w += (*buf++) << 8;
boot_page_fill (page + i, w);
}
boot_page_write (page); // Store buffer in flash page.
boot_spm_busy_wait(); // Wait until the memory is written.
// Reenable RWW-section again. We need this if we want to jump back
// to the application after bootloading.
// Re-enable interrupts (if they were ever enabled).
SREG = sreg;
}

マクロ定義説明

#define boot_is_spm_interrupt ( )    (__SPM_REG & (uint8_t)_BV(SPMIE))

SPM割込みが許可されているか確認

#define boot_lock_bits_set (   lock_bits)    __boot_lock_bits_set(lock_bits)

ブートローダ・ロックビットを設定

引数
lock_bitsどのブートローダ・ロックビットを設定するべきかのマスク
注意
ここでは、'設定されたビット'は、ゼロ値が書き込まれます。また、BLBxxビットのみが、この命令でプログラムされる点に注意してください。

例えば、フラッシュのブートローダメモリセクションの書込みにSPM命令を許可しないためには、次のようにマクロを使用してください。

1 boot_lock_bits_set (_BV (BLB11));
注意
ブートローダーロックビットやいくつかのロックビットは、一度設定されると、ブートローダ自体が消去されるチップ消去をしない限り、ブートローダーロックビットは再びクリアされません。
#define boot_lock_bits_set_safe (   lock_bits)
値:
do { \
boot_spm_busy_wait(); \
eeprom_busy_wait(); \
boot_lock_bits_set (lock_bits); \
} while (0)

ロックビットを設定する前にEEPROMとSPM演算が完了するのを待つ以外は、boot_lock_bits_set()と同じです。

#define boot_lock_fuse_bits_get (   address)
値:
(__extension__({ \
uint8_t __result; \
__asm__ __volatile__ \
( \
"sts %1, %2\n\t" \
"lpm %0, Z\n\t" \
: "=r" (__result) \
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
"r" ((uint8_t)(__BOOT_LOCK_BITS_SET)), \
"z" ((uint16_t)(address)) \
); \
__result; \
}))
unsigned char uint8_t
Definition: stdint.h:83
unsigned int uint16_t
Definition: stdint.h:93

addressからロックまたはヒューズビットの読出し

address パラメータは、GET_LOW_FUSE_BITS、GET_LOCK_BITS、GET_EXTENDED_FUSE_BITSやGET_HIGH_FUSE_BITSが指定できます。

注意
ロックやヒューズビットの返値は、物理値です。すなわち、0を返すビットは、対応するヒューズやロックビットがプログラムされていることを意味しています。
#define boot_page_erase (   address)    __boot_page_erase_normal(address)

アドレスに含まれるフラッシュページを消去

注意
アドレスは、フラッシュ内では1バイトアドレスであり、ワードアドレスではありません。
#define boot_page_erase_safe (   address)
値:
do { \
boot_spm_busy_wait(); \
eeprom_busy_wait(); \
boot_page_erase (address); \
} while (0)

ページを消去する前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_erase() と同じです。

#define boot_page_fill (   address,
  data 
)    __boot_page_fill_normal(address, data)

データワードで、フラッシュアドレスのブートローダの一時ページバッファを埋めます。

注意
アドレスは、1バイトのアドレスです。データは、ワード(2バイト)です。AVRは、バッファへのデータ書込みは、一度にワードです。しかし、バッファのアドレスはバイト単位です!そして、アドレスは呼び出すごとに2倍し、ワードフォーマットの2データバイトを送ってください!データのLSBは、下のアドレスに書かれ、データのMSBは上のアドレスに書き込まれます。
#define boot_page_fill_safe (   address,
  data 
)
値:
do { \
boot_spm_busy_wait(); \
eeprom_busy_wait(); \
boot_page_fill(address, data); \
} while (0)

ページを埋める前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_fill()と同じです。

#define boot_page_write (   address)    __boot_page_write_normal(address)

アドレスに含まれるフラッシュページのブートローダ一時ページバッファに書き込む

注意
アドレスは、フラッシュ内では1バイトアドレスであり、ワードアドレスではありません。
#define boot_page_write_safe (   address)
値:
do { \
boot_spm_busy_wait(); \
eeprom_busy_wait(); \
boot_page_write (address); \
} while (0)

ページを書き込む前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_write()と同じです。

#define boot_rww_busy ( )    (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))

RWWセクションがビジーかチェック

#define boot_rww_enable ( )    __boot_rww_enable()

Read-While-Writeメモリセクションを許可する

#define boot_rww_enable_safe ( )
値:
do { \
boot_spm_busy_wait(); \
eeprom_busy_wait(); \
boot_rww_enable(); \
} while (0)

RWWメモリを許可される前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_rww_enable()と同じです。

#define boot_signature_byte_get (   addr)
値:
(__extension__({ \
uint8_t __result; \
__asm__ __volatile__ \
( \
"sts %1, %2\n\t" \
"lpm %0, Z" "\n\t" \
: "=r" (__result) \
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
"r" ((uint8_t)(__BOOT_SIGROW_READ)), \
"z" ((uint16_t)(addr)) \
); \
__result; \
}))
unsigned char uint8_t
Definition: stdint.h:83
unsigned int uint16_t
Definition: stdint.h:93

addressのシグネチャRowバイトの読出し。いくつかのMCUでは、この関数で工場出荷時に設定された発信器校正データを取り出すことができます。

addressパラメータは、データシートに定義されている 0~0x1f が可能です。

注意
この値は、MCUの種類に依存します。
#define boot_spm_busy ( )    (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))

SPM命令がビジーかチェック

#define boot_spm_busy_wait ( )    do{}while(boot_spm_busy())

SPM命令ビジー中停止する

#define boot_spm_interrupt_disable ( )    (__SPM_REG &= (uint8_t)~_BV(SPMIE))

SPM割込み不許可にする

#define boot_spm_interrupt_enable ( )    (__SPM_REG |= (uint8_t)_BV(SPMIE))

SPM割込みを許可する

#define BOOTLOADER_SECTION   __attribute__ ((section (".bootloader")))

.bootloaderの新しいセクション内に、関数または変数を宣言するのに用います。このセクションとその内容は、リンク時において別のアドレス(例えばブートローダNRWWエリア)に再配置することができます。

#define GET_EXTENDED_FUSE_BITS   (0x0002)

boot_lock_fuse_bits_getにより、拡張ヒューズビットを読み出すためのアドレス

#define GET_HIGH_FUSE_BITS   (0x0003)

boot_lock_fuse_bits_getにより、上位ヒューズビットを読み出すためのアドレス

#define GET_LOCK_BITS   (0x0001)

boot_lock_fuse_bits_getにより、ロックビットを読み出すためのアドレス

#define GET_LOW_FUSE_BITS   (0x0000)

boot_lock_fuse_bits_getにより、下位ヒューズビットを読み出すためのアドレス