写入闪存PIC18f4550数据手册示例

时间:2018-11-03 18:43:04

标签: assembly pic instruction-set flash-memory

在PIC18F4550的数据手册中,写入闪存程序存储器的示例如下:

            MOVLW D'64’                    ; number of bytes in erase block
            MOVWF COUNTER
            MOVLW BUFFER_ADDR_HIGH         ; point to buffer
            MOVWF FSR0H
            MOVLW BUFFER_ADDR_LOW
            MOVWF FSR0L
            MOVLW CODE_ADDR_UPPER          ; Load TBLPTR with the base
            MOVWF TBLPTRU                  ; address of the memory block
            MOVLW CODE_ADDR_HIGH
            MOVWF TBLPTRH
            MOVLW CODE_ADDR_LOW
            MOVWF TBLPTRL
READ_BLOCK
            TBLRD*+                        ; read into TABLAT, and inc
            MOVF TABLAT, W                 ; get data
            MOVWF POSTINC0                 ; store data
            DECFSZ COUNTER                 ; done?
            BRA READ_BLOCK                 ; repeat
MODIFY_WORD
            MOVLW DATA_ADDR_HIGH           ; point to buffer
            MOVWF FSR0H
            MOVLW DATA_ADDR_LOW
            MOVWF FSR0L
            MOVLW NEW_DATA_LOW             ; update buffer word
            MOVWF POSTINC0
            MOVLW NEW_DATA_HIGH
            MOVWF INDF0
ERASE_BLOCK
            MOVLW CODE_ADDR_UPPER          ; load TBLPTR with the base
            MOVWF TBLPTRU                  ; address of the memory block
            MOVLW CODE_ADDR_HIGH
            MOVWF TBLPTRH
            MOVLW CODE_ADDR_LOW
            MOVWF TBLPTRL
            BSF EECON1, EEPGD              ; point to Flash program memory
            BCF EECON1, CFGS               ; access Flash program memory
            BSF EECON1, WREN               ; enable write to memory
            BSF EECON1, FREE               ; enable Row Erase operation
            BCF INTCON, GIE                ; disable interrupts

            MOVLW 55h 
Required    MOVWF EECON2                   ; write 55h
Sequence    MOVLW 0AAh
            MOVWF EECON2                   ; write 0AAh
            BSF EECON1, WR                 ; start erase (CPU stall)

            BSF INTCON, GIE                ; re-enable interrupts
            TBLRD*-                        ; dummy read decrement
            MOVLW BUFFER_ADDR_HIGH         ; point to buffer
            MOVWF FSR0H
            MOVLW BUFFER_ADDR_LOW
            MOVWF FSR0L
            MOVLW D’2’
            MOVWF COUNTER1
WRITE_BUFFER_BACK
            MOVLW D’32’                    ; number of bytes in holding register
            MOVWF COUNTER
            WRITE_BYTE_TO_HREGS
            MOVF POSTINC0, W               ; get low byte of buffer data
            MOVWF TABLAT                   ; present data to table latch
            TBLWT+*                        ; write data, perform a short write
                                           ; to internal TBLWT holding register.
            DECFSZ COUNTER                 ; loop until buffers are full
            BRA WRITE_WORD_TO_HREGS
PROGRAM_MEMORY
            BSF EECON1, EEPGD              ; point to Flash program memory
            BCF EECON1, CFGS               ; access Flash program memory
            BSF EECON1, WREN               ; enable write to memory
            BCF INTCON, GIE                ; disable interrupts

            MOVLW 55h
Required    MOVWF EECON2                   ; write 55h
Sequence    MOVLW 0AAh
            MOVWF EECON2                   ; write 0AAh
            BSF EECON1, WR                 ; start program (CPU stall)

            DECFSZ COUNTER1
            BRA WRITE_BUFFER_BACK
            BSF INTCON, GIE                ; re-enable interrupts
            BCF EECON1, WREN               ; disable write to memory

但是我不知道如何解释这段代码,我的意思是:

-我在哪条指令中选择了要开始写入的内存位置

-我在哪里写要写的说明

例如,在我的主要代码旁边,如果我想用Flash编写,则在PORTB的某些I / O中检测到5v之后的下一条指令:

movlw    0CEh
movwf    TRISA

我在数据表的示例代码中需要做哪些更改?还是我误会“写入闪存程序存储器”是什么意思?

1 个答案:

答案 0 :(得分:0)

  

我在哪条指令中选择了要开始写入的内存位置

    MOVLW CODE_ADDR_UPPER          ; Load TBLPTR with the base
    MOVWF TBLPTRU                  ; address of the memory block
    MOVLW CODE_ADDR_HIGH
    MOVWF TBLPTRH
    MOVLW CODE_ADDR_LOW
    MOVWF TBLPTRL
  

-我在哪里写要写的说明

    MOVLW BUFFER_ADDR_HIGH         ; point to buffer
    MOVWF FSR0H
    MOVLW BUFFER_ADDR_LOW
    MOVWF FSR0L