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

📄 flash_write_or_erase.asm

📁 DSP的Bootloader程序
💻 ASM
字号:
;**************************************
;    FLASH ERASE AND PROGRAM
;**************************************
       .title  "flash.asm"
       .mmregs
	   .def    start   ; ftw,inform_ch
       
       .data
;*********************************************************************
write_word:  ;待写入内容

 .word 0x10AA,0x7FFF,0xF800,0x0000,0x0080,0x00EC,0x0000,0x0180,0x7718,0x3A00,0x7758,0x0000
 
;*********************************************************************

sector_erase_sfd:
         .byte 0AAh
         .byte 055h
         .byte 080h
         .byte 0AAh
         .byte 055h
         .byte 030h    ;sector erase 
block_erase_sfd:
         .byte 0AAh
         .byte 055h
         .byte 080h
         .byte 0AAh
         .byte 055h
         .byte 050h    ;block erase
chip_erase_sfd:         
         .byte 0AAh
         .byte 055h
         .byte 080h
         .byte 0AAh
         .byte 055h
         .byte 010h    ;chip erase
word_prog_sfd:         
         .byte 0AAh
         .byte 055h
         .byte 0A0h
softwareid_entry_sfd:
         .byte 0AAh
         .byte 055h
         .byte 090h 
cfi_query_entry_sfd:                 
         .byte 0AAh
         .byte 055h
         .byte 098h 
mode_exit_sfd:                 
         .byte 0AAh
         .byte 055h
         .byte 0F0h                    ;exit other mode     
 
;**************************************         
erase_sfd_adr:
         .word 0D555h
         .word 0AAAAh
         .word 0D555h
         .word 0D555h
         .word 0AAAAh
         .word 0D555h            
common_adr:
         .word 0D555h
         .word 0AAAAh
         .word 0D555h

;erase_sfd_adr   .set    
;common_adr      .set   
write_word_adr  .set    4000h     
;write_word_adr  .set    0FFFFh               
;data_tab_adr    .set   2000h 
;prog_tab_adr    .set   2050h 
;f_adr_tab_adr   .set   2021h  

;**************************************      
size     .set  64
length   .set  64
stack    .set  400h         ;.usect"STK",size
offset   .set  8000h

SPSA0    .set  38h          ;McBSP子地址寄存器
SPSA1    .set  48h          ;McBSP子地址寄存器
SPSD0    .set  39h          ;子块数据寄存器映射位置
SPSD1    .set  49h          ;子块数据寄存器映射位置
GPIOCR   .set  3Ch
GPIOSR   .set  3Dh
TIM1     .set  30h
PRD1     .set  31h
TCR1     .set  32h     

       .text
;**************************************
;        dsp_init
;**************************************
start:   
        stm  #stack+size,SP
        stm  #3CF0h,PMST
        stm  #0h,CLKMD
        nop
        nop
        stm  #4007h,CLKMD
        stm  #0,GPIOSR
        stm  #0FFh,GPIOCR   ;通用I/0设为输出
                            ;ovly=1  in PMST
                            ;
        stm   #0AFFFh,SWWSR   ;I/O 软等待数为#X
;         stm   #1101101101101101B,SWWSR
;        stm   #0010011011011011B,SWWSR   ;I/O 软等待数为#X
;        stm   #SWSM,SWCR    ;等待数*2                    
;**************************************        
;
;**************************************
        ld    #0h,A
        stm   #0h,AR7
        stm   #0h,AR6
        stm   #0h,AR5
        stm   #0h,AR4
        stm   #0h,AR3
        stm   #0h,AR2
        stm   #0h,AR1
        stm   #write_word,AR5          ;
        stm   #write_word_adr,AR6      ;
main_prog:
     ;   call  #exit_mode
        nop
        nop
        nop
        call  #delay_150ns
      ;  call  #erase_chip
        nop
        nop
        nop
        call  #delay_100ms
        nop
loop:
        nop
        nop
        call  #write_one_word    
        call  #delay_150ns

        b     loop
        
;**************************************
exit_mode:
        stm   #mode_exit_sfd,AR1      ;exit any mode 
        stm   #common_adr,AR2         ;commond address
        
;        rpt   #(3-1)
;        mvdp  *AR1+,*AR2+

        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ret
;**************************************
erase_chip:
        stm   #chip_erase_sfd,AR1     ;erase commond 
        stm   #erase_sfd_adr,AR2      ;erase commond address
        
;        rpt   #(6-1)
;        mvdp  *AR1+,*AR2+

        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ld    #0h,A
        or    *AR2+,A
        ld    *AR1,B
        writa *AR1+
        
        ret
;************************************** 
write_one_word:     
        stm   #word_prog_sfd,AR3       ;program one word commond 
        stm   #common_adr,AR4          ;commond address
;        stm   #write_word,AR5          ;defined in AR5 before call subprogram
;        stm   #write_word_adr,AR6      ;defined in AR6 before call subprogram        
          
;        rpt   #(3-1)
;        mvdd  *AR3+,*AR4+
;        mvdd  *AR5+,*AR6+
        
        ld    #0h,A
        or    *AR4+,A
        ld    *AR3,B
        writa *AR3+
        
        ld    #0h,A
        or    *AR4+,A
        ld    *AR3,B
        writa *AR3+
        
        ld    #0h,A
        or    *AR4+,A
        ld    *AR3,B
        writa *AR3+
                      
        ld    #0h,A                    ;write one word
;        or    *AR6+,A
        ldm   AR6,A
        ld    *AR5,B
        writa *AR5+
        add   #1,A
        stlm  A,AR6
        NOP
        NOP
        NOP
        
        ret        
;**************************************
;delay_150ns
;**************************************
delay_150ns 
        ld   #200,B 
loop_delay10        
        sub  #1,B                 ;20MHz = 50*4*200ns=40us
        nop
        bc   loop_delay10,BNEQ       
        nop
        nop
        nop
        
        ret
;**************************************
;delay_100ms
;**************************************        
delay_100ms 
        ld   #400,A
loop_delay1 
        ld   #5000,B 
loop_delay11        
        sub  #1,B                 ;20MHz = 50*4*5000ns=1ms
        nop
        bc   loop_delay11,BNEQ       
        sub  #1,A                 ;20MHz = 1ms*100=100ms
        bc   loop_delay1,ANEQ 
        nop
        ret
;**************************************
;delay_20ms
;**************************************
delay_20ms 
        ld   #20,A
loop_delay2 
        ld   #5000,B 
loop_delay21        
        sub  #1,B                 ;20MHz = 50*4*5000ns=1ms
        nop
        bc   loop_delay21,BNEQ       
        sub  #1,A                 ;20MHz = 1ms*20=20ms
        bc   loop_delay2,ANEQ 
        nop
        nop
        nop
        
        ret
;**************************************


                        
        .end                        
           














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -