首页 > 解决方案 > 写入闪存 PIC18f4550 数据表示例

问题描述

在 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

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

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

-我在哪里写要写的说明

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

movlw    0CEh
movwf    TRISA

我必须在数据表的示例代码中进行哪些更改?还是我错误地解释了“写入闪存程序存储器”的含义?

标签: assemblypicinstruction-setflash-memory

解决方案


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

    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

推荐阅读