#include <avr/io.h>
#include <avr/boot.h>
Макроопределения в этом модуле обеспечивают язык C связью с загрузчиком. Макроопределения разработаны для работы со всеми размерами флэш-памяти.
Глобальные прерывания для этих макроопределений автоматически не блокируются. Это оставлено для программиста. См. пример кода ниже. Также см. datasheet процессора для протестов при предоставлении глобальных прерываний в течение записи Flash.
Примечание:
Не все процессоры AVR обеспечивают поддержку загрузчика. См. datasheet процессора, чтобы видеть, обеспечивает ли он поддержку загрузчика.
От электронной почты с Marek: На меньших устройствах (все кроме ATmega64/128), __SPM_REG находится в пространстве ввода - вывода, доступный с короче "в" и команды - начиная с загрузчика имеют ограниченный размер, это могло быть важной оптимизацией.
Пример Использования API
Следующий код показывает типовое использование начальной загрузки API.
#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 |
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(SPMEN)) |
#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 |
|
#define |
boot_lock_bits_set_safe(lock_bits) |
( |
|
) |
(__SPM_REG
& (uint8_t)_BV(SPMIE)) |
Проверяет
- допускается
ли
прерывание SPM.
Устанавивает биты блокировки загрузчика.
Параметры:
|
lock_bits |
Маска которая устанавливает Биты Блокировки Загрузчика (BLBxx). |
Примечание:
В этом контексте, 'бит набора' будет установлен в нуль. Также обратите внимание, что только BLBxx биты могут быть запрограммированы этой командой.
Например, отвергать SPM команда от записи до раздела памяти Загрузчика flash, вы использовали бы эту макрокоманду также:
boot_lock_bits_set (_BV (BLB11));
Примечание:
Подобно
любым битам
блокировки,
Биты Блокировки
Загрузчика,
когда-то
набор, не
могут быть
очищены снова
кроме
стиранием
чипа, которое
в свою очередь
также сотрет
загрузчик
непосредственно.
Значение:
То
же самое boot_lock_bits_set()
кроме ждет eeprom и
spm операций,
чтобы
завершить
перед
установкой
битов
блокировки.
Значение:
(__extension__({ \
uint8_t __result; \
__asm__ __volatile__ \
( \
"ldi r30, %3\n\t" \
"ldi r31, 0\n\t" \
"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), \
"M" (address) \
: "r0", "r30", "r31" \
); \
__result; \
}))
Читает
блокировку
или fuse биты
в address
.
Параметр address
может быть любой из GET_LOW_FUSE_BITS, GET_LOCK_BITS,
GET_EXTENDED_FUSE_BITS, или GET_HIGH_FUSE_BITS.
Примечание:
Блокировка
и
возвращенные
биты fuse
- физические
значения, то
есть немного
возвращенные
как 0 средств
соответствующий
fuse
или
блокируют
бит,
запрограммирован.
Стирает страницу flash которая содержит address.
Примечание:
address является байтом address во flash, не
слово address.
Значение:
То
же самое boot_page_erase()
кроме этого
ждет eeprom
и spm операций,
чтобы
завершить
перед
стиранием
страницы.
Заполните bootloader временный буфер страницы для адреса flash с информационным словом.
Примечание:
The address is a byte address. The
data is a word. The AVR writes data to the buffer a word at a time, but
addresses the buffer per byte! So, increment your address by 2 between calls,
and send 2 data bytes in a word format! The LSB of the data is written to the
lower address; the MSB of the data is written to the higher address.
Значение:
То
же самое boot_page_fill()
кроме этого
ждет eeprom
и spm операций,
чтобы
завершить
перед
заполнением
страницы.
Записывает загрузчик временный буфер страницы к странице flash это содержит адрес.
Примечание:
адрес
- адрес байта
во flash,
не адрес
слова.
Значение:
То же самое boot_page_write() except it waits for eeprom and spm operations to complete before
writing the page.
( |
|
) |
(__SPM_REG
& (uint8_t)_BV(__COMMON_ASB)) |
Проверяет,
занят ли
раздел RWW.
Допускает
раздел
памяти Read-While-Write (читение
во время
записи).
Значение:
То же самое boot_rww_enable() except waits for eeprom and spm operations to complete before
enabling the RWW mameory.
Значение:
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
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" (__addr16) \
); \
__result; \
}))
Read the Signature Row byte at address
. For some MCU types, this function
can also retrieve the factory-stored oscillator calibration bytes.
Parameter address
can be 0-0x1f as documented by the
datasheet.
Примечание:
The values are MCU type dependent.
( |
|
) |
(__SPM_REG
& (uint8_t)_BV(SPMEN)) |
Проверяет,
занята ли
команда SPM.
( |
|
) |
(__SPM_REG
&= (uint8_t)~_BV(SPMIE)) |
Отключает
прерывание SPM.
( |
|
) |
(__SPM_REG
|= (uint8_t)_BV(SPMIE)) |
Допускает
прерывания SPM.
Used to declare a function or
variable to be placed into a new section called .bootloader. This section and
its contents can then be relocated to any address (such as the bootloader NRWW
area) at link-time.
address to read the extended fuse
bits, using boot_lock_fuse_bits_get
address to read the high fuse bits,
using boot_lock_fuse_bits_get
Automatically generated by Doxygen
1.5.2 on 21 Dec 2007.