Вот исходник оттуда, пределанный под КодеВизион. Работает.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено CTAC 13 февраля 2004 г. 11:09
В ответ на: Я с этого начал. отправлено sda 13 февраля 2004 г. 10:48


/*********************************************************/
/* BootLoader for ATMega32 & MegaLoad */
/* Version 1.2 August 2003 */
/*********************************************************/
/* I N C L U D E */
/*********************************************************/
#include "Load32.h"
#include "Mega32.h"
/*********************************************************/
/* D E F I N E */
/*********************************************************/
//#define DeviceID 'A' // Mega8
//#define DeviceID 'B' // Mega16
#define DeviceID 'E' // Mega32
//#define DeviceID 'C' // Mega64
//#define DeviceID 'D' // Mega128


//#define FlashSize 'l' // Flash 8k
//#define FlashSize 'm' // Flash 16k
#define FlashSize 'n' // Flash 32k
//#define FlashSize 'o' // Flash 64k
//#define FlashSize 'p' // Flash 128k

//#define BootSize 'a' // 128 Words
//#define BootSize 'b' // 256 Words
#define BootSize 'c' // 512 Words
//#define BootSize 'd' // 1024 Words
//#define BootSize 'e' // 2048 Words
//#define BootSize 'f' // 4096 Words

//#define PageSize 'Q' // 32 Bytes
//#define PageSize 'R' // 64 Bytes
#define PageSize 'S' // 128 Bytes
//#define PageSize 'T' // 256 Bytes
//#define PageSize 'U' // 512 Bytes

//#define PageByte 32 // 32 Bytes
//#define PageByte 64 // 64 Bytes
#define PageByte 128 // 128 Bytes
//#define PageByte 256 // 256 Bytes
//#define PageByte 512 // 512 Bytes

#define FALSE 0
#define TRUE 1

#define EXECCODE 0xff80

unsigned char PageBuffer[PageByte];
unsigned int PageAddress;

#asm
.EQU SPMCR = 0x57 ;//!!! difference 32 - 128
#endasm
#pragma warn-
#pragma used+
void WAIT_SPMEN(void)
{
#asm
LDS R30,SPMCR ; load SPMCR to R27
SBRC R30,0 ; check SPMEN flag
RJMP _WAIT_SPMEN ; wait for SPMEN flag cleared
#endasm
}
void write_page (unsigned int adr, unsigned char function)
//; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
{
#asm
CALL _WAIT_SPMEN
LDD R30,Y+1
LDD R31,Y+2 ;move address to z pointer (R31=ZH R30=ZL)
LDD R26,Y+0
STS SPMCR,R26 ;argument 2 decides function
SPM ;perform pagewrite
#endasm
}
void fill_temp_buffer (unsigned int data, unsigned int adr)
{
//; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
#asm
CALL _WAIT_SPMEN
LDD R31,Y+1
LDD R30,Y+0 ;move adress to z pointer (R31=ZH R30=ZL)
LDD R1,Y+3
LDD R0,Y+2 ;move data to reg 0 and 1
LDI R26,0x01
STS SPMCR,R26
SPM ;Store program memory
#endasm
}
unsigned int read_program_memory (unsigned int adr ,unsigned char cmd)
{
#asm
LDD R31,Y+2 ;R31=ZH R30=ZL
LDD R30,Y+1 ;move adress to z pointer
LDD R26,Y+0
SBRC R26,0 ;read lockbits? (second argument=0x09)
STS SPMCR,R26 ;if so, place second argument in SPMEN register
ELPM ;read LSB
MOV R26,R0
INC R30
LPM
MOV R31,R0 ;read MSB (ignored when reading lockbits)
MOV R30,R26
#endasm
}

/*void write_lock_bits (unsigned char val)
{
#asm
LD R0,Y
LDI R30,0x09
STS SPMCR,R30
SPM ;write lockbits
#endasm
} */
void enableRWW(void)
{
#asm
CALL _WAIT_SPMEN
LDI R27,0x11
STS SPMCR,R27
SPM
#endasm
}
#pragma used-
#pragma warn+

/*********************************************************/

void BootLoad(void)
{
TxChar(DeviceID);
TxChar(FlashSize);
TxChar(BootSize);
TxChar(PageSize);
RxChar();

TxChar('!');
while(1)
{
GetPageNumber();
if (PageAddress == EXECCODE) ExecCode();

if (GetPage())
{
WriteFlash();
if (CheckFlash()) TxChar('!');
else TxChar('@');
}
else TxChar('@');
}
}

/*********************************************************/

void GetPageNumber(void)
{
while(!IsChar());
PageAddress = (unsigned int)RxChar() << 8;

while(!IsChar());
PageAddress += RxChar();
PageAddress = (unsigned int)PageAddress << 7;
}

/*********************************************************/

void ExecCode(void)
{
GICR = 0x01; // Enable interrupt vector select
GICR = 0x00; // Move interrupt vector to flash
#asm("jmp 0x0000"); // Run application code
}

/*********************************************************/

char GetPage(void)
{
unsigned char i;
unsigned char LocalCheckSum = 0;
unsigned char CheckSum = 0;

for (i=0;i {
while(!IsChar());
PageBuffer[i]=RxChar();
LocalCheckSum += PageBuffer[i];
}

while(!IsChar());
CheckSum = RxChar();
if (LocalCheckSum == CheckSum) return 1;
else return 0;
}

/*********************************************************/

void WriteFlash(void)
{
unsigned int i;
unsigned int TempInt;

for (i=0;i {
TempInt=PageBuffer[i]+((unsigned int)PageBuffer[i+1]<<8);
fill_temp_buffer(TempInt,i); //call asm routine.
}
write_page(PageAddress,0x03); //Perform page ERASE
write_page(PageAddress,0x05); //Perform page write

enableRWW();
}

/*********************************************************/

char CheckFlash(void)
{
unsigned int i;
unsigned int TempInt;
unsigned int TempInt2;

for (i=0;i {
TempInt = read_program_memory(PageAddress + i,0x00);
TempInt2 = (unsigned int)PageBuffer[i] +((unsigned int)PageBuffer[i+1]<<8);
if (TempInt != TempInt2) return 0;
}
return 1;
}

/*********************************************************/

unsigned char IsChar(void)
{
if (UCSRA & 0x80) return 1;
else return 0;
}

/*********************************************************/

unsigned char RxChar(void)
{
return UDR; // Write char
}

/*********************************************************/

void TxChar(unsigned char ch)
{
while (!(UCSRA & 0x20)); // Wait for empty transmit buffer
UDR = ch; // Write char
}

/*********************************************************/

void Wait(void)
{
int i;

for (i=0;i<32000;i++);
}

/*********************************************************/

void main(void)
{
#asm("CLI"); // disable all interrupts

PORTD = 0x01; // Pull up on RX line
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86; // Asyn,NoParity,1StopBit,8Bit,
UBRRH = 0x00; //set baud rate
UBRRL = 0x4D; //9.6 kbaud
UCSRB = 0x18; // Rx enable Tx Enable

RxChar();
TxChar('>');
Wait();
if (RxChar()=='<') BootLoad();
ExecCode();
}

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

Ответы



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

E-mail: info@telesys.ru