📄 function_lib_s.sa
字号:
;本函数用于将确定地址的数据赋给变量或数组。
;sr_addr是源地址,ds_addr是目的地址,
;count是数据长度(flag=0时以字节为单位,flag=1时以2字节为单位,
;flag=2时以4字节为单位)
.global _memcopy
_memcopy: .cproc sr_addr,ds_addr,count,flag
.reg br0,br1
mvk 5,br1
; [!flag] b memb
sub flag,0x1,flag
[!flag] b memh
memw: ldw *sr_addr++,br0
shr br1,1,br1
stw br0,*ds_addr++
sub count,0x1,count
[count] b memw
b memend
memh: ldh *sr_addr++,br0
sth br0,*ds_addr++
sub count,0x1,count
[count] b memh
b memend
;memb: ldb *sr_addr++,br0
; stb br0,*ds_addr++
; sub count,0x1,count
; [count] b memb
memend:
.endproc
;本函数用于读取内存中的数据。
;addr是内存地址,flag是数据类型标志,
;0表示字符型数据,1表示短整型(16位),2表示整型(32位)。
.global _peek
_peek: .cproc addr,flag
mv addr,a0
mv flag,a2
cmpeq 0x0,a2,b0
cmpeq 0x1,a2,b1
cmpeq 0x2,a2,b2
[b0] ldb *a0,a1
[b1] ldh *a0,a1
[b2] ldw *a0,a1
.return a1
.endproc
;本函数用于向内存写入数据。
;addr是内存地址,data是要写入的数据,flag是数据类型标志,
;0表示字符型数据,1表示短整型(16位)2表示整型(32位)。
.global _poke
_poke: .cproc addr,data,flag
mv addr,a0
mv data,a1
mv flag,a2
cmpeq 0x0,a2,b0
cmpeq 0x1,a2,b1
cmpeq 0x2,a2,b2
[b0] stb a1,*a0
[b1] sth a1,*a0
[b2] stw a1,*a0
.endproc
;本函数用于将内存中的数据写入FLASH
;sr_addr是内存地址,ds_addr是FLASH地址,count是数据长度(以4字节为单位)
.global _flash_w
_flash_w: .cproc sr_addr,ds_addr,count
.reg ar0,ar1,ar2,ar3
.reg br0,br1,br2,br3,br4,br5,br6,br7
mvkl 0x1401554,ar1
mvkh 0x1401554,ar1
mvkl 0x1400aa8,ar2
mvkh 0x1400aa8,ar2
mvkl 0x00aa00aa,br1
mvkh 0x00aa00aa,br1
mvkl 0x550055,br2
mvkh 0x550055,br2
mvkl 0x00a000a0,br3
mvkh 0x00a000a0,br3
mvkl 0x200020,br5
mvkh 0x200020,br5
mvkl 0x900090,br6
mvkh 0x900090,br6
zero br7
stw br1,*ar1
stw br2,*ar2
stw br5,*ar1
label1:
stw br3,*ar1
ldw *sr_addr++,br4
stw br4,*ds_addr++
sub ds_addr,0x4,ar3
label2: ldw *ar3,br0
cmpeq br0,br4,br5
[!br5] b label2
sub count,0x1,count
[count] b label1
stw br6,*ar1
stw br7,*ar1
.endproc
;本函数用于整片擦除FLASH
.global _erase
_erase: .cproc
.reg ar1,ar2,ar3
.reg br0,br1,br2,br3,br4,br5,br6
mvkl 0x1401554,ar1
mvkh 0x1401554,ar1
mvkl 0x1400aa8,ar2
mvkh 0x1400aa8,ar2
mvkl 0xaa00aa,br1
mvkh 0xaa00aa,br1
mvkl 0x550055,br2
mvkh 0x550055,br2
mvkl 0x800080,br3
mvkh 0x800080,br3
mvkl 0x100010,br4
mvkh 0x100010,br4
mvkl 0xffffffff,br5
mvkh 0xffffffff,br5
mvkl 0x1400000,ar3
mvkh 0x1400000,ar3
stw br1,*ar1
stw br2,*ar2
stw br3,*ar1
stw br1,*ar1
stw br2,*ar2
stw br4,*ar1
label6: ldw *ar3,br6
cmpeq br6,br5,br0
[!br0] b label6
.endproc
;本函数用于DSP向主机发中断
.global _dtopi
_dtopi: .cproc
.reg ar0
.reg br0,br1,br2
; mvkl 0x01A7fff0,ar0
; mvkh 0x01A7fff0,ar0 ;hsr寄存器地址
; mvk 0x0,br2
; stw br2,*ar0
mvkl 0x01800014,ar0
mvkh 0x01800014,ar0 ;CE3寄存器地址
mvkl 0x11210622,br2
mvkh 0x11210622,br2
stw br2,*ar0
mvkl 0x2050000,br0 ;触发中断
mvkh 0x2050000,br0
mvkl 0x01,br1
mvkh 0x01,br1
stw br1,*br0
;向主机发中断
.endproc
;本函数用于擦除指定的flash扇区
;sec_addr是要擦除的扇区地址
.global _secerase
_secerase: .cproc sec_addr
.reg ar1,ar2,ar3
.reg br0,br1,br2,br3,br4,br5,br6
mvkl 0x1401554,ar1
mvkh 0x1401554,ar1
mvkl 0x1400aa8,ar2
mvkh 0x1400aa8,ar2
mvkl 0xaa00aa,br1
mvkh 0xaa00aa,br1
mvkl 0x550055,br2
mvkh 0x550055,br2
mvkl 0x800080,br3
mvkh 0x800080,br3
mvkl 0x300030,br4
mvkh 0x300030,br4
mvkl 0xffffffff,br5
mvkh 0xffffffff,br5
stw br1,*ar1
stw br2,*ar2
stw br3,*ar1
stw br1,*ar1
stw br2,*ar2
stw br4,*sec_addr
label7: ldw *sec_addr,br6
cmpeq br6,br5,br0
[!br0] b label7
.endproc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -