Пример записи в флэш-память PIC18f4550 - PullRequest
0 голосов
/ 03 ноября 2018

В таблице данных 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

но я не знаю, как интерпретировать этот код, я имею в виду:

- в какой инструкции я выбираю место в памяти для начала записи

-где я пишу инструкции для написания

например, помимо моего основного кода, если я хочу записать во флэш-памяти следующие инструкции после 5 В, обнаруженные в некоторых входах / выходах PORTB:

movlw    0CEh
movwf    TRISA

какие изменения я должен сделать в примере кода таблицы? или я неправильно понимаю, что означает «запись во флэш-память программы»?

1 Ответ

0 голосов
/ 05 ноября 2018

в какой инструкции я выбираю место в памяти, чтобы начать писать

    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
...