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

📄 main.lis

📁 一个AVR单片机BOOTLOADER的例子
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\mega8\boot\main.c
 0000                   .dbfunc e sendchar _sendchar fV
 0000           ;              c -> R16
                        .even
 0000           _sendchar::
 0000                   .dbline -1
 0000                   .dbline 17
 0000           ; /*******************************************/
 0000           ; /*            广州天河双龙电子公司         */
 0000           ; /*            http://www.sl.com.cn         */
 0000           ; /*           BOOT引导IAP应用演示程序       */
 0000           ; /*             作者:ntzwq@wx88.net         */
 0000           ; /*                2002年5月11日            */
 0000           ; /*   目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
 0000           ; /*******************************************/
 0000           ; #include "self.h"
 0000           ; #include "assembly.h"
 0000           ; #include<iom8v.h>
 0000           ; #define fosc 8000000 //晶振8MHZ
 0000           ; #define baud 19200     //波特率
 0000           ; extern unsigned char read_flash(unsigned int add);
 0000           ; /*            字符输出函数             */
 0000           ; void sendchar(unsigned char c)
 0000           ;       {        
 0000           L2:
 0000                   .dbline 18
 0000           L3:
 0000                   .dbline 18
 0000           ;      while (!(UCSRA&(1<<UDRE)));
 0000 5D9B              sbis 0xb,5
 0002 FECF              rjmp L2
 0004                   .dbline 19
 0004           ;        UDR=c;    
 0004 0CB9              out 0xc,R16
 0006                   .dbline -2
 0006                   .dbline 20
 0006           ;       }
 0006           L1:
 0006                   .dbline 0 ; func end
 0006 0895              ret
 0008                   .dbsym r c 16 c
 0008                   .dbend
 0008                   .dbfunc e recchar _recchar fc
                        .even
 0008           _recchar::
 0008                   .dbline -1
 0008                   .dbline 23
 0008           ; /*            字符输入函数             */     
 0008           ; unsigned char recchar(void)
 0008           ;       {
 0008           L6:
 0008                   .dbline 24
 0008           L7:
 0008                   .dbline 24
 0008           ;        while(!(UCSRA& (1<<RXC)));
 0008 5F9B              sbis 0xb,7
 000A FECF              rjmp L6
 000C                   .dbline 25
 000C           ;      return UDR;
 000C 0CB1              in R16,0xc
 000E                   .dbline -2
 000E           L5:
 000E                   .dbline 0 ; func end
 000E 0895              ret
 0010                   .dbend
 0010                   .dbfunc e uart_init _uart_init fV
                        .even
 0010           _uart_init::
 0010                   .dbline -1
 0010                   .dbline 29
 0010           ;       }               
 0010           ; /*                    UART初始化                              */      
 0010           ; void uart_init(void)
 0010           ; {
 0010                   .dbline 30
 0010           ;  OSCCAL=read_flash(0x1f20);//对内部RC OSC调整
 0010 00E2              ldi R16,7968
 0012 1FE1              ldi R17,31
 0014 00D0              rcall _read_flash
 0016 01BF              out 0x31,R16
 0018                   .dbline 31
 0018           ;  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
 0018 88E1              ldi R24,24
 001A 8AB9              out 0xa,R24
 001C                   .dbline 32
 001C           ;  UBRRL=(fosc/16/(baud+1))%256;
 001C 8AE1              ldi R24,26
 001E 89B9              out 0x9,R24
 0020                   .dbline 33
 0020           ;  UBRRH=(fosc/16/(baud+1))/256;
 0020 2224              clr R2
 0022 20BC              out 0x20,R2
 0024                   .dbline 34
 0024           ;  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
 0024 86E8              ldi R24,134
 0026 80BD              out 0x20,R24
 0028                   .dbline -2
 0028                   .dbline 35
 0028           ; }
 0028           L9:
 0028                   .dbline 0 ; func end
 0028 0895              ret
 002A                   .dbend
 002A                   .dbfunc e iap _iap fV
 002A           ;         intval -> R10,R11
 002A           ;           data -> R14,R15
 002A           ;          ldata -> R12
 002A           ;        address -> R22,R23
 002A           ;            val -> R20
                        .even
 002A           _iap::
 002A 00D0              rcall push_gset5
 002C                   .dbline -1
 002C                   .dbline 37
 002C           ; void iap(void)
 002C           ; {
 002C                   .dbline 40
 002C           ;     unsigned int intval,address,data;
 002C           ;     unsigned char val, ldata;
 002C           ;      for(;;)                           
 002C           L11:
 002C                   .dbline 41
 002C           ;       {
 002C                   .dbline 42
 002C           ;        val=recchar();         
 002C EDDF              rcall _recchar
 002E 402F              mov R20,R16
 0030                   .dbline 43
 0030           ;        if(val=='a')                    //Autoincrement?
 0030 0136              cpi R16,97
 0032 19F4              brne L15
 0034                   .dbline 44
 0034           ;           { 
 0034                   .dbline 45
 0034           ;                  sendchar('Y');                                   //Autoincrement is quicker
 0034 09E5              ldi R16,89
 0036 E4DF              rcall _sendchar
 0038                   .dbline 46
 0038           ;                 }
 0038 F9CF              rjmp L11
 003A           L15:
 003A                   .dbline 47
 003A           ;        else if(val=='A')                   //write address 
 003A 4134              cpi R20,65
 003C 61F4              brne L17
 003E                   .dbline 48
 003E           ;           {
 003E                   .dbline 49
 003E           ;            address=recchar();                //read address 8 MSB
 003E E4DF              rcall _recchar
 0040 602F              mov R22,R16
 0042 7727              clr R23
 0044                   .dbline 50
 0044           ;            address=(address<<8)|recchar();
 0044 E1DF              rcall _recchar
 0046 362E              mov R3,R22
 0048 202E              mov R2,R16
 004A B101              movw R22,R2
 004C                   .dbline 51
 004C           ;            address=address<<1;               //convert from word address to byte address
 004C 660F              lsl R22
 004E 771F              rol R23
 0050                   .dbline 52
 0050           ;            sendchar('\r');
 0050 0DE0              ldi R16,13
 0052 D6DF              rcall _sendchar
 0054                   .dbline 53
 0054           ;           }
 0054 EBCF              rjmp L11
 0056           L17:
 0056                   .dbline 54
 0056           ;         else if(val=='c')                   //Write program memory, low byte
 0056 4336              cpi R20,99
 0058 29F4              brne L19
 005A                   .dbline 55
 005A           ;           {       
 005A                   .dbline 56
 005A           ;            ldata=recchar();
 005A D6DF              rcall _recchar
 005C C02E              mov R12,R16
 005E                   .dbline 57
 005E           ;            sendchar('\r');
 005E 0DE0              ldi R16,13
 0060 CFDF              rcall _sendchar
 0062                   .dbline 58
 0062           ;           }
 0062 E4CF              rjmp L11
 0064           L19:
 0064                   .dbline 59
 0064           ;         else if(val== 'C')                  //Write program memory, high byte 
 0064 4334              cpi R20,67
 0066 89F4              brne L21
 0068                   .dbline 60
 0068           ;           {
 0068                   .dbline 61
 0068           ;            data=ldata|(recchar()<<8);
 0068 CFDF              rcall _recchar
 006A 202E              mov R2,R16
 006C 3324              clr R3
 006E 322C              mov R3,R2
 0070 2224              clr R2
 0072 EC2C              mov R14,R12
 0074 FF24              clr R15
 0076 E228              or R14,R2
 0078 F328              or R15,R3
 007A                   .dbline 62
 007A           ;            fill_temp_buffer(data,(address)); //call asm routine. 
 007A 9B01              movw R18,R22
 007C 8701              movw R16,R14
 007E 00D0              rcall _fill_temp_buffer
 0080                   .dbline 63
 0080           ;            address+=2;  
 0080 6E5F              subi R22,254  ; offset = 2
 0082 7F4F              sbci R23,255
 0084                   .dbline 64
 0084           ;            sendchar('\r');
 0084 0DE0              ldi R16,13
 0086 BCDF              rcall _sendchar
 0088                   .dbline 65
 0088           ;           }        
 0088 D1CF              rjmp L11
 008A           L21:
 008A                   .dbline 66
 008A           ;          else if(val=='e')                   //Chip erase 
 008A 4536              cpi R20,101
 008C 79F4              brne L23
 008E                   .dbline 67
 008E           ;           {
 008E                   .dbline 68
 008E           ;            for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
 008E 6627              clr R22
 0090 7727              clr R23
 0092 05C0              rjmp L28
 0094           L25:
 0094                   .dbline 69
 0094                   .dbline 70
 0094 23E0              ldi R18,3
 0096 8B01              movw R16,R22
 0098 00D0              rcall _write_page
 009A                   .dbline 71
 009A           L26:
 009A                   .dbline 68
 009A 605C              subi R22,192  ; offset = 64
 009C 7F4F              sbci R23,255
 009E           L28:
 009E                   .dbline 68
 009E 6030              cpi R22,0
 00A0 ECE1              ldi R30,28
 00A2 7E07              cpc R23,R30
 00A4 B8F3              brlo L25
 00A6                   .dbline 72
 00A6           ;              {
 00A6           ;               write_page(address,0x03);       //Perform page erase
 00A6           ;              }
 00A6           ;            sendchar('\r');        
 00A6 0DE0              ldi R16,13
 00A8 ABDF              rcall _sendchar
 00AA                   .dbline 73
 00AA           ;           }
 00AA C0CF              rjmp L11
 00AC           L23:
 00AC                   .dbline 74
 00AC           ;          else if(val=='l')                   // write lockbits 
 00AC 4C36              cpi R20,108
 00AE 29F4              brne L29
 00B0                   .dbline 75
 00B0           ;           {
 00B0                   .dbline 76
 00B0           ;            write_lock_bits(recchar());
 00B0 ABDF              rcall _recchar
 00B2 00D0              rcall _write_lock_bits
 00B4                   .dbline 77
 00B4           ;            sendchar('\r');
 00B4 0DE0              ldi R16,13
 00B6 A4DF              rcall _sendchar
 00B8                   .dbline 78
 00B8           ;           }       
 00B8 B9CF              rjmp L11
 00BA           L29:
 00BA                   .dbline 79
 00BA           ;          else if(val== 'm')                  // write page
 00BA 4D36              cpi R20,109
 00BC 31F4              brne L31
 00BE                   .dbline 80
 00BE           ;           {
 00BE                   .dbline 81
 00BE           ;            write_page((address),0x05);       
 00BE 25E0              ldi R18,5
 00C0 8B01              movw R16,R22
 00C2 00D0              rcall _write_page
 00C4                   .dbline 82
 00C4           ;            sendchar('\r');
 00C4 0DE0              ldi R16,13
 00C6 9CDF              rcall _sendchar
 00C8                   .dbline 83
 00C8           ;           }        
 00C8 B1CF              rjmp L11
 00CA           L31:
 00CA                   .dbline 84
 00CA           ;          else if((val=='P')||(val=='L'))     // Enter programming mode 
 00CA 4035              cpi R20,80
 00CC 11F0              breq L35
 00CE 4C34              cpi R20,76
 00D0 19F4              brne L33
 00D2           L35:
 00D2                   .dbline 85
 00D2           ;           {
 00D2                   .dbline 86
 00D2           ;            sendchar('\r');
 00D2 0DE0              ldi R16,13
 00D4 95DF              rcall _sendchar
 00D6                   .dbline 87
 00D6           ;           }
 00D6 AACF              rjmp L11
 00D8           L33:
 00D8                   .dbline 88
 00D8           ;          else if (val=='p')
 00D8 4037              cpi R20,112
 00DA 19F4              brne L36
 00DC                   .dbline 89
 00DC           ;           {
 00DC                   .dbline 90
 00DC           ;            sendchar('S');
 00DC 03E5              ldi R16,83
 00DE 90DF              rcall _sendchar
 00E0                   .dbline 91
 00E0           ;           }              
 00E0 A5CF              rjmp L11
 00E2           L36:
 00E2                   .dbline 92
 00E2           ;          else if(val=='R')                   //Read program memory 
 00E2 4235              cpi R20,82
 00E4 B9F4              brne L38
 00E6                   .dbline 93
 00E6           ;           {
 00E6                   .dbline 94
 00E6           ;                  if (address>=APP_END)
 00E6 6030              cpi R22,0
 00E8 ECE1              ldi R30,28
 00EA 7E07              cpc R23,R30
 00EC 38F0              brlo L40
 00EE                   .dbline 95
 00EE           ;                    {
 00EE                   .dbline 96
 00EE           ;                         sendchar(0xff);
 00EE 0FEF              ldi R16,255
 00F0 87DF              rcall _sendchar
 00F2                   .dbline 97
 00F2           ;                         sendchar(0xff);
 00F2 0FEF              ldi R16,255
 00F4 85DF              rcall _sendchar
 00F6                   .dbline 98
 00F6           ;                         address+=2;
 00F6 6E5F              subi R22,254  ; offset = 2
 00F8 7F4F              sbci R23,255
 00FA                   .dbline 99
 00FA           ;                        }
 00FA 98CF              rjmp L11
 00FC           L40:

⌨️ 快捷键说明

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