【问题标题】:Write to flash PIC18f4550 datasheet example写入闪存 PIC18f4550 数据表示例
【发布时间】:2018-11-03 18:43:03
【问题描述】:

在 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

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

【问题讨论】:

  • 您问题中描述的方法很难甚至无法在 PIC18F4550 中实现。如果可以实施,则操作行为可能会不稳定。您应该寻求一种不涉及更改要执行的操作码的解决方案。
  • 所以在烧写 PIC 后不能在闪存中写入指令吗?或者只是在这张照片中?你知道我该如何做我想做的事吗?
  • 将程序闪存用于非易失性存储是通过这种方法完成的,但 PIC18F4550 有 256 字节的 EEPROM 可用于此目的。这对你有用吗?

标签: assembly pic instruction-set flash-memory


【解决方案1】:

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

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多