Домашняя страница библиотеки_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