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

📄 self_prog.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LIS
字号:
                        .module self_prog.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\self_prog.c
 0000                   .dbfunc e boot_page_ew _boot_page_ew fV
 0000           ;           code -> y+4
 0000           ;       pageAddr -> y+0
                        .even
 0000           _boot_page_ew::
 0000 0E940000          xcall push_arg4
 0004                   .dbline -1
 0004                   .dbline 8
 0004           ; #include "init.h"
 0004           ; 
 0004           ; /**********************************************************************
 0004           ; 擦除(code=0x03)和写入(code=0x05)一个Flash页 
 0004           ; 特别说明,MEGA128为128K容量,分为两个64K空间。
 0004           ; 两个空间之间的选择通过RAMPZ的Bit0位来实现。
 0004           ; **********************************************************************/
 0004           ; void boot_page_ew(unsigned long pageAddr,unsigned char code) {
 0004                   .dbline 10
 0004           ; 
 0004           ;       asm("mov r30,r16\n"
 0004 E02F              mov r30,r16
 0006 F12F              mov r31,r17
 0008 2BBF              out 0x3b,r18
 000A                   
 000A                   .dbline 14
 000A           ;               "mov r31,r17\n"
 000A           ;               "out 0x3b,r18\n");                              /*将页地址放入Z寄存器和RAMPZ的Bit0中*/
 000A           ; 
 000A           ;       SPMCSR = code;                          /*寄存器SPMCSR中为操作码*/
 000A 0C80              ldd R0,y+4
 000C 00926800          sts 104,R0
 0010                   .dbline 15
 0010           ;       asm("spm\n");                           /*对指定Flash页进行操作 */
 0010 E895              spm
 0012                   
 0012                   .dbline -2
 0012           L1:
 0012 2496              adiw R28,4
 0014                   .dbline 0 ; func end
 0014 0895              ret
 0016                   .dbsym l code 4 c
 0016                   .dbsym l pageAddr 0 l
 0016                   .dbend
 0016                   .dbfunc e boot_page_fill _boot_page_fill fV
 0016           ;           data -> R18,R19
 0016           ;        address -> R16,R17
                        .even
 0016           _boot_page_fill::
 0016                   .dbline -1
 0016                   .dbline 19
 0016           ; }
 0016           ; 
 0016           ; /*填充Flash缓冲页中的一个字*/
 0016           ; void boot_page_fill(unsigned int address,unsigned int data) {
 0016                   .dbline 21
 0016           ; 
 0016           ;       asm("mov r30,r16\n"
 0016 E02F              mov r30,r16
 0018 F12F              mov r31,r17
 001A 022E              mov r0,r18
 001C 132E              mov r1,r19
 001E                   
 001E                   .dbline 25
 001E           ;               "mov r31,r17\n"                         /*Z寄存器中为填冲页内地址*/
 001E           ;               "mov r0,r18\n"
 001E           ;               "mov r1,r19\n");                        /*R0R1中为一个指令字*/
 001E           ;       SPMCSR = (1 << SPMEN);                                  /*SPM使能位*/
 001E 81E0              ldi R24,1
 0020 80936800          sts 104,R24
 0024                   .dbline 26
 0024           ;       asm("spm\n");                                                   /*执行SPM操作*/
 0024 E895              spm
 0026                   
 0026                   .dbline -2
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbsym r data 18 i
 0028                   .dbsym r address 16 i
 0028                   .dbend
 0028                   .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
                        .even
 0028           _wait_page_rw_ok::
 0028                   .dbline -1
 0028                   .dbline 30
 0028           ; }
 0028           ; 
 0028           ; /*等待一个Flash页的写完成 */
 0028           ; void wait_page_rw_ok(void) {
 0028 08C0              xjmp L5
 002A           X0:
 002A                   .dbline 32
 002A           ; 
 002A           ;       while (SPMCSR & (1 << RWWSB)) {                 /*等待忙信号*/
 002A           L7:
 002A                   .dbline 33
 002A           L8:
 002A                   .dbline 33
 002A 20906800          lds R2,104
 002E 20FC              sbrc R2,0
 0030 FCCF              rjmp L7
 0032                   .dbline 34
 0032 81E1              ldi R24,17
 0034 80936800          sts 104,R24
 0038                   .dbline 35
 0038 E895              spm
 003A                   
 003A                   .dbline 36
 003A           L5:
 003A                   .dbline 32
 003A 20906800          lds R2,104
 003E 26FC              sbrc R2,6
 0040 F4CF              rjmp L8
 0042                   .dbline -2
 0042           L3:
 0042                   .dbline 0 ; func end
 0042 0895              ret
 0044                   .dbend
 0044                   .dbfunc e write_lock_bits _write_lock_bits fV
 0044           ;            val -> R16
                        .even
 0044           _write_lock_bits::
 0044                   .dbline -1
 0044                   .dbline 40
 0044           ;               while (SPMCSR & (1 << SPMEN));          /*等待EN信号完成*/
 0044           ;               SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
 0044           ;               asm("spm\n");                                           /*执行SPM操作*/
 0044           ;               }
 0044           ; } 
 0044           ; 
 0044           ; /*写锁定位*/
 0044           ; void write_lock_bits (unsigned char val) {
 0044                   .dbline 42
 0044           ; 
 0044           ;       asm("mov r0,r16\n");
 0044 002E              mov r0,r16
 0046                   
 0046                   .dbline 43
 0046           ;       SPMCSR=(1 << BLBSET) | (1 << SPMEN);
 0046 89E0              ldi R24,9
 0048 80936800          sts 104,R24
 004C                   .dbline 44
 004C           ;       asm("spm\n");
 004C E895              spm
 004E                   
 004E           L11:
 004E                   .dbline 45
 004E           L12:
 004E                   .dbline 45
 004E           ;       while (SPMCSR & (1 << SPMEN));                  /*等待EN信号完成*/
 004E 20906800          lds R2,104
 0052 20FC              sbrc R2,0
 0054 FCCF              rjmp L11
 0056                   .dbline 46
 0056           ;       SPMCSR = (1 << RWWSRE) | (1 << SPMEN);  /*SPM读使能*/
 0056 81E1              ldi R24,17
 0058 80936800          sts 104,R24
 005C                   .dbline 47
 005C           ;       asm("spm\n"); 
 005C E895              spm
 005E                   
 005E                   .dbline -2
 005E           L10:
 005E                   .dbline 0 ; func end
 005E 0895              ret
 0060                   .dbsym r val 16 c
 0060                   .dbend
 0060                   .dbfunc e read_program_memory _read_program_memory fc
 0060           ;            cmd -> R18
 0060           ;           addr -> R16,R17
                        .even
 0060           _read_program_memory::
 0060                   .dbline -1
 0060                   .dbline 60
 0060           ; }
 0060           ; 
 0060           ; /**********************************************************************
 0060           ; functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
 0060           ; description: 返回addr地址数据,以字节为单位
 0060           ; cmd:
 0060           ; 0:读flashrom
 0060           ; 1:读熔丝位或者锁定位 
 0060           ; addr=0x0001           锁定位
 0060           ; addr=0x0000           熔丝位低字节
 0060           ; addr=0x0003   熔丝位高字节
 0060           ; **********************************************************************/
 0060           ; unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {
 0060                   .dbline 62
 0060           ; 
 0060           ;       asm("mov r30,r16\n"
 0060 E02F              mov r30,r16
 0062 F12F              mov r31,r17
 0064                   
 0064                   .dbline 64
 0064           ;               "mov r31,r17\n");
 0064           ;       if (cmd) {
 0064 2223              tst R18
 0066 19F0              breq L15
 0068                   .dbline 64
 0068                   .dbline 65
 0068           ;               SPMCSR=(1 << BLBSET) | (1 << SPMEN);
 0068 89E0              ldi R24,9
 006A 80936800          sts 104,R24
 006E                   .dbline 66
 006E           ;               }
 006E           L15:
 006E                   .dbline 67
 006E           ;       asm("lpm r0,z\n");
 006E 0490              lpm r0,z
 0070                   
 0070                   .dbline 68
 0070           ;       return(R0);
 0070 00910000          lds R16,0
 0074                   .dbline -2
 0074           L14:
 0074                   .dbline 0 ; func end
 0074 0895              ret
 0076                   .dbsym r cmd 18 c
 0076                   .dbsym r addr 16 i
 0076                   .dbend

⌨️ 快捷键说明

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