AVR Libc Home Page | AVR Libc Development Pages | ||||
Main Page | User Manual | Library Reference | FAQ | Alphabetical Index | Example Projects |
定義 | |
#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)されません。これらは、プログラマに任せられています。次のコード例を見てください。フラッシュを書き込む間に、グローバル割込みを許可しておくことの注意は、プロセッサのデータシートを見てください。
#include <inttypes.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> void boot_program_page (uint32_t page, uint8_t *buf) { uint16_t i; uint8_t sreg; // Disable interrupts. sreg = SREG; cli(); eeprom_busy_wait (); boot_page_erase (page); 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. boot_rww_enable (); // 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 | どのブートローダ・ロックビットを設定するべきかのマスク |
例えば、フラッシュのブートローダメモリセクションの書込みにSPM命令を許可しないためには、次のようなマクロを使用するでしょう。
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; \ }))
address
のロックかヒューズビットの読出し
address
パラメータは、GET_LOW_FUSE_BITS、GET_LOCK_BITS、GET_EXTENDED_FUSE_BITSやGET_HIGH_FUSE_BITSがありえます。
#define boot_page_erase | ( | address ) | __boot_page_erase_normal(address) |
アドレスに含まれるフラッシュページを消去
#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) |
データワードで、フラッシュアドレスのブートローダの一時ページバッファを埋めます。
#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) |
アドレスに含まれるフラッシュページのブートローダ一時ページバッファに書き込む
#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; \ }))
address
のシグネチャRowバイトを読出し。いくつかのMCUタイプに対しては、この関数は、出荷時設定された発信器校正バイトを取り出すことができる。
address
パラメータは、データシートに定義されている 0-0x1f が可能です。
#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を使い、下位ヒューズビットを読み出すためのアドレス