Вот рабочие исходники для CvAVR:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сидоргек 13 февраля 2004 г. 10:39
В ответ на: Кто делал bootloader для MEGA? отправлено sda 13 февраля 2004 г. 10:00

//--------------------------------------------------------------------------------------
// Функции для работы с FLASH

#include "monitor.h"

#if (defined _CHIP_ATMEGA128L_) || (defined _CHIP_ATMEGA128_)
#asm
.equ SPMCSR = 0x68
.equ SPMREG = SPMCSR
#endasm
#elif (defined _CHIP_ATMEGA8_) || (defined _CHIP_ATMEGA8L_)
#asm
.equ SPMCR = 0x37
.equ SPMREG = SPMCR
#endasm
#else
#error Поддержка для этого процессора еще не написана
#endif

#asm
.equ SPMEN = 0 ; Биты регистра
.equ PGERS = 1
.equ PGWRT = 2
.equ BLBSET = 3
.equ RWWSRE = 4
.equ RWWSB = 6
.equ SPMIE = 7

;--------------------------------------------------
; Ожидание завершения SPM. Портит R23
spmWait:
#endasm
#ifdef USE_MEM_SPM
#asm
lds r23, SPMREG
#endasm
#else
#asm
in r23, SPMREG
#endasm
#endif
#asm
andi r23, (1 << SPMEN)
brne spmWait
ret

;--------------------------------------------------
; Запуск SPM.
spmSPM:
in r24, SREG ; Сохраняю состояние
cli ; Запрещаю прерывания
#endasm
#ifdef USE_RAMPZ
#asm
in r25, RAMPZ ; Сохраняю RAMPZ
#endasm
#endif
#asm
ld r30, y ; Адрес
ldd r31, y+1
#endasm
#ifdef USE_RAMPZ
#asm
ldd r26, y+2 ; 3-й байт адреса - в RAMPZ
out RAMPZ, r26
#endasm
#endif
#asm
call spmWait ; Жду завершения предидущей операции (на всякий случай)
#endasm
#ifdef USE_MEM_SPM
#asm
sts SPMREG, r22 ; Регистр команд, как память
#endasm
#else
#asm
out SPMREG, r22 ; Регистр команд, как порт
#endasm
#endif
#asm
spm ; Запуск на выполнение

nop
nop
nop
nop

call spmWait ; Жду завершения
#endasm
#ifdef USE_RAMPZ
#asm
out RAMPZ, r25 ; Восстанавливаю состояние
#endasm
#endif
#asm
out SREG, r24
ret
#endasm

#pragma warn-
void ResetTempBuffer (FADDRTYPE addr)
{
#asm
ldi r22, (1 << RWWSRE) | (1 << SPMEN)
call spmSPM
#endasm
}

void FillTempBuffer (unsigned short data, FADDRTYPE addr)
{
#ifdef USE_RAMPZ
#asm
ldd r0, y+4 ; Данные
ldd r1, y+5
#endasm
#else
#asm
ldd r0, y+2 ; Данные
ldd r1, y+3
#endasm
#endif
#asm
ldi r22, (1 << SPMEN) ; Команда

call spmSPM ; На выполнение
#endasm
}

void PageErase (FADDRTYPE addr)
{
#asm
ldi r22, (1 << PGERS) | (1 << SPMEN)
call spmSPM
#endasm
}

void PageWrite (FADDRTYPE addr)
{
#asm
ldi r22, (1 << PGWRT) | (1 << SPMEN)
call spmSPM
#endasm
}
#pragma warn+


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru