⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 AVR mage8单片机的bootload程序、完整版本、本人做项目一下在用、此程序为8m晶振版本、非常好用
💻 S
📖 第 1 页 / 共 2 页
字号:
;        TempInt -> R20,R21
;              i -> R22,R23
	.even
_WriteFlash::
	rcall push_gset2
; 	
; }
; 
; /*****************************************************************************/
; 
; void WriteFlash(void)
; {
;     unsigned int i;
;     unsigned int TempInt;
; 
;     for(i = 0 ; i < PageByte ; i += 2)
	clr R22
	clr R23
	rjmp L35
L32:
	ldi R24,<_PageBuffer
	ldi R25,>_PageBuffer
	movw R30,R22
	adiw R30,1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	movw R30,R22
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	clr R21
	add R20,R2
	adc R21,R3
	movw R18,R22
	movw R16,R20
	rcall _fill_temp_buffer
L33:
	subi R22,254  ; offset = 2
	sbci R23,255
L35:
	cpi R22,64
	ldi R30,0
	cpc R23,R30
	brlo L32
;    	{
;    	    TempInt = PageBuffer[i] + (PageBuffer[i+1]<<8);
;    	    fill_temp_buffer(TempInt,i);    //call asm routine.
;    	}
; 	  write_page(PageAddress,0x03);       //Perform page ERASE
	ldi R18,3
	lds R16,_PageAddress
	lds R17,_PageAddress+1
	rcall _write_page
;     write_page(PageAddress,0x05);       //Perform page write
	ldi R18,5
	lds R16,_PageAddress
	lds R17,_PageAddress+1
	rcall _write_page
;     enableRWW();
	rcall _enableRWW
;     WDR();
	wdr
L31:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
;       TempInt2 -> R22,R23
;        TempInt -> R10,R11
;              i -> R20,R21
	.even
_CheckFlash::
	rcall push_gset3
; }
; 
; /*****************************************************************************/
; 
; char CheckFlash(void)
; {
;     unsigned int i;							
;     unsigned int TempInt;
;     unsigned int TempInt2;
;     WDR();
	wdr
;     for (i = 0 ; i < PageByte ; i += 2)
	clr R20
	clr R21
	rjmp L40
L37:
;     {
; 	      TempInt = read_program_memory(PageAddress + i , 0x00);
	clr R18
	lds R16,_PageAddress
	lds R17,_PageAddress+1
	add R16,R20
	adc R17,R21
	rcall _read_program_memory
	movw R10,R16
; 	      TempInt2 = PageBuffer[i] +(PageBuffer[i+1] << 8);
	ldi R24,<_PageBuffer
	ldi R25,>_PageBuffer
	movw R30,R20
	adiw R30,1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	movw R30,R20
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	clr R23
	add R22,R2
	adc R23,R3
; 	      if (TempInt != TempInt2) return 0;
	cp R16,R22
	cpc R17,R23
	breq L41
	clr R16
	rjmp L36
L41:
L38:
	subi R20,254  ; offset = 2
	sbci R21,255
L40:
	cpi R20,64
	ldi R30,0
	cpc R21,R30
	brlo L37
;     }
;     return 1;
	ldi R16,1
L36:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
;       CheckSum -> R22
;           Data -> R10
;    ByteAddress -> R12,R13
; ByteAddressLow -> R22
; ByteAddressHigh -> R10
;  LocalCheckSum -> R20
	.even
_EEpromLoad::
	rcall push_gset4
; }
; 
; /*****************************************************************************/
; /* EEprom Programing Code								                     */
; /*****************************************************************************/
; 
; #ifdef EEPROM
; void EEpromLoad()
; {
; unsigned char ByteAddressHigh;
; unsigned char ByteAddressLow;
; unsigned int ByteAddress;
; unsigned char Data;
; unsigned char LocalCheckSum;
; unsigned char CheckSum;
; 
; TxChar(')');
	ldi R16,41
	rcall _TxChar
; TxChar('!');
	ldi R16,33
	rcall _TxChar
	rjmp L45
L44:
; while (1)
; 	  {
; 	  WDR();
	wdr
; 	  LocalCheckSum = 0;
	clr R20
L47:
L48:
; 	  
; 	  while(!IsChar());
	rcall _IsChar
	tst R16
	breq L47
; 	  ByteAddressHigh = RxChar();
	rcall _RxChar
	mov R10,R16
; 	  LocalCheckSum += ByteAddressHigh;
	add R20,R16
L50:
L51:
; 	  
; 	  while(!IsChar());
	rcall _IsChar
	tst R16
	breq L50
; 	  ByteAddressLow = RxChar();
	rcall _RxChar
	mov R22,R16
; 	  LocalCheckSum += ByteAddressLow;
	add R20,R16
; 	  
; 	  ByteAddress = (ByteAddressHigh<<8)+ByteAddressLow;
	mov R13,R10
	mov R12,R22
; 	  
; 	  if (ByteAddress == 0xffff) return;
	movw R24,R12
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L56
	rjmp L43
L55:
L56:
; 	  
; 	  while(!IsChar());
	rcall _IsChar
	tst R16
	breq L55
; 	  Data = RxChar();
	rcall _RxChar
	mov R10,R16
; 	  LocalCheckSum += Data;
	add R20,R16
; 	  
; 	  WDR();
	wdr
L58:
L59:
; 	  
; 	  while(!IsChar());
	rcall _IsChar
	tst R16
	breq L58
; 	  CheckSum = RxChar();	
	rcall _RxChar
	mov R22,R16
; 	  
; 	  if (CheckSum == LocalCheckSum)	
	cp R16,R20
	brne L61
; 	  	 {  
; 		 EEPROMwrite(ByteAddress, Data);
	mov R18,R10
	movw R16,R12
	rcall _EEPROMwrite
; 	  	 if (EEPROMread(ByteAddress) == Data) TxChar('!');
	movw R16,R12
	rcall _EEPROMread
	cp R16,R10
	brne L63
	ldi R16,33
	rcall _TxChar
	rjmp L62
L63:
; 	  	 else TxChar('@');
	ldi R16,64
	rcall _TxChar
; 		 }
	rjmp L62
L61:
; 	  else
; 	     {
; 		 TxChar('@');
	ldi R16,64
	rcall _TxChar
; 		 }
L62:
L45:
	rjmp L44
X2:
L43:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
;           byte -> R18
;       location -> R16,R17
	.even
_EEPROMwrite::
; 	  }
; }
; #endif
; 
; 
; 
; #ifdef EEPROM
; void EEPROMwrite( int location, unsigned char byte)
; {
L66:
L67:
; while (EECR & 0x02);   // Wait until any earlier write is done
	sbic 0x1c,1
	rjmp L66
; EEAR = location;
	out 0x1f,R17
	out 0x1e,R16
; EEDR = byte;
	out 0x1d,R18
; EECR |= 0x04;          // Set MASTER WRITE enable
	sbi 0x1c,2
; EECR |= 0x02;          // Set WRITE strobe
	sbi 0x1c,1
; WDR();
	wdr
L65:
	.dbline 0 ; func end
	ret
;       location -> R16,R17
	.even
_EEPROMread::
; } 
; #endif         
; 
; 
; 
; #ifdef EEPROM
; unsigned char EEPROMread( int location)
; {
L70:
L71:
; //WDR();
; while (EECR & 0x02);            
	sbic 0x1c,1
	rjmp L70
; EEAR = location;
	out 0x1f,R17
	out 0x1e,R16
; EECR |= 0x01;                       // Set READ strobe
	sbi 0x1c,0
; return (EEDR);                      // Return byte
	in R16,0x1d
L69:
	.dbline 0 ; func end
	ret
	.even
_IsChar::
; }
; #endif 
; 
; 
; /*****************************************************************************/
; /* LockBit Code										                         */
; /*****************************************************************************/
; 
; 
; #ifdef LOCKBIT
; void LockBit(void)
; {
; unsigned char Byte;
; WDR();
; TxChar('%');
; 
; while(!IsChar());
; Byte = RxChar();
; 
; while(!IsChar());
; if (Byte == ~RxChar()) write_lock_bits(~Byte);
; }
; #endif
; 
; 
; /*****************************************************************************/
; /* Serial Port Code										                     */
; /*****************************************************************************/
; unsigned char IsChar(void)
; {
;     if(UCSRA & 0x80) 
	sbis 0xb,7
	rjmp L74
;     	  return 1;
	ldi R16,1
	rjmp L73
L74:
;     else 
;     	  return 0;
	clr R16
L73:
	.dbline 0 ; func end
	ret
	.even
_RxChar::
; }
; 
; /*****************************************************************************/
; unsigned char RxChar(void)
; {
;     return UDR;
	in R16,0xc
L76:
	.dbline 0 ; func end
	ret
;             ch -> R16
	.even
_TxChar::
; }
; 
; /*****************************************************************************/
; 
; void TxChar(char ch)
; {
L78:
L79:
;     while(!(UCSRA & 0x20));  // wait for empty transmit buffer
	sbis 0xb,5
	rjmp L78
; 	
; 	RS485PORT |= RS485TXE;
	sbi 0x12,4
; 	UDR = ch;     	 		     // write char
	out 0xc,R16
L81:
L82:
; 	while(!(UCSRA & 0x40));
	sbis 0xb,6
	rjmp L81
; 	UCSRA |= 0x40;
	sbi 0xb,6
; 	RS485PORT &= ~RS485TXE;	
	cbi 0x12,4
;   WDR(); 
	wdr
L77:
	.dbline 0 ; func end
	ret
;              i -> R16,R17
	.even
_Wait::
; }
; 
; /*****************************************************************************/
; /* Helpers Code											                     */
; /*****************************************************************************/
; void Wait()
; {
	ldi R16,-32000
	ldi R17,-125
L85:
L86:
; int i;
; #ifdef LOW 
; for (i=0;i<32000;i++);
; WDR();
; #endif
; #ifdef HIGH 
; for (i=-32000;i<32000;i++);
	subi R16,255  ; offset = 1
	sbci R17,255
	cpi R16,0
	ldi R30,125
	cpc R17,R30
	brlt L85
; WDR();
	wdr
L84:
	.dbline 0 ; func end
	ret
	.even
_SendDeviceID::
; #endif
; }
; 
; /*****************************************************************************/
; 
; void SendDeviceID(void)
; {
; 
;     TxChar(DeviceID);
	ldi R16,65
	rcall _TxChar
;     TxChar(FlashSize);
	ldi R16,108
	rcall _TxChar
;     TxChar(BootSize);
	ldi R16,100
	rcall _TxChar
;     TxChar(PageSize);
	ldi R16,82
	rcall _TxChar
;     TxChar(EEpromSize);
	ldi R16,49
	rcall _TxChar
;     RxChar();
	rcall _RxChar
;     WDR();
	wdr
L89:
	.dbline 0 ; func end
	ret
	.even
_ExecCode::
; }
; 
; /*****************************************************************************/
; 
; void ExecCode(void)
; {
; #ifdef RAMPZ_FLAG 
;     RAMPZ = 0;
; #endif
;     INTVECREG = 0x01;	   	 // Enable interrupt vector select
	ldi R24,1
	out 0x3b,R24
;     INTVECREG = 0x00;	   	 // Move interrupt vector to flash
	clr R2
	out 0x3b,R2
;     asm("jmp 0x0000");       // Run application code   
	jmp 0x0000
L90:
	.dbline 0 ; func end
	ret
;              i -> R20
	.even
_main::
; }
; 
; 
; 
; void main(void)
; {
;     unsigned char i;
;     CLI();          		      // disable all interrupts
	cli
;     
;     WDTCR |= ( 1 << WDCE ) | ( 1 << WDE ) ;
	in R24,0x21
	ori R24,24
	out 0x21,R24
;     WDTCR = 0x07 ;
	ldi R24,7
	out 0x21,R24
;     
; 	PULLUPPORT = PULLUPPIN;       // Pull up on RX line
	ldi R24,1
	out 0x12,R24
; 
;     UCSRB = 0x00; 				         //disable while setting baud rate
	clr R2
	out 0xa,R2
;     UCSRA = 0x00; 
	out 0xb,R2
;     UCSRC = 0x86; 				         // Asyn,NoParity,1StopBit,8Bit,
	ldi R24,134
	out 0x20,R24
;     UBRRH = 0;     //set baud rate hi
	out 0x20,R2
;     UCSRB = 0x18; 				         // Rx enable Tx Enable
	ldi R24,24
	out 0xa,R24
; #ifdef RS485DDR
; 	RS485DDR |= RS485TXE ;
	sbi 0x11,4
;     RS485PORT &= ~RS485TXE ;
	cbi 0x12,4
; #endif	
; #ifdef BAUDRATE
;     {
;         UBRRL = BAUDRATE;
; #else
; for (i = 8; i < 18; ++i)
	ldi R20,8
	rjmp L95
L92:
;     {
;     	  WDR();
	wdr
;         UBRRL = i;
	out 0x9,R20
; #endif
; 
;         RxChar();
	rcall _RxChar
; 	    TxChar('>');
	ldi R16,62
	rcall _TxChar
; 	    Wait();
	rcall _Wait
; 	    if (RxChar() == '<') 
	rcall _RxChar
	cpi R16,60
	brne L96
; 	    {
; 	        SendDeviceID();
	rcall _SendDeviceID
; 	        FlashLoad();
	rcall _FlashLoad
; //	        Watchdog_Feed();
;        #ifdef EEPROM
; 	        EEpromLoad();
	rcall _EEpromLoad
; //	        Watchdog_Feed();
; 	   #endif
; 	   #ifdef LOCKBIT
; 	        LockBit();
; 	   #endif
; 	        ExecCode();
	rcall _ExecCode
; 	    }
L96:
L93:
	inc R20
L95:
	cpi R20,18
	brlo L92
; 	}
;     ExecCode();
	rcall _ExecCode
L91:
	.dbline 0 ; func end
	ret
	.area bss(ram, con, rel)
_RealPageAddress::
	.blkb 2
_PageAddress::
	.blkb 2
_PageBuffer::
	.blkb 64

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -