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

📄 main.s

📁 Atmega系列单片机 BootLoader程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile D:\桌面\AVR_BO~1.2\bootloader\main.c
	.dbfunc e FlashLoad _FlashLoad fV
	.even
_FlashLoad::
	.dbline -1
	.dbline 74
; /******************************************************************************
; Atmega系列单片机 BootLoader程序  
; 日  期:2007年4月
; 作  者:likeeavr
; 版权所有:avrvi论坛
; 
; 说明:当前版本只针对本论坛M16开发板
; 
; 上位机借用了冯建辉的程序。
; 
; /*****************************************************************************/
; #include <macros.h>
; #include "assembly.h"
;  
; #define  ChipType     Atmega16       
;       
; //*********************************************************
; //选择BOOT区大小  此必须与ICC options中的选项相对应
; //#define  BootSize     'a'    //128   
; //#define  BootSize     'b'    //256
; //#define  BootSize     'c'    //512
; #define    BootSize       'd'    //1024
; //选择BootLoad版本号
; #define  BootVer        'f'    //1.0版本
; 
; //**********************************************************
; 
; #define  Atmega16       0x31
; 
; //*****************************************************************************
; #define  InteClk                 //是否使用内部时钟
; #define  OscAddress     0x1fff   //时钟校准值存储地址
; 
; //*****************************************************************************
; //7.3728M时钟下的波特率为19200的设置,此设置可根据ICC生成,选对芯片,时钟,波特率既可
; //由此语句调用UBRR = BAU;
; #define  BAU  23    // 7.3728M 19200
; //#define  BAU  191 // 7.3728M 2400
; //#define  BAU  95  // 7.3728M 4800
; //#define  BAU  47  // 7.3728M 9600
; //#define  BAU  31  // 7.3728M 14400
; //#define  BAU  23  // 7.3728M 19200
; //#define  BAU  15  // 7.3728M 28800
; 
; //#define  BAU  38  // 12M 19200
; 
; //*****************************************************************************
; 
; #include  <iom16v.h>
; #define   PageByte 	 	 128    
; #define   AddressShift 	 7
; #define	INTVECREG	 	 GICR
; 
; 
; void          FlashLoad        (void);
; void          GetPageNumber    (void);
; void          ExecCode         (void);
; char          GetPage          (void);
; void          WriteFlash       (void);
; char          CheckFlash       (void);
; unsigned char IsChar           (void);
; void          SendChar         (unsigned char c);
; void          delay            (void);                 //1ms延时函数
; unsigned char RecChar          (void);
; 
; unsigned char PageBuffer[PageByte];
; unsigned int  RealPageAddress;
; unsigned int  PageAddress;
; 
; /*****************************************************************************/
; //Flash编程								                     
; /*****************************************************************************/
; void FlashLoad(void)
;   {
	.dbline 75
;     SendChar('!');
	ldi R16,33
	xcall _SendChar
	xjmp L3
L2:
	.dbline 77
;     while (1)
;     {
	.dbline 78
; 	 GetPageNumber();
	xcall _GetPageNumber
	.dbline 80
; 
; 	 if (RealPageAddress == 0xffff) 
	lds R24,_RealPageAddress
	lds R25,_RealPageAddress+1
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L5
	.dbline 81
; 	   return;
	xjmp L1
L5:
	.dbline 83
;         
; 	 if (GetPage())
	xcall _GetPage
	tst R16
	breq L7
	.dbline 84
; 	  {
	.dbline 85
; 		WriteFlash();
	xcall _WriteFlash
	.dbline 86
; 	    if (CheckFlash()) 
	xcall _CheckFlash
	tst R16
	breq L9
	.dbline 87
; 		  SendChar('!');
	ldi R16,33
	xcall _SendChar
	xjmp L8
L9:
	.dbline 89
; 	    else 
; 		  SendChar('@');
	ldi R16,64
	xcall _SendChar
	.dbline 90
; 	  }
	xjmp L8
L7:
	.dbline 92
; 	 else 
; 	   SendChar('@');
	ldi R16,64
	xcall _SendChar
L8:
	.dbline 93
L3:
	.dbline 76
	xjmp L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e GetPageNumber _GetPageNumber fV
;   PageAddressL -> R20
;   PageAddressH -> R22
	.even
_GetPageNumber::
	xcall push_gset2
	.dbline -1
	.dbline 98
;     }
;   }
; 
; /*****************************************************************************/
; void GetPageNumber(void)
;   {
	.dbline 102
;     unsigned char PageAddressH;
;     unsigned char PageAddressL;
; 
;     PageAddressH = RecChar();
	xcall _RecChar
	mov R22,R16
	.dbline 104
; 
;     PageAddressL = RecChar();
	xcall _RecChar
	mov R20,R16
	.dbline 106
; 
;     RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
	mov R3,R22
	mov R2,R20
	sts _RealPageAddress+1,R3
	sts _RealPageAddress,R2
	.dbline 107
; 	PageAddress=RealPageAddress<<AddressShift;
	ldi R18,7
	ldi R19,0
	movw R16,R2
	xcall lsl16
	sts _PageAddress+1,R17
	sts _PageAddress,R16
	.dbline -2
L11:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r PageAddressL 20 c
	.dbsym r PageAddressH 22 c
	.dbend
	.dbfunc e GetPage _GetPage fc
;       CheckSum -> R20
;  LocalCheckSum -> R22
;              i -> R10
	.even
_GetPage::
	xcall push_gset3
	.dbline -1
	.dbline 118
; #ifdef RAMPZ_FLAG
;     if (PageAddressH) 
; 	   RAMPZ = 1; 
;     else 
; 	   RAMPZ = 0;
; #endif	
;   }
; 
; /*****************************************************************************/
; char GetPage(void)
;   {
	.dbline 120
;     unsigned char i;
;     unsigned char LocalCheckSum = 0;
	clr R22
	.dbline 121
;     unsigned char CheckSum = 0;
	clr R20
	.dbline 123
; 
;     for (i=0;i<PageByte/2;i++)
	clr R10
	xjmp L16
X1:
	.dbline 124
; 	{
L17:
	.dbline 125
L18:
	.dbline 125
	xcall _IsChar
	tst R16
	breq L17
	.dbline 126
	xcall _RecChar
	ldi R24,<_PageBuffer
	ldi R25,>_PageBuffer
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 127
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	eor R22,R2
	.dbline 128
L14:
	.dbline 123
	inc R10
L16:
	.dbline 123
	mov R24,R10
	cpi R24,64
	brlo L18
	.dbline 129
; 	 while(!IsChar());
; 	 PageBuffer[i]=RecChar();
; 	 LocalCheckSum ^= PageBuffer[i];
;    	}
; 	for (i=0;i<PageByte/2;i++)
	clr R10
	xjmp L23
X2:
	.dbline 130
; 	{
L24:
	.dbline 131
L25:
	.dbline 131
	xcall _IsChar
	tst R16
	breq L24
	.dbline 132
	xcall _RecChar
	ldi R24,<_PageBuffer+64
	ldi R25,>_PageBuffer+64
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 133
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	eor R22,R2
	.dbline 134
L21:
	.dbline 129
	inc R10
L23:
	.dbline 129
	mov R24,R10
	cpi R24,64
	brlo L25
	.dbline 135
; 	 while(!IsChar());
; 	 PageBuffer[i+PageByte/2]=RecChar();
; 	 LocalCheckSum ^= PageBuffer[i+PageByte/2];
;    	}	   
;     CheckSum = RecChar(); 
	xcall _RecChar
	mov R20,R16
	.dbline 137
; 	
;     if (LocalCheckSum == CheckSum) 
	cp R22,R16
	brne L29
	.dbline 138
; 	  return 1;
	ldi R16,1
	xjmp L12
L29:
	.dbline 140
;     else 
; 	  return 0;
	clr R16
	.dbline -2
L12:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r CheckSum 20 c
	.dbsym r LocalCheckSum 22 c
	.dbsym r i 10 c
	.dbend
	.dbfunc e WriteFlash _WriteFlash fV
;        TempInt -> R20,R21
;              i -> R22,R23
	.even
_WriteFlash::
	xcall push_gset2
	.dbline -1
	.dbline 145
;   }
; 
; /*****************************************************************************/
; void WriteFlash(void)
;   {
	.dbline 148
;     unsigned int i;
;     unsigned int TempInt;
;     for (i=0;i<PageByte;i+=2)
	clr R22
	clr R23
	xjmp L35
L32:
	.dbline 149
	.dbline 150
	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
	.dbline 151
	movw R18,R22
	movw R16,R20
	xcall _fill_temp_buffer
	.dbline 152
L33:
	.dbline 148
	subi R22,254  ; offset = 2
	sbci R23,255
L35:
	.dbline 148
	cpi R22,128
	ldi R30,0
	cpc R23,R30
	brlo L32
	.dbline 153
;       {
;    	   TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
;    	   fill_temp_buffer(TempInt,i);    //call asm routine.
;       } 
;     write_page(PageAddress,0x03);       //擦除页
	ldi R18,3
	lds R16,_PageAddress
	lds R17,_PageAddress+1
	xcall _write_page
	.dbline 154
;     write_page(PageAddress,0x05);       //写页数据
	ldi R18,5
	lds R16,_PageAddress
	lds R17,_PageAddress+1
	xcall _write_page
	.dbline 156
;    
;     enableRWW();
	xcall _enableRWW
	.dbline -2
L31:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r TempInt 20 i
	.dbsym r i 22 i
	.dbend
	.dbfunc e CheckFlash _CheckFlash fc
;       TempInt2 -> R20,R21
;        TempInt -> R22,R23
;              i -> R10
	.even
_CheckFlash::
	xcall push_gset3

⌨️ 快捷键说明

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