|
/*********************************************************/
/* 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 writeenableRWW();
}/*********************************************************/
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 interruptsPORTD = 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 EnableRxChar();
TxChar('>');
Wait();
if (RxChar()=='<') BootLoad();
ExecCode();
}
Составить ответ ||| Конференция ||| Архив
Ответы
- Вот еще h-файл. Еще есть под Мегу128 — CTAC (13.02.2004 11:13, 560 байт)
- Ответ: А можно мне под Мегу128, если не трудно. — grade (13.02.2004 11:24, пустое)
- На мыло послал. Там загрузка по УАРТ1 сделана — CTAC (13.02.2004 11:55, пустое)
- Ответ: Спасибо. — grade (13.02.2004 14:38, пустое)
Перейти к списку ответов ||| Конференция ||| Архив ||| Главная страница ||| Содержание ||| Без кадра E-mail: info@telesys.ru