📄 st39vf040.asm
字号:
//========================================================================================
// Progarm: ST39VF040.asm
// By: renjianhe
// IOA0-IOA7 ==> DB0-DB7
// IOA8-IOA15==> Addr8 -Addr15
// IOB0-IOB2 ==> Addr16-Addr18
// IOB12-IOB15 ==> ALE+OE+WE+CE ALE高电平使能
//========================================================================================
.INCLUDE SPCE061A.inc
.DEFINE AE_BIT_DIS 0x1000
.DEFINE RE_BIT_DIS 0x2000
.DEFINE WE_BIT_DIS 0x4000
.DEFINE CE_BIT_DIS 0x8000
//////////////////////////////////////////////
//ST39VF040 command
/////////////////////////////////////////////
.data
Software_bytewrite_addr: .dw 0x5555,0x2aaa,0x5555
Software_bytewrite_data: .dw 0x00aa,0x0055,0x00a0
Software_chiperase_addr: .dw 0x5555,0x2aaa,0x5555,0x5555,0x2aaa,0x5555
Software_chiperase_data: .dw 0x00aa,0x0055,0x0080,0x00aa,0x0055,0x0010
Software_sectorerase_addr: .dw 0x5555,0x2aaa,0x5555,0x5555,0x2aaa
Software_sectorerase_data: .dw 0x00aa,0x0055,0x0080,0x00aa,0x0055
.IRAM
.VAR Read_Byte=0
.VAR Read_Byte2=0
.VAR Write_Byte=0
.PUBLIC _ERASE_ST39VF040
.PUBLIC _ERASE_ST39VF040_Sector
.PUBLIC _Write_ST39VF040_One_Word
.PUBLIC _Read_ST39VF040_One_Word
.CODE
//----------------------------------------------------------------------
_ERASE_ST39VF040_Sector:
PUSH bp TO [SP]
R5 = SP
R4 = [R5 + 4] //get AddrL
R5 = 0x0000
Chip_SectorErase:
R1 = R5 + Software_sectorerase_addr
R3 = R5 + Software_sectorerase_data
R1 = [R1] //get LOW address
R3 = [R3] //get data
R2 = 0x0000 //get HIGH address
call Write_ST39VF040_One_Byte;
R5 = R5 + 1
CMP R5,5
JNE Chip_SectorErase
R2=R4 LSR 4;
R1=R4 & 0x000F
R1=R1 LSL 4;
R1=R1 LSL 4;
R1=R1 LSL 4;
R3= 0x0030;
call Write_ST39VF040_One_Byte;
// CALL Delay100uS //delay 100us
POP bp FROM [SP]
RETF
//......................................................................
_ERASE_ST39VF040:
PUSH bp TO [SP]
R5 = 0x0000
Chip_MassErase_L:
R1 = R5 + Software_chiperase_addr
R3 = R5 + Software_chiperase_data
R1 = [R1] //get LOW address
R3 = [R3] //get data
R2 = 0x0000 //get HIGH address
call Write_ST39VF040_One_Byte;
R5 = R5 + 1
CMP R5,6
JNE Chip_MassErase_L
CALL Delay11ms //delay 10ms
POP bp FROM [SP]
RETF
//----------------------------------------------------------------------
ProtectDisable:
PUSH R1,R5 TO [SP]
R5 = 0x0000
Chip_Protect_L:
R1 = R5 + Software_bytewrite_addr
R3 = R5 + Software_bytewrite_data
R1 = [R1] //get LOW address
R3 = [R3] //get data
R2 = 0x0000 //get HIGH address
call Write_ST39VF040_One_Byte;
R5 = R5 + 1
CMP R5,3
JNE Chip_Protect_L
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------------------
_Write_ST39VF040_One_Word:
PUSH R1,R5 TO [SP]
R5 = SP
R1 = [R5 + 8] //get AddrL
R2 = [R5 + 9] //get AddrH
R3 = [R5 + 10] //get Data
R4 = [R5 + 10]
[Write_Byte]=R4
R3=R4&0x00FF;
CALL ProtectDisable
CALL Write_ST39VF040_One_Byte
CMP R1,0xFFFF;
JNE Inc_WriteAddr;
r1=0;
r2+=1;
jmp WriteNextByte;
Inc_WriteAddr:
r1+=1;
WriteNextByte:
R4=[Write_Byte]
R3=R4 LSR 4;
R3=R3 LSR 4;
CALL Delay200uS
CALL ProtectDisable
CALL Write_ST39VF040_One_Byte;
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------------------
Write_ST39VF040_One_Byte:
PUSH R1,R5 TO [SP];
R4 = [P_IOB_Data]
R4 &= 0x0FFF
R4 |= (AE_BIT_DIS|RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
R4 &= 0xFFF8
R4 |= R2
[P_IOB_Data] = R4 //write AddrH
[P_IOA_Data] = R1 //write AddrL
R4 &= 0x0FFF
R4 |= (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=0,CE=1,WE=1,OE=1
[P_IOB_Data] = R4 //change to data
R1 &=0xFF00
R1 |=R3
[P_IOA_Data] = R1 //data output
R4 &= 0x0FFF
R4 |= (RE_BIT_DIS) //ALE=0,CE=0,WE=0,OE=1
[P_IOB_Data] = R4
CALL Delay100uS
R4 &= 0x0FFF
R4 |= (AE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS|RE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
[P_IOB_Data] = R4
POP R1,R5 FROM [SP];
RETF
//----------------------------------------------------------------------
_Read_ST39VF040_One_Word:
PUSH R2,R5 TO [SP]
R5 = SP
R1 = [R5 + 7] // [AddrL] = R1
R2 = [R5 + 8] // [AddrH] = R2
CALL Read_ST39VF040_One_Byte;
R3 = [Read_Byte]; //read Data
[Read_Byte2]=R3;
CMP R1,0xFFFF;
JNE INC_Addr;
R1=0x0000;
R2+=1;
jmp GetNextByte;
INC_Addr:
R1+=1;
GetNextByte:
CALL Read_ST39VF040_One_Byte;
R1=[Read_Byte];
R1=R1 LSL 4;
R1=R1 LSL 4;
R1+=[Read_Byte2];
POP R2,R5 FROM [SP]
RETF
//----------------------------------------------------------------------
Read_ST39VF040_One_Byte:
PUSH R1,R5 TO [SP]
R4 = [P_IOB_Data]
R4 &= 0x0FFF
R4 |= (AE_BIT_DIS|RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
R4 &= 0xFFF8
R4 |= R2
[P_IOB_Data] = R4 //write AddrH
[P_IOA_Data] = R1 //write AddrL
R4 &= 0x0FFF
R4 |= (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=0,CE=1,WE=1,OE=1
[P_IOB_Data] = R4 //change to data
R5 = [P_IOA_Dir]
R5 &= 0xFF00
[P_IOA_Dir] = R5
R4 &= 0x0FFF
R4 |= (WE_BIT_DIS) //ALE=0,CE=0,WE=1,OE=0
[P_IOB_Data] = R4
R5=0x0001
[P_Watchdog_Clear] = R5
R1 = [P_IOA_Data] //get data
R1 &= 0x00FF
[Read_Byte] = R1;
R5 = [P_IOA_Dir]
R5 |= 0x00FF
[P_IOA_Dir] = R5
R4 &= 0x0FFF
R4 |= (AE_BIT_DIS|WE_BIT_DIS|RE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
[P_IOB_Data] = R4
POP R1,R5 FROM [SP]
RETF
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
Delay11ms:
push r1,r1 to [sp];
//r1=17*10;
r1=20*20; // delay
L_LoopDelay11:
call Delay100uS;
r1-=1;
jne L_LoopDelay11
pop r1,r1 from [sp];
retf;
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
Delay200uS:
push r1 to [sp]; //7
r1=100; //6
L_DelayLoop2:
r1-=1; //3
jne L_DelayLoop2; //5
pop r1 from [sp]; //7
retf; //12
Delay100uS:
push r1 to [sp]; //7
r1=50; //6
L_DelayLoop:
r1-=1; //3
jne L_DelayLoop; //5
pop r1 from [sp]; //7
retf;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -