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

📄 flashmcu.a30

📁 名厂车载GPS通信终端
💻 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 + -