?? main.s
字號:
.module main.c
.area text(rom, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\main.c
.area data(ram, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\main.c
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\main.c
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\para.h
.dbsym e flag _flag c
.area bss(ram, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\para.h
L2:
.blkb 2
.area text(rom, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\para.h
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\main.c
.dbfunc e main _main fV
.dbsym s msgCounter L2 i
; rec_data -> R20
.even
_main::
.dbline -1
.dbline 40
; /****************************************Copyright (c)**************************************************
; **
; ** 小松工程出品 ilan2003@163.com 2006-1-30
; **
; ** 文 件 名: main.c
; ** 描 述: M16_BOOTLOADER
; ** 版 本: V1.0
; ** 主 控 芯 片: M16 晶振頻率:7.3728MHZ, 波特率115200
; ** 編 譯 環 境:ICCAVR 6.31A
;
; 描 述:使用STK500_2 協議的bootloader,監控芯片 M16,數據通訊RS232
; 已經非常精簡的使用STK500_2 協議的MEGA16的bootloader.使用
; ATMEL AVRStudio 4.xx STK500工具的進行軟件升級。
;
; 本軟件適合于個人學習,用于商業用途建議加加密措施
;
; 注意事項:在升級firmware后,進行verify,總是出錯,這是正常現象
; 因為升級的firmware文件不含bootloader程序,而verify時將讀取整片
; flash的內容,所以總是校驗出錯。如果你不放心,讀取flash的內容和
; 你燒寫的firmware對比一下,看看哪里不一致就是了。
;
; 大家看看有沒有什么寫的不好的地方,請提出寶貴的意見!
;
; **********************************************************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <string.h>
; #include "define.h"
; #include "function.h"
; #include "command.h"
; #include "para.h"
;
;
;
; /**********************************************************************
; functionName:void main(void)
; description:主函數
; **********************************************************************/
; void main(void)
; {
.dbline 43
; uint08 rec_data;
; static uint16 msgCounter;
; allInit();
xcall _allInit
xjmp L4
L3:
.dbline 45
; while(1)
; {
.dbline 46
; rec_data=getChar();
xcall _getChar
mov R20,R16
.dbline 47
; if(statusMachine == ST_START)
lds R24,_statusMachine
cpi R24,240
brne L6
.dbline 48
; {
.dbline 49
; flag = 1;
ldi R24,1
sts _flag,R24
.dbline 50
; TCCR1B = 0x00;
clr R2
out 0x2e,R2
.dbline 51
; if(rec_data==MESSAGE_START)
cpi R16,27
breq X1
xjmp L7
X1:
.dbline 52
; {
.dbline 53
; statusMachine = ST_GET_SEQ_NUM;
ldi R24,241
sts _statusMachine,R24
.dbline 54
; checkSum = MESSAGE_START;
ldi R24,27
sts _checkSum,R24
.dbline 55
; }
.dbline 56
; }
xjmp L7
L6:
.dbline 57
; else if(statusMachine == ST_GET_SEQ_NUM)
lds R24,_statusMachine
cpi R24,241
brne L10
.dbline 58
; {
.dbline 59
; seqNumber = rec_data;
sts _seqNumber,R20
.dbline 60
; checkSum ^= rec_data;
lds R2,_checkSum
eor R2,R20
sts _checkSum,R2
.dbline 61
; statusMachine = ST_MSG_SIZE_1;
ldi R24,242
sts _statusMachine,R24
.dbline 62
; }
xjmp L11
L10:
.dbline 63
; else if(statusMachine == ST_MSG_SIZE_1)
lds R24,_statusMachine
cpi R24,242
brne L12
.dbline 64
; {
.dbline 65
; msgSize = rec_data;
mov R2,R20
clr R3
sts _msgSize+1,R3
sts _msgSize,R2
.dbline 66
; msgSize <<=8;
mov R3,R2
clr R2
sts _msgSize+1,R3
sts _msgSize,R2
.dbline 67
; checkSum ^= rec_data;
lds R2,_checkSum
eor R2,R20
sts _checkSum,R2
.dbline 68
; statusMachine = ST_MSG_SIZE_2;
ldi R24,243
sts _statusMachine,R24
.dbline 69
; }
xjmp L13
L12:
.dbline 70
; else if(statusMachine == ST_MSG_SIZE_2)
lds R24,_statusMachine
cpi R24,243
brne L14
.dbline 71
; {
.dbline 72
; msgSize |= rec_data;
mov R2,R20
clr R3
lds R4,_msgSize
lds R5,_msgSize+1
or R4,R2
or R5,R3
sts _msgSize+1,R5
sts _msgSize,R4
.dbline 73
; checkSum ^= rec_data;
lds R2,_checkSum
eor R2,R20
sts _checkSum,R2
.dbline 74
; statusMachine = ST_GET_TOKEN;
ldi R24,244
sts _statusMachine,R24
.dbline 75
; }
xjmp L15
L14:
.dbline 76
; else if(statusMachine == ST_GET_TOKEN)
lds R24,_statusMachine
cpi R24,244
brne L16
.dbline 77
; {
.dbline 78
; if(rec_data==TOKEN)
cpi R20,14
brne L18
.dbline 79
; {
.dbline 80
; checkSum ^= rec_data;
lds R2,_checkSum
eor R2,R20
sts _checkSum,R2
.dbline 81
; statusMachine = ST_GET_DATA;
ldi R24,245
sts _statusMachine,R24
.dbline 82
; msgCounter=0;
clr R2
clr R3
sts L2+1,R3
sts L2,R2
.dbline 83
; }
xjmp L17
L18:
.dbline 85
; else
; {
.dbline 86
; statusMachine = ST_START;
ldi R24,240
sts _statusMachine,R24
.dbline 87
; }
.dbline 88
; }
xjmp L17
L16:
.dbline 89
; else if(statusMachine == ST_GET_DATA)
lds R24,_statusMachine
cpi R24,245
brne L20
.dbline 90
; {
.dbline 91
; msg_buffer[msgCounter++]=rec_data;
lds R2,L2
lds R3,L2+1
movw R24,R2
adiw R24,1
sts L2+1,R25
sts L2,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R20
.dbline 92
; checkSum ^= rec_data;
lds R2,_checkSum
eor R2,R20
sts _checkSum,R2
.dbline 93
; if(msgCounter==msgSize)
lds R2,_msgSize
lds R3,_msgSize+1
lds R4,L2
lds R5,L2+1
cp R4,R2
cpc R5,R3
brne L21
.dbline 94
; {
.dbline 95
; statusMachine = ST_GET_CHECK;
ldi R24,246
sts _statusMachine,R24
.dbline 96
; }
.dbline 97
; }
xjmp L21
L20:
.dbline 98
; else if(statusMachine == ST_GET_CHECK)
lds R24,_statusMachine
cpi R24,246
brne L24
.dbline 99
; {
.dbline 100
; if(rec_data == checkSum)
lds R2,_checkSum
cp R20,R2
brne L26
.dbline 101
; {
.dbline 102
; packageProcess(seqNumber);
lds R16,_seqNumber
xcall _packageProcess
.dbline 103
; }
L26:
.dbline 104
; statusMachine = ST_START;
ldi R24,240
sts _statusMachine,R24
.dbline 105
; }
L24:
L21:
L17:
L15:
L13:
L11:
L7:
.dbline 106
L4:
.dbline 44
xjmp L3
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r rec_data 20 c
.dbend
.dbfunc e packageProcess _packageProcess fV
; temp16 -> R10,R11
; start_address -> y+2
; cmd -> R14
; tmp -> y+8
; num_bytes -> y+6
; i -> R12,R13
; seqNum -> y+19
.even
_packageProcess::
st -y,r17
st -y,r16
xcall push_gset5
sbiw R28,9
.dbline -1
.dbline 117
; }
; }
;
;
;
;
; /**********************************************************************
; functionName:void packageProcess(uint08 seqNum)
; description:數據包的處理過程
; **********************************************************************/
; void packageProcess(uint08 seqNum)
; {
.dbline 119
; uint08 cmd;
; uint08 tmp=0;
clr R0
std y+8,R0
.dbline 121
; uint16 i;
; uint16 num_bytes=0;
clr R1
std y+7,R1
std y+6,R0
.dbline 122
; uint32 start_address = address;
lds R2,_address
lds R3,_address+1
clr R4
clr R5
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
.dbline 124
;
; cmd = msg_buffer[0];
lds R14,_msg_buffer
.dbline 126
; //命令CMD_SIGN_ON
; if(cmd==CMD_SIGN_ON)
mov R24,R14
cpi R24,1
brne L29
.dbline 127
; {
.dbline 128
; num_bytes = 11;
ldi R24,11
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 129
; msg_buffer[0] = CMD_SIGN_ON;
ldi R24,1
sts _msg_buffer,R24
.dbline 130
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 131
; msg_buffer[2] = 8;
ldi R24,8
sts _msg_buffer+2,R24
.dbline 132
; memcpy(msg_buffer+3,"STK500_2",8);
std y+1,R25
std y+0,R24
ldi R18,<L34
ldi R19,>L34
ldi R16,<_msg_buffer+3
ldi R17,>_msg_buffer+3
xcall _memcpy
.dbline 133
; }
xjmp L30
L29:
.dbline 135
; //命令CMD_SET_PARAMETER
; else if(cmd==CMD_SET_PARAMETER)
mov R24,R14
cpi R24,2
brne L35
.dbline 136
; {
.dbline 137
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 138
; msg_buffer[0] = CMD_SET_PARAMETER;
sts _msg_buffer,R24
.dbline 139
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 140
; }
xjmp L36
L35:
.dbline 142
; //命令CMD_GET_PARAMETER
; else if(cmd==CMD_GET_PARAMETER)
mov R24,R14
cpi R24,3
brne L38
.dbline 143
; {
.dbline 144
; switch(msg_buffer[1])
lds R10,_msg_buffer+1
clr R11
movw R24,R10
cpi R24,146
ldi R30,0
cpc R25,R30
breq L44
cpi R24,148
ldi R30,0
cpc R25,R30
breq L46
cpi R24,149
ldi R30,0
cpc R25,R30
breq L47
cpi R24,146
ldi R30,0
cpc R25,R30
brlt L40
L48:
movw R24,R10
cpi R24,158
ldi R30,0
cpc R25,R30
breq L45
xjmp L40
X2:
.dbline 145
; {
L44:
.dbline 159
; /*case PARAM_BUILD_NUMBER_LOW:
; tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
; break;
; case PARAM_BUILD_NUMBER_HIGH:
; tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
; break;
; case PARAM_HW_VER:
; tmp = CONFIG_PARAM_HW_VER;
; break;
; case PARAM_SW_MAJOR:
; tmp = CONFIG_PARAM_SW_MAJOR;
; break;*/
; case PARAM_SW_MINOR:
; tmp = CONFIG_PARAM_SW_MINOR;
ldi R24,4
std y+8,R24
.dbline 160
; break;
xjmp L41
L45:
.dbline 162
; case PARAM_RESET_POLARITY:
; tmp = resetPolarity;
lds R2,_resetPolarity
std y+8,R2
.dbline 163
; break;
xjmp L41
L46:
.dbline 165
; case PARAM_VTARGET: //目標電壓
; tmp = 50;
ldi R24,50
std y+8,R24
.dbline 166
; break;
xjmp L41
L47:
.dbline 168
; case PARAM_VADJUST:
; tmp = 50; //參考電壓
ldi R24,50
std y+8,R24
.dbline 169
; break;
xjmp L41
L40:
.dbline 180
; /*case PARAM_TOPCARD_DETECT:
; tmp = TOP_CARD_STK520;
; break;
; case PARAM_CONTROLLER_INIT:
; tmp = paramControllerInit;
; break;
; case PARAM_SCK_DURATION:
; tmp = clockSpeed;
; break;*/
; default:
; tmp = CONFIG_PARAM_SW_MAJOR;
ldi R24,2
std y+8,R24
.dbline 181
; break;
L41:
.dbline 183
; }
; num_bytes = 3;
ldi R24,3
ldi R25,0
std y+7,R25
std y+6,R24
.dbline 184
; msg_buffer[0] = CMD_GET_PARAMETER;
sts _msg_buffer,R24
.dbline 185
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 186
; msg_buffer[2] = tmp;
ldd R0,y+8
sts _msg_buffer+2,R0
.dbline 187
; }
xjmp L39
L38:
.dbline 196
; //命令CMD_OSCCAL
; /*else if(cmd==CMD_OSCCAL)
; {
; num_bytes = 2;
; msg_buffer[0] = CMD_OSCCAL;
; msg_buffer[1] = STATUS_CMD_OK;
; }*/
; //命令CMD_LOAD_ADDRESS
; else if(cmd==CMD_LOAD_ADDRESS)
mov R24,R14
cpi R24,6
brne L51
.dbline 197
; {
.dbline 200
; //address = ((unsigned long)msg_buffer[1])<<24;
; //address |= ((unsigned long)msg_buffer[2])<<16;
; address = ((unsigned long)msg_buffer[3])<<8;
ldi R24,8
ldi R25,0
lds R16,_msg_buffer+3
clr R17
clr R18
clr R19
st -y,R24
xcall lsl32
sts _address+1,R17
sts _address,R16
.dbline 201
; address |= ((unsigned long)msg_buffer[4]);
lds R2,_msg_buffer+4
clr R3
clr R4
clr R5
movw R6,R16
clr R8
clr R9
or R6,R2
or R7,R3
or R8,R4
or R9,R5
sts _address+1,R7
sts _address,R6
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -