Как читать подпись atmega 32?
Я попытался прочитать строку подписи atmega32 с boot_signature_byte_get(0);
но я получаю эту ошибку: 'SIGRD' undeclared (first use in this function)
и кажется, что это потому, что мы можем только прочитать подпись с AVR, которые имеют бит SIGRD в SPMCR (я полагаю!).
Это правильно? и так тогда, как я могу прочитать строку подписи другим способом?
3 ответа
Еще в 2007 году в заголовке не было функции для чтения байта подписи, а затем она была представлена в том же году. Но, похоже, с этим все еще есть некоторые проблемы.
Лист данных говорит:
All Atmel microcontrollers have a three-byte signature code which identifies the device.
This code can be read in both serial and parallel mode, also when the device is locked.
The three bytes reside in a separate address space.
Это означает, что ATMEGA32 имеет доступ для чтения к этому байту. Также в техническом описании он указывает, как читать этот байт. И в большинстве их микроконтроллеров это читается таким же образом, но по какой-то причине, SIGRD
номер определения отсутствует в некоторых заголовочных файлах, включая ATMEGA32.
Но, как обходной путь, мы можем определить SIGRD
вручную. Мы просто должны знать его ценность. Когда я делаю некоторые findstr
(или же grep
) в заголовочных файлах, ищущих это определение, единогласно, его значение равно 5.
Итак, обходной путь будет:
#define SIGRD 5
#include <avr/boot.h>
Я скомпилировал это успешно, но я только что попытался протестировать программу на программном обеспечении для моделирования, так как у меня сейчас нет ATMEGA32. Он возвращает байт, так что теперь вам известно, правильный ли это байт...
Относительно того, что вы сказали в SPMCR, похоже, что строка подписи находится в другом адресном пространстве (насколько я понимаю, я не знаю, правильно ли это, я не могу подтвердить), и способ получить это, используя некоторые инструкции Точно так же, когда мы загружаем какую-то программу в MCU.
Я хотел бы немного улучшить и проиллюстрировать ответ Флавио, поскольку сегодня вечером я столкнулся с той же проблемой.
так как же я могу прочитать строку подписи другим способом?
Обходной путь Флавио делает работу хорошо:
#define SIGRD 5
#include <avr/boot.h>
void read_signature_row(uint8_t sr[3])
{
sr[0] = boot_signature_byte_get(0x0000);
sr[1] = boot_signature_byte_get(0x0002);
sr[2] = boot_signature_byte_get(0x0004);
}
void setup()
{
Serial.begin(9600);
delay(100);
uint8_t sr[3] = {0xcc, 0xcc, 0xcc};
read_signature_row(sr);
char buff[100];
snprintf(buff, sizeof buff, "Device signature: %02X %02X %02X", sr[0], sr[1], sr[2]);
Serial.println(buff);
}
void loop()
{}
У меня нет ATmega32, хотя этот метод получает правильные подписи для моих ATmega328P (1E 95 0F) и ATmega168PA (1E 94 0B).
кажется, что это потому, что мы можем только прочитать подпись с AVR, которые имеют бит SIGRD в SPMCR (я полагаю!). Это правильно?
Нет, он фактически устанавливает SIGRD на SPMCR до вызова LPM, как видно на avr/boot.h
:
#define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD))
#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; \
}))
SIGRD существует и может использоваться в процессорах ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284P. Замечание "зарезервировано для использования в будущем" применяется к инструкции SPM только для чего-либо, кроме пяти младших битов SPMCSR, см. Стр. 285, раздел 26.9.1.
Я считаю, что atmega32 не поддерживает чтение байтов подписи в пользовательской программе.
Лист данных atmega32 показывает, что это устройство не имеет бита SIGRD в своем регистре SPMCR, пятый бит этого регистра зарезервирован и помечен как доступный только для чтения.
Процессоры atmega640/1280/2560 имеют аналогичный регистр spmcSr, который имеет этот бит SIGRD (бит 5). Но таблица данных объясняет, что этот бит не должен использоваться, так как эта операция зарезервирована для будущего использования (тем не менее, там описана процедура чтения подписи).
Ваш компилятор работает правильно, так как atmega32 не имеет этого бита SIGRD.