atmega32 の署名行を読み取ろうとしましboot_signature_byte_get(0);
たが、このエラーが発生しました: 'SIGRD' undeclared (first use in this function)
SPMCR に SIGRD ビットを持つ AVR でしか署名を読み取ることができないためです (私は推測します!)。
これは正しいですか?それでは、どうすれば署名行を別の方法で読むことができますか?
4 に答える
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 がこのバイトに読み取りアクセスできることを意味します。また、データシートでは、このバイトの読み取り方法を指定しています。また、ほとんどの MCU では同じ方法で読み取られますが、何らかの理由で、SIGRD
ATMEGA32 を含む一部のヘッダー ファイルで定義番号が欠落しています。
ただし、回避策として、手動で定義できますSIGRD
。その価値を知る必要があります。この定義をヘッダー ファイルで検索すると、満場一致で値が 5 になりますfindstr
。grep
したがって、回避策は次のようになります。
#define SIGRD 5
#include <avr/boot.h>
これを正常にコンパイルしましたが、現在 ATMEGA32 を持っていないため、シミュレーション ソフトウェアでプログラムをテストしようとしました。バイトを返すので、これが正しいバイトかどうかはあなた次第です...
おっしゃったSPMCRの件ですが、署名行が別のアドレス空間にあるようで(私の理解では、これが正しいかどうかはわかりません確認できません)、それを取得する方法は、いくつかの命令を使用しています、同様に、プログラムを MCU にアップロードするときも同様です。
atmega32 は、ユーザー プログラム内の署名バイトの読み取りをサポートしていないと思います。
atmega32データシートは、このデバイスのレジスタ SPMCR に SIGRD と呼ばれるビットがなく、このレジスタの 5 番目のビットが予約されており、読み取り専用としてマークされていることを明らかにしています。
atmega640 /1280/2560プロセッサには、このビット SIGRD (ビット 5)を持つspmcSrと呼ばれる同様のレジスタがあります。ただし、データシートには、この操作は将来の使用のために予約されているため、このビットを使用すべきではないと説明されています (それでも、署名を読み取る手順はそこで説明されています)。
atmega32 にはこの SIGRD ビットがないため、コンパイラは正しく動作します。