Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты


<avr/boot.h>: Утилиты Поддержки загрузчика


Детальное Описание

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

Макроопределения в этом модуле обеспечивают язык C связью с загрузчиком. Макроопределения разработаны для работы со всеми размерами флэш-памяти.

Глобальные прерывания для этих макроопределений автоматически не блокируются. Это оставлено для программиста. См. пример кода ниже. Также см. datasheet процессора для протестов при предоставлении глобальных прерываний в течение записи Flash.

Примечание:

Не все процессоры AVR обеспечивают поддержку загрузчика. См. datasheet процессора, чтобы видеть, обеспечивает ли он поддержку загрузчика.

Todo:

От электронной почты с 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 

boot_rww_enable_safe()

#define 

boot_lock_bits_set_safe(lock_bits)


Документация макроопределений

#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).

Примечание:

В этом контексте, 'бит набора' будет установлен в нуль. Также обратите внимание, что только BLBxx биты могут быть запрограммированы этой командой.

Например, отвергать SPM команда от записи до раздела памяти Загрузчика flash, вы использовали бы эту макрокоманду также:

 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)

То же самое boot_lock_bits_set() кроме ждет eeprom и spm операций, чтобы завершить перед установкой битов блокировки.

#define boot_lock_fuse_bits_get

(

address 

 

 ) 

 

Значение:

(__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 или блокируют бит, запрограммирован.

#define boot_page_erase

(

address 

 

 ) 

   __boot_page_erase_normal(address)

Стирает страницу flash которая содержит address.

Примечание:

address является байтом address во flash, не слово address.

#define boot_page_erase_safe

(

address 

 

 ) 

 

Значение:

do { \
 boot_spm_busy_wait(); \
 eeprom_busy_wait(); \
 boot_page_erase (address); \
} while (0)

То же самое boot_page_erase() кроме этого ждет eeprom и spm операций, чтобы завершить перед стиранием страницы.

#define boot_page_fill

(

address,

 

 

 

data 

 

 ) 

   __boot_page_fill_normal(address, data)

Заполните 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.

#define boot_page_fill_safe

(

address,

 

 

 

data 

 

 ) 

 

Значение:

do { \
 boot_spm_busy_wait(); \
 eeprom_busy_wait(); \
 boot_page_fill(address, data); \
} while (0)

То же самое boot_page_fill() кроме этого ждет eeprom и spm операций, чтобы завершить перед заполнением страницы.

#define boot_page_write

(

address 

 

 ) 

   __boot_page_write_normal(address)

Записывает загрузчик временный буфер страницы к странице flash это содержит адрес.

Примечание:

адрес - адрес байта во flash, не адрес слова.

#define boot_page_write_safe

(

address 

 

 ) 

 

Значение:

do { \
 boot_spm_busy_wait(); \
 eeprom_busy_wait(); \
 boot_page_write (address); \
} while (0)

То же самое boot_page_write() except it waits for eeprom and spm operations to complete before writing the page.

#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)

То же самое boot_rww_enable() except waits for eeprom and spm operations to complete before enabling the RWW mameory.

#define boot_signature_byte_get

(

addr 

 

 ) 

 

Значение:

(__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.

#define boot_spm_busy

 

 ) 

   (__SPM_REG & (uint8_t)_BV(SPMEN))

Проверяет, занята ли команда 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")))

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.

#define GET_EXTENDED_FUSE_BITS   (0x0002)

address to read the extended fuse bits, using boot_lock_fuse_bits_get

#define GET_HIGH_FUSE_BITS   (0x0003)

address to read the high fuse bits, using boot_lock_fuse_bits_get

#define GET_LOCK_BITS   (0x0001)

address to read the lock bits, using boot_lock_fuse_bits_get

#define GET_LOW_FUSE_BITS   (0x0000)

address to read the low fuse bits, using boot_lock_fuse_bits_get


Automatically generated by Doxygen 1.5.2 on 21 Dec 2007.

Hosted by uCoz