📄 flashmcu.a30
字号:
;---------------------------------------------------------------------------
;project name: MPIP-16B3
;writed by gxye on March 30th 2005.
;copyright 2005 castelecom
;flash.a30 : software rewrite program
;this program is running when mcu need rewrite itself.
;before enter this program ,pls. sure that watchdog is stop.
;source code is placed in extern RAM(128k).
;
;---------------------------------------------------------------------------
; RAM from 1000H
scode_addr_low .equ 1000H
scode_addr_high .equ 1002H
dcode_addr_low .equ 1004H
dcode_addr_high .equ 1006H
wcode_size .equ 1008H
wcode_counter .equ 100aH
temp_a0 .equ 100cH
temp_a1 .equ 100eH
src_code_sn .equ 1010H ;系列号15位,占用空间16个字节
dst_code_sn .equ 1020H ;同上
src_code_crc .equ 1030H
dst_code_crc .equ 1032H
temp_r0 .equ 1034H
temp_r1 .equ 1036H
;---------------------------------------------------------------------------
; SFR
FMR0 .EQU 03B7H
FMR0_0 .BTEQU 0, FMR0
FMR0_1 .BTEQU 1, FMR0
FMR0_2 .BTEQU 2, FMR0
FMR0_3 .BTEQU 3, FMR0
FMR0_4 .BTEQU 4, FMR0
FMR0_5 .BTEQU 5, FMR0
FMR0_6 .BTEQU 6, FMR0
FMR0_7 .BTEQU 7, FMR0
FMR1 .EQU 03B6H
FMR1_0 .BTEQU 0, FMR1
FMR1_1 .BTEQU 1, FMR1
FMR1_2 .BTEQU 2, FMR1
FMR1_3 .BTEQU 3, FMR1
FMR1_4 .BTEQU 4, FMR1
FMR1_5 .BTEQU 5, FMR1
FMR1_6 .BTEQU 6, FMR1
FMR1_7 .BTEQU 7, FMR1
PM0 .EQU 0004H
PM0_0 .BTEQU 0, PM1
PM0_1 .BTEQU 1, PM1
PM0_2 .BTEQU 2, PM1
PM0_3 .BTEQU 3, PM1
PM0_4 .BTEQU 4, PM1
PM0_5 .BTEQU 5, PM1
PM0_6 .BTEQU 6, PM1
PM0_7 .BTEQU 7, PM1
PM1 .EQU 0005H
PM1_0 .BTEQU 0, PM1
PM1_1 .BTEQU 1, PM1
PM1_2 .BTEQU 2, PM1
PM1_3 .BTEQU 3, PM1
PM1_4 .BTEQU 4, PM1
PM1_5 .BTEQU 5, PM1
PM1_6 .BTEQU 6, PM1
PM1_7 .BTEQU 7, PM1
CM0 .EQU 0006H
CM0_0 .BTEQU 0, CM0
CM0_1 .BTEQU 1, CM0
CM0_2 .BTEQU 2, CM0
CM0_3 .BTEQU 3, CM0
CM0_4 .BTEQU 4, CM0
CM0_5 .BTEQU 5, CM0
CM0_6 .BTEQU 6, CM0
CM0_7 .BTEQU 7, CM0
PRCR .EQU 000AH
PRCR_0 .BTEQU 0, PRCR
PRCR_1 .BTEQU 1, PRCR
PRCR_2 .BTEQU 2, PRCR
PRCR_3 .BTEQU 3, PRCR
PRCR_4 .BTEQU 4, PRCR
PRCR_5 .BTEQU 5, PRCR
PRCR_6 .BTEQU 6, PRCR
PRCR_7 .BTEQU 7, PRCR
TABSR .EQU 0380H
TABSR_0 .BTEQU 0, TABSR
TABSR_1 .BTEQU 1, TABSR
TABSR_2 .BTEQU 2, TABSR
TABSR_3 .BTEQU 3, TABSR
TABSR_4 .BTEQU 4, TABSR
TABSR_5 .BTEQU 5, TABSR
TABSR_6 .BTEQU 6, TABSR
TABSR_7 .BTEQU 7, TABSR
DBR .EQU 000BH
WDTS .EQU 000EH
U1TB .EQU 03AAH
U1RB .EQU 03AEH
U1BRG .EQU 03A9H
U1MR .EQU 03A8H
U1C0 .EQU 03ACH
U1C1 .EQU 03ADH
;------------------------------------------------------------------------
;soft command for internal flash operate
;
ERASE_BLOCK_CMD .EQU 0020H
READ_STATUS_CMD .EQU 0070H
OPERATE_ACK_CMD .EQU 00D0H
ERASE_ALL_CMD .EQU 00A7H
PROGRAM_CMD .EQU 0040H
PROGRAM_LOCK_CMD .EQU 0077H
;
;------------------------------------------------------------------------
;internal flash block address
;
FLASH_BLOCK_4 .EQU 0E0000H ;64k
FLASH_BLOCK_3 .EQU 0F0000H ;32k
FLASH_BLOCK_2 .EQU 0F8000H ;24k
FLASH_BLOCK_1 .EQU 0FE000H ;4k
FLASH_BLOCK_0 .EQU 0FF000H ;4k
;------------------------------------------------------------------------
;16B2 test board hardware address ,it will be changed for 16b3
;
PROCESS_HINT .EQU 2800H
TEST_BUFFER .EQU 1080H
FRESH_CODE .EQU 80000H ;36000H
;80000
.glb start
.glb _get_char
.section _FlashMCU, CODE
.org FLASH_BLOCK_1 ;block 1 in internal flash
; .BYTE "Hi, welcome to MPIP-06B1",0dH,0aH,00H ;0
.BYTE "MPIP-06B1V1.0.8",00H ;software sn
.BYTE "Begin to erase ...",0dH,0aH,00H ;1
.BYTE "Erase OK",0dH,0aH,00H ;2
.BYTE "Begin to program ...",0dH,0aH,00H ;3
.BYTE "Program OK",0dH,0aH,00H ;4
.BYTE "Erase error",0dH,0aH,00H ;5
.BYTE "Program error",0dH,0aH,00H ;6
.org 0FE080H
_start_flash:
FCLR I
BCLR TABSR_0
; BSET PRCR_1
; BSET PM0_0
; BCLR PM0_1
; BSET PM1_4
; BSET PM1_5 ; //set to mode 2
; BCLR PRCR_1
MOV.B #00, DBR
MOV.B #0, R0L
MOVA scode_addr_low, A1
MOV.W #100H, R3
SSTR.B ;clear 0 for this ram 1000H ~ 103FH
JSR.W _init_uart1
MOV.B #1, R1L
JSR.W _show_hint
;
BSET PM1_7 ;select internal wait state
FCLR I ;disable interrupt
BCLR FMR0_1
BSET FMR0_1 ;enter mcu rewrite mode.
;
BCLR FMR0_2
BSET FMR0_2 ;disable lock bit
;
; JSR.W _get_char
;
JSR.W _erase_all
;
BTST FMR0_7
JZ _erase_ok
;
MOV.B #5, R1L
JSR.W _show_hint
BSET FMR0_3
BSET PM0_3
JMP.A start
_erase_ok:
MOV.B #2, R1L
JSR.W _show_hint
; JSR.W _get_char
;----only for test------
; MOV.W #400H, a0
; ADD.W #400H, a0
; ADD.W #400H, a0
MOV.B #3, R1L
JSR.W _show_hint
_start_prg:
MOV.W #0000H, scode_addr_low
MOV.W #0008H, scode_addr_high
MOV.W #0000H, dcode_addr_low
MOV.W #000EH, dcode_addr_high
MOV.W #512, wcode_size ;512blockfor 256bytes
MOV.W #0, wcode_counter ;zero for counter
_program_next:
JSR.W _program_block
; MOV.B wcode_counter, R0L
; JSR.W _put_char
INC.B wcode_counter
ADD.W #256, scode_addr_low
ADCF.B scode_addr_high
ADD.W #256, dcode_addr_low
ADCF.B dcode_addr_high
SUB.W #1, wcode_size
JNZ _program_next ;program 256 bin code to internal flash
BTST FMR0_6
JZ _program_ok
MOV.B #6, R1L
JSR.W _show_hint
;do something if error
;
;
JMP.W _start_prg
_program_ok:
MOV.B #4, R1L
JSR.W _show_hint
MOV.B #55H, R0L
JSR.W _put_char
; JSR.W _get_char
;do verify if correct and send some hint infomation
;
_reset_mcu:
JSR.W _reset
RTS
_reset:
;-------------------------------------------for m30620A
BCLR FMR1_3
BSET FMR1_3 ;close flash power off
NOP ;by lrx
NOP ;by lrx
NOP ;by lrx
NOP ;by lrx
;by lrx
BCLR FMR1_3 ;turn flash power on by lrx
; BSET PRCR_1
; BSET CM0_7
; BSET CM0_5 ;close xin
; BCLR PRCR_1
; NOP
; NOP
; NOP ;in low speed dispite mode
; NOP
; BSET PRCR_1
; BCLR CM0_7
; BCLR CM0_5 ;open xin
; BCLR PRCR_1
;
; BCLR FMR1_3 ;turn flash power on
; NOP
; NOP
; NOP
; NOP ;in low speed dispite mode
BSET PRCR_1
BCLR PM0_3
BSET PM0_3
BCLR PRCR_1 ;reset mcu
NOP
NOP
NOP
NOP ;
_wait_dog:
NOP
JMP _wait_dog
RTS
;----------------------------------------------------------------------------
; MOV.W #0E000H, A0
; MOV.W #0000FH, A1
; MOV.W #00FFH, R0
; STE.W R0, [A1A0]
; JSR.W _wait_busy
; LDE.W [A1A0], R0
;
; BCLR FMR0_3
; BSET FMR0_3
; MOV.W #7FFFH, R0
;_wait_1ms:
; NOP
; NOP
; SUB.W #1, R0
; JNZ _wait_1ms
; BCLR FMR0_1
; MOV.B #5AH, R0L
; JSR.W _put_char
;
; BSET PRCR_1
; BCLR PM0_3
; BSET PM0_3
; BCLR PRCR_1
; JMP.A 0FFFFCH
;----------------------------------------------------n30620N over
;----------------------------------------------------m30620a begin
;
;
;----test end----
;end
;-----------------------------------------------------------------------
;_wait_busy: wait flash operate over then busy bit is changed to 1.
;
_wait_busy:
MOV.W #01H, WDTS
BTST FMR0_0 ;RY?BY staus check
JNC _wait_busy
rts
;------------------------------------------------------------------------
;_erase_block: erase a block which people want to program before.
;input: even address of the maxim address of block, the address is in [A1A0]
;caution: R0 is used
;
_erase_block:
NOP
MOV.W #ERASE_BLOCK_CMD, R0
STE.W R0, [A1A0]
MOV.W #OPERATE_ACK_CMD, R0
STE.W R0, [A1A0]
JSR _wait_busy
rts
;-------------------------------------------------------------------------
;_erase_all: erase all blocks before people want to program
;input: null
;caution: R0 is used
;
_erase_all:
NOP
MOV.W #ERASE_ALL_CMD, R0
STE.W R0, FLASH_BLOCK_0
MOV.W #OPERATE_ACK_CMD, R0
STE.W R0, FLASH_BLOCK_0
JSR _wait_busy
rts
;-------------------------------------------------------------------------
;_read_status: read flash operate status
;output: the status is in R0L register
;
_read_status:
NOP
MOV.W #READ_STATUS_CMD, R0
STE.W R0, FLASH_BLOCK_0
LDE.W FLASH_BLOCK_0, R0
rts
;-------------------------------------------------------------------------
;_program_block: program from source address to flash special block
;input: scode_addr_low & scode_addr_high : source address extern ram
; dcode_addr_low & dcode_addr_high : dest address flash
; wcode_counter : how many words to program
;
_program_block:
NOP
MOV.W scode_addr_low, A0
MOV.W scode_addr_high,A1
MOV.W A0, temp_a0
MOV.W A1, temp_a1
MOV.W dcode_addr_low, temp_r0
MOV.W dcode_addr_high,temp_r1
MOV.W #256, R3
;
;--------------------------------------------this code is for M30620N series
;.IF M30620N == 1
_program_step:
MOV.W temp_a0, A0
MOV.W temp_a1, A1 ;get source code address
LDE.W [A1A0], R0 ;get source code
MOV.W temp_r0, A0
MOV.W temp_r1, A1 ;get dst code address
JSR _wait_busy
MOV.W #PROGRAM_CMD, R1
STE.W R1, [A1A0] ;send command
JSR _wait_busy
STE.W R0, [A1A0] ;program to flash
ADD.W #2, temp_a0
ADCF.B temp_a1
ADD.W #2, temp_r0
ADCF.B temp_r1
SUB.W #2, R3 ;adjust address pointer and counter
JNZ _program_step
;
JSR _wait_busy
RTS
;--------------------------------------------over-----
;--------------------------------------------next code is for M30620A series
;
;_program_step:
; MOV.W temp_r0, A0
; MOV.W temp_r1, A1 ;get dst code address
; JSR _wait_busy
; MOV.W #41H, R1 ;page program
; STE.W R1, [A1A0] ;send command
;_program_loop:
; MOV.W #01H, WDTS
; MOV.W temp_a0, A0
; MOV.W temp_a1, A1 ;get source code address
; LDE.W [A1A0], R0 ;get source code
; MOV.W temp_r0, A0
; MOV.W temp_r1, A1 ;get dst code address
; JSR _wait_busy
; STE.W R0, [A1A0] ;program to flash
;
; ADD.W #2, temp_a0
; ADCF.B temp_a1
; ADD.W #2, temp_r0
; ADCF.B temp_r1
; SUB.W #2, R3 ;adjust address pointer and counter
; JNZ _program_loop
; ;
; JSR _wait_busy
; RTS
;-------------------------------------------------------------------------------
;_init_uart1: init uart1 paramer for MMI
;
_init_uart1:
FCLR I ;关中断
MOV.B #05H, U1MR ;8bit,1stop,nocheck,
MOV.B #10H, U1C0 ;no flow control(disable cts/rts)
MOV.B #05H, U1C1 ;enable send & receive
MOV.B #0AH, U1BRG ;波特率57600
RTS
;-------------------------------------------------------------------------------
;_show_hint: send some hints about process from UART1 to PC
;input : a0: address, R1L: index
;caution : string must be terminate by '\0'
;
_show_hint:
NOP
MOV.W #PROCESS_HINT, A0
AND.B #0FFH, R1L
JZ _wait_sover
_wait_null:
MOV.W #01H, WDTS
MOV.B [A0], R0L
INC.W A0
AND.B #0FFH, R0L
JNZ _wait_null
SUB.B #1, R1L
JNZ _wait_null
_wait_sover:
MOV.W #01H, WDTS
MOV.B U1C1, R0L
AND.B #02H, R0L
JZ _wait_sover
MOV.B [A0], R0L
MOV.B R0L, U1TB
INC.W A0
AND.B #0FFH, R0L
JNZ _wait_sover
RTS
;-------------------------------------------------------------------------------
;_get_char: receive one byte data from UART1 to MCU
;output : R0: data
;
;
_get_char:
NOP
_wait_data:
MOV.W #01H, WDTS
MOV.B U1C1, R0L
AND.B #08H, R0L
JZ _wait_data
MOV.B U1RB, R0L
RTS
;-------------------------------------------------------------------------------
;_put_char: receive one byte data from UART1 to MCU
;input : R0L: data, ROH is used
;
;
_put_char:
NOP
_wait_send:
MOV.W #01H, WDTS
MOV.B U1C1, R0H
AND.B #02H, R0H
JZ _wait_send
MOV.B R0L, U1TB
RTS
;-------------------------------------------------------------------------------
;
;
;
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -