ATmega AVR 用にカスタマイズされたブートローダーを作成しようとしています。コードを書くと、ATmega32A や ATmega8A のような小さな AVR で完璧に動作します。しかし、ATmega128A で使用したい場合、フラッシュ セグメントには何も書き込まれません。ヒューズは正しく、ATmega103 モードは無効で、プログラムはブート セクションで開始しますが、何もしません。関数「boot_program_page」を呼び出す前に、PORTC を設定していくつかの LED をオンにし、その後、PORTC と LED をクリアしました。消灯。そのため、コードも完全に実行されます。私が使用している関数は、avr/boot.h で提供されている例です。フラッシュメモリのページ0にデータ(実際には0x00)を書き込む必要があります..ここに私のコードがあります:
#define F_CPU 8000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/boot.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
void boot_program_page (uint32_t page, uint8_t *buf);
int main(void)
{
uint8_t data[SPM_PAGESIZE] = {0};
uint32_t page = 0;
DDRC = 255;
PORTC = 255;
page *= (uint32_t)SPM_PAGESIZE;
boot_program_page(page,data);
_delay_ms(1000);
PORTC = 0;
while (1)
{
}
}
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;
}