So ich habe den Bootloader mit dem Mega 32 am Laufen.
Der Code ganz knapp unter 2K Byte mit LCD Anzeige und dem Orginal von MCS
abgewandelt:Läuft mit 38400 Baud ohne Probleme.Code:$crystal = 16000000 $baud = 38400 'this loader uses serial com $regfile = "m32def.dat" Config Portb = Output Config Lcd = 20 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.6 , Rs = Portb.5 Config Lcdbus = 4 Config Pind.0 = Input 'RxD für RS232 Config Pind.1 = Output 'TxD für RS232 Const Loaderchip = 32 ' Mega32 $loader = $3c00 '$3800= 2048 word $3c00= 1024 words Const Maxwordbit = 6 'Z6 is maximum bit ' Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 Const Maxword =(2 ^ Maxwordbit) * 2 '128 Const Maxwordshift = Maxwordbit + 1 'Dim the used variables Dim Bstatus As Byte , Bretries As Byte , Bblock As Byte , Bblocklocal As Byte Dim Bcsum1 As Byte , Bcsum2 As Byte , Buf(128) As Byte , Csum As Byte Dim J As Byte , Spmcrval As Byte ' self program command byte value Dim Z As Long 'this is the Z pointer word Dim Vl As Byte , Vh As Byte ' these bytes are used for the data values Dim Wrd As Word , Page As Word 'these vars contain the page and word address Dim Bkind As Byte , Bstarted As Byte Disable Interrupts 'we do not use ints 'some constants used in serial com Const Nak = &H15 Const Ack = &H06 Const Can = &H18 $timeout = 200000 'we use a timeout 'When you get LOADER errors during the upload, increase the timeout value 'for example at 16 Mhz, use 200000 Waitms 100 Initlcd Cls Cursor Off Noblink Locate 1 , 1 Lcd "Boote ..... " Locate 2 , 1 Lcd "...................." Locate 2 , 1 For J = 0 To 20 Lcd " " Waitms 150 Bretries = 5 'we try 5 times Teste_ob_was_kommt: Bstatus = Waitkey() 'wait for the loader to send a byte Print Chr(bstatus); If Bstatus = 123 Then 'did we received value 123 ? Bkind = 0 'normal flash loader Goto Loader Elseif Bstatus = 124 Then ' EEPROM Bkind = 1 ' EEPROM loader Goto Loader Elseif Bstatus <> 0 Then Decr Bretries If Bretries <> 0 Then Goto Teste_ob_was_kommt 'we test again End If Next J Goto _reset 'goto the normal reset vector at address 0 'this is the loader routine. It is a Xmodem-checksum reception routine Loader: Do Bstatus = Waitkey() Loop Until Bstatus = 0 For J = 1 To 3 'this is a simple indication that we start the normal reset vector Toggle Portb.2 : Waitms 50 Next If Bkind = 0 Then Spmcrval = 3 : Gosub Do_spm ' erase the first page Spmcrval = 17 : Gosub Do_spm ' re-enable page End If Bretries = 10 'number of retries Do Bstarted = 0 ' we were not started yet Csum = 0 'checksum is 0 when we start Print Chr(nak); ' firt time send a nack Do Bstatus = Waitkey() 'wait for statuse byte Select Case Bstatus Case 1: ' start of heading, PC is ready to send Incr Bblocklocal 'increase local block count Csum = 1 'checksum is 1 Bblock = Waitkey() : Csum = Csum + Bblock 'get block Bcsum1 = Waitkey() : Csum = Csum + Bcsum1 'get checksum first byte For J = 1 To 128 'get 128 bytes Buf(j) = Waitkey() : Csum = Csum + Buf(j) Next Bcsum2 = Waitkey() 'get second checksum byte If Bblocklocal = Bblock Then 'are the blocks the same? If Bcsum2 = Csum Then 'is the checksum the same? Gosub Writepage 'yes go write the page Print Chr(ack); 'acknowledge Else 'no match so send nak Print Chr(nak); End If Else Print Chr(nak); 'blocks do not match End If Case 4: ' end of transmission , file is transmitted If Wrd > 0 Then 'if there was something left in the page Wrd = 0 'Z pointer needs wrd to be 0 Spmcrval = 5 : Gosub Do_spm 'write page Spmcrval = 17 : Gosub Do_spm ' re-enable page End If Print Chr(ack); ' send ack and ready Portb.3 = 0 ' simple indication that we are finished and ok Waitms 20 Goto _reset ' start new program Case &H18: ' PC aborts transmission Goto _reset ' ready Case 123 : Exit Do 'was probably still in the buffer Case 124 : Exit Do Case Else Exit Do ' no valid data End Select Loop If Bretries > 0 Then 'attempte left? Waitms 1000 Decr Bretries 'decrease attempts Else Goto _reset 'reset chip End If Loop 'write one or more pages Writepage: If Bkind = 0 Then For J = 1 To 128 Step 2 'we write 2 bytes into a page Vl = Buf(j) : Vh = Buf(j + 1) 'get Low and High bytes lds r0, {vl} 'store them into r0 and r1 registers lds r1, {vh} Spmcrval = 1 : Gosub Do_spm 'write value into page at word address Wrd = Wrd + 2 ' word address increases with 2 because LS bit of Z is not used If Wrd = Maxword Then ' page is full Wrd = 0 'Z pointer needs wrd to be 0 Spmcrval = 5 : Gosub Do_spm 'write page Spmcrval = 17 : Gosub Do_spm ' re-enable page Page = Page + 1 'next page Spmcrval = 3 : Gosub Do_spm ' erase next page Spmcrval = 17 : Gosub Do_spm ' re-enable page End If Next Else 'eeprom For J = 1 To 128 Writeeeprom Buf(j) , Wrd Wrd = Wrd + 1 Next End If Toggle Portb.2 : Waitms 10 : Toggle Portb.2 'indication that we write Return Do_spm: Bitwait Spmcsr.0 , Reset ' check for previous SPM complete Bitwait Eecr.1 , Reset 'wait for eeprom Z = Page 'make equal to page Shift Z , Left , Maxwordshift 'shift to proper place Z = Z + Wrd 'add word lds r30,{Z} lds r31,{Z+1} Spmcsr = Spmcrval 'assign register spm 'this is an asm instruction nop nop Return
Die Fuseeinstellungen siehe Bild.
Ich habe den Mega 32 auch gegen Auslesen geschützt.
Nun kommtnoch ein Krüptfunction rein![]()
Bild hier
Grüße Gento







Zitieren

Lesezeichen