📄 asm.s43
字号:
#include "msp430x22x4.h"
;写segD,然后复制segD(1000h-103Fh)到segC(1040h-107Fh)
;对信息段A的操作,注意LOCKA位
;segD(1000h-103fh)
;segC(1040h-107fh)
;segB(1080h-10bfh)
;segA(10c0h-10ffh)
#define SEGD_START 0x1000
#define SEGC_START 0x1040
NAME main
PUBLIC main
;-----------------------------------------------------------------------------
; MSP430F22x中断向量表
;-----------------------------------------------------------------------------
ORG 0FFFEh
DC16 main
;------------------------------------------------------------------------------
RSEG CODE ; 程序开始
;------------------------------------------------------------------------------
main
MOV.W #0600H,SP ;初始化堆栈指针
stopWDT MOV.W #WDTPW+WDTHOLD,&WDTCTL ;关看门狗
MOV.B &CALBC1_1MHZ,&BCSCTL1 ;设定DCO时钟为1MHZ
MOV.B &CALDCO_1MHZ,&DCOCTL
MOV.W #SEGD_START,R4 ;将segD的首地址放在R4中,用于后面的擦除程序
CALL #erase_seg ;调用擦除程序
CALL #write_segd ;调用写程序
MOV.W #SEGC_START,R4 ;将segC的首地址放在R4中,用于后面的擦除程序
CALL #erase_seg
CALL #copy_d_to_c ;调用段复制程序
CALL #sega_operation ;调用信息段A的操作程序,跟踪程序来观察SEGA位
mainloop
JMP mainloop
;------------------------------------------------------------------------------
erase_seg
;------------------------------------------------------------------------------
MOV.W #FWKEY+FSSEL1+FN1,&FCTL2 ;flash时钟源为SMCLK,f(FTG)=SMCLK/3
MOV.W #FWKEY,&FCTL3 ;LOCK为0
MOV.W #FWKEY+ERASE,&FCTL1 ;段擦除使能
CLR.W 0(R4) ;空写用来起动flash擦除
MOV.W #FWKEY+LOCK,&FCTL3 ;LOCK为1
RET
;------------------------------------------------------------------------------
write_segd
;------------------------------------------------------------------------------
MOV.W #FWKEY,&FCTL3 ;LOCK为0
MOV.W #FWKEY+WRT,&FCTL1 ;flash写使能
MOV.B #00H,R5 ;所写初值
write_loop ;循环写入
MOV.B R5,0(R4)
INC.B R5
INC.W R4
CMP.W #1040H,R4
JNE write_loop
MOV.W #FWKEY+LOCK,&FCTL3 ;LOCK为1
RET
;------------------------------------------------------------------------------
copy_d_to_c
;------------------------------------------------------------------------------
MOV.W #FWKEY,&FCTL3
MOV.W #FWKEY+WRT,&FCTL1
MOV.W #SEGD_START,R5
copy_loop ;循环复制
MOV.B @R5+,0(R4)
INC.W R4
CMP.W #1080H,R5
JNE copy_loop
MOV.W #FWKEY+LOCK,&FCTL3
RET
;------------------------------------------------------------------------------
sega_operation
;------------------------------------------------------------------------------
;置位LOCKA位,用于保护信息段A
BIT #LOCKA,&FCTL3 ;测试LOCKA
JZ sega_unlock ;LOCKA是否为0?
MOV #FWKEY+LOCKA,&FCTL3 ;设置LOCKA为0
sega_unlock
;复位LOCKA位,用于擦写信息段A
BIT #LOCKA,&FCTL3 ;测试LOCKA
JNZ segalocked
MOV #FWKEY+LOCKA,&FCTL3
segalocked
RET
END main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -