• 沒有找到結果。

闪存程序存储器

在文檔中 的 64/80/100 引脚 (頁 57-63)

PIC24FJ256GB110 系列器件包含用于存储和执行应用 代码的内部闪存程序存储器。可采用4 种方式对它进行 编程:

• 在线串行编程 (ICSP™)

• 运行时自编程 (Run-Time Self-Programming,

RTSP)

• JTAG

• 增强型在线串行编程 (增强型 ICSP™)

ICSP 允许在最终的应用电路中对 PIC24FJ256GB110 系列器件进行串行编程。只需要5 根线即可完成这一操 作,其中编程时钟线和编程数据线(名称分别为PGECx 和PGEDx)各一根,其余 3 根分别是电源线 (VDD)、

接地线 (VSS)和主复位线 (MCLR)。这允许用户在 生产电路板时使用未编程器件,仅在产品交付之前才对 单片机进行编程,从而可以使用最新版本的固件或者定 制固件进行编程。

使用

TBLRD

(表读)和

TBLWT

(表写)指令来实现 RTSP。使用 RTSP,用户可以一次写入 64 条指令(192 字节)块的程序存储数据,一次擦除512 条指令(1536 字节)块的程序存储单元。

4.1 表指令和闪存编程

闪存存储器的编程都是用表读和表写指令实现的,与使 用的编程方法无关。这些指令允许器件在正常工作模式 下通过数据存储器直接读写程序存储空间。程序存储器 中24 位目标地址由 TBLPAG<7:0> 位和表指令中指定 W 寄存器中的有效地址 (EA)组成,如图 4-1 所示。

TBLRDL

TBLWTL

指令用来读或写程序存储器的 bit<15:0>。

TBLRDL

TBLWTL

能以字或字节模式访问 程序存储器。

TBLRDH

TBLWTH

指令用来读或写程序存储器的 bit<23:16>。

TBLRDH

TBLWTH

同样能以字或字节模 式访问程序存储器。

4-1:

表寄存器的寻址

注: 本数据手册总结了PIC24F 器件的功能。但 是不应把本手册当作无所不包的参考手册 来使用。更多信息,请参见《PIC24F 系列 参 考 手 册》的 “第

4 章 程序存储器”

(DS39715A_CN)。

程序计数器 0 24 位

程序计数器

TBLPAG 寄存器 8 位

工作寄存器EA

16 位 使用

24 位 EA 字节 0

1/0

选择 表指令

使用

用户/ 配置 空间选择

PIC24FJ256GB110 系列

DS39897B_CN 第 56 页

初稿

 2009 Microchip Technology Inc.

4.2 RTSP 工作原理

PIC24F 闪存程序存储器阵列是由 64 条指令或 192 字节 的行组成的。RTSP 允许用户一次擦除 8 行(512 条指 令)的块以及一次编程一行。它也可以编程单个字。

8行擦除块和单行写块都是边沿对齐的,从程序存储器起 始地址开始,分别到1536 字节边界和 192 字节边界。

当使用TBLWT指令将数据写入程序存储器时,数据并不 直接被写入存储器。相反,使用表写指令写入的数据被 存储在保持锁存器中,直到执行编程序列。

可以执行任意数量的

TBLWT

指令,随后将成功执行一次 写操作。但是,需要64 条

TBLWT

指令写入存储器的整 行。

为确保写操作期间没有数据损坏,任何未用的地址都应 编程为 FFFFFFh。这是因为保持锁存器复位为未知状 态,因此如果地址保持在复位状态,它们可能会改写未 重新写入的行上的存储单元。

RTSP 编程的基本步骤是先建立一个表指针,然后执行 一系列TBLWT指令将数据装入缓冲器。编程是通过设置 NVMCON 寄存器中的控制位执行的。

可以任何顺序装入数据,而且在执行写操作前可以多次 写入保持寄存器。但是,后续的写操作将擦除任何先前 的写操作。

所有的表写操作都是单字写操作 (2 个指令周期),因 为只写缓冲器。编程每一行需要一个编程周期。

4.3 JTAG 工作原理

PIC24F 系列器件支持 JTAG 编程和边界扫描。边界扫 描通过校验引脚到 PCB 的连接性以改进制造工艺。使 用支持串行向量格式(Serial Vector Format,SVF)的 工业标准JTAG 编程器可以执行编程。

4.4 增强型在线串行编程

增强型在线串行编程使用板上自举程序(称为编程执行 程序)来管理编程过程。使用SPI 数据帧格式,编程执 行程序能够擦除、编程和校验程序存储器。关于增强型 ICSP 的更多信息,请参见器件编程规范。

4.5 控制寄存器

有两个 SFR 用于读写闪存程序存储器:NVMCON 和 NVMKEY。

NVMCON 寄存器 (寄存器 4-1)控制要擦除的块、要 编程的存储器类型,以及编程周期的开始。

NVMKEY 是一个只写寄存器,用于写保护。要启动编程 或擦除序列,用户必须连续地将 55h 和 AAh 写入 NVMKEY 寄存器。更多详细信息,请参见第 4.6 节“编 程操作”。

4.6 编程操作

在RTSP 模式下,对内部闪存进行编程或擦除需要执行 完整的编程过程。编程或擦除操作期间,处理器暂停

(等待)直到操作完成。将 WR 位 (NVMCON<15>)

置1 启动操作,当操作完成时 WR 位会自动清零。

注: 不建议对同一个存储单元进行多次写操作 而不进行擦除操作。

 2009 Microchip Technology Inc.

初稿

DS39897B_CN 第 57 页

PIC24FJ256GB110 系列

寄存器

4-1: NVMCON:闪存控制寄存器

R/SO-0(1) R/W-0(1) R/W-0(1) U-0 U-0 U-0 U-0 U-0

WR WREN WRERR — — — — —

bit 15 bit 8

U-0 R/W-0(1) U-0 U-0 R/W-0(1) R/W-0(1) R/W-0(1) R/W-0(1)

— ERASE — — NVMOP3(2) NVMOP2(2) NVMOP1(2) NVMOP0(2)

bit 7 bit 0

图注: SO = 只可置 1 的位

R = 可读位 W = 可写位 U = 未实现位,读为 0

-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15

WR:写控制位

(1)

1 = 启动闪存存储器编程或擦除操作。该操作是自定时的,一旦操作完成该位即由硬件清零。

0 = 编程或擦除操作完成,并处于停止状态

bit 14

WREN:写使能位

(1)

1 = 使能闪存编程 / 擦除操作 0 = 禁止闪存编程 / 擦除操作

bit 13

WRERR:写序列错误标志位

(1)

1 = 试图执行不合法的编程或擦除序列,或者发生终止 (试图将 WR 位置 1 时自动置 1 该位)

0 = 编程或擦除操作正常完成

bit 12-7 未实现:读为

0

bit 6

ERASE:擦除 / 编程使能位

(1)

1 = 在下一条 WR 命令时执行 NVMOP3:NVMOP0 指定的擦除操作 0 = 在下一条 WR 命令时执行 NVMOP3:NVMOP0 指定的编程操作

bit 5-4 未实现:读为

0

bit 3-0

NVMOP3:NVMOP0:NVM 操作选择位

(1,2)

1111 = 存储器批量擦除操作 (ERASE = 1)或无操作 (

ERASE = 0)(3)

0011 = 存储器字编程操作 (ERASE = 0)或无操作 (ERASE = 1)

0010 = 存储器页擦除操作 (ERASE = 1)或无操作 (

ERASE = 0)

0001 = 存储器行编程操作 (ERASE = 0)或无操作 (ERASE = 1)

1: 这些位只能在 POR 时复位。

2: NVMOP3:NVMOP0 的所有其他组合均未实现。

3: 仅在 ICSP™ 模式下可用。请参见器件编程规范。

PIC24FJ256GB110 系列

DS39897B_CN 第 58 页

初稿

 2009 Microchip Technology Inc.

4.6.1 闪存程序存储器的编程算法

用户可以一次对闪存存储器的一行进行编程。要实现该 操作,必须擦除包含该行在内的8 行擦除块。一般过程 如下:

1. 读取程序存储器的8 行 (512 条指令),并存储 在数据RAM 中。

2. 用所需的新数据更新RAM 中的程序数据。

3. 擦除程序块 (见例4-1):

a) 将 NVMOP 位 (NVMCON<3:0>)设置为

0010,配 置 为 块 擦 除 操 作。将

ERASE

(NVMCON<6>)和 WREN

(NVMCON<14>)位置 1。

b) 将要被擦除的块的起始地址写入TBLPAG和 W 寄存器。

c) 将55h 写入 NVMKEY。

d) 将 AAh 写入 NVMKEY。

e) 将 WR 位 (NVMCON<15>)置 1。擦除周 期开始,在擦除周期中CPU 会暂停。当擦除 完成时,WR 位会自动清零。

4. 将数据RAM 中的前 64 条指令写入程序存储器缓 冲器 (见例4-1)。

5. 将程序块写入闪存存储器:

a) 将 NVMOP 位设置为

0001,配置为行编程

操作。将ERASE 位清零,将 WREN 位置 1。

b) 将 55h 写入 NVMKEY。

c) 将AAh 写入 NVMKEY。

d) 将 WR 位置 1。编程周期开始,在写周期中 CPU 会暂停。当闪存存储器写操作完成时,

WR 位会自动清零。

6. 将TBLPAG 中的值递增 1,使用数据 RAM 中下 一个64 条指令块重复步骤 4 和 5,直到所有 512 条指令被写回闪存存储器。

为防止意外操作,必须向NVMKEY 写入启动序列从而 允许执行擦除或编程操作。在执行编程命令后,用户必 须等待一段编程时间,直至编程完成。紧跟编程启动序 列后面的两条指令应为

NOP,如例

4-3 所示。

4-1:

擦除程序存储器块

; Set up NVMCON for block erase operation

MOV #0x4042, W0 ;

MOV W0, NVMCON ; Initialize NVMCON

; Init pointer to row to be ERASED

MOV #tblpage(PROG_ADDR), W0 ;

MOV W0, TBLPAG ; Initialize PM Page Boundary SFR MOV #tbloffset(PROG_ADDR), W0 ; Initialize in-page EA[15:0] pointer TBLWTL W0, [W0] ; Set base address of erase block DISI #5 ; Block all interrupts with priority <7

; for next 5 instructions MOV #0x55, W0

MOV W0, NVMKEY ; Write the 55 key

MOV #0xAA, W1 ;

MOV W1, NVMKEY ; Write the AA key

BSET NVMCON, #WR ; Start the erase sequence

NOP ; Insert two NOPs after the erase

NOP ; command is asserted

 2009 Microchip Technology Inc.

初稿

DS39897B_CN 第 59 页

PIC24FJ256GB110 系列

4-2:

装载写缓冲器

4-3:

启动编程序列

; Set up NVMCON for row programming operations

MOV #0x4001, W0 ;

MOV W0, NVMCON ; Initialize NVMCON

; Set up a pointer to the first program memory location to be written

; program memory selected, and writes enabled

MOV #0x0000, W0 ;

MOV W0, TBLPAG ; Initialize PM Page Boundary SFR

MOV #0x6000, W0 ; An example program memory address

; Perform the TBLWT instructions to write the latches

; 0th_program_word

MOV #LOW_WORD_0, W2 ;

MOV #HIGH_BYTE_0, W3 ;

TBLWTL W2, [W0] ; Write PM low word into program latch TBLWTH W3, [W0++] ; Write PM high byte into program latch

; 1st_program_word

MOV #LOW_WORD_1, W2 ;

MOV #HIGH_BYTE_1, W3 ;

TBLWTL W2, [W0] ; Write PM low word into program latch TBLWTH W3, [W0++] ; Write PM high byte into program latch

; 2nd_program_word

MOV #LOW_WORD_2, W2 ;

MOV #HIGH_BYTE_2, W3 ;

TBLWTL W2,[W0] ; Write PM low word into program latch TBLWTH W3,[W0++] ; Write PM high byte into program latch

; 63rd_program_word

MOV #LOW_WORD_31, W2 ;

MOV #HIGH_BYTE_31, W3 ;

TBLWTL W2,[W0] ; Write PM low word into program latch TBLWTH W3,[W0] ; Write PM high byte into program latch

DISI #5 ; Block all interrupts with priority <7

; for next 5 instructions MOV #0x55, W0

MOV W0, NVMKEY ; Write the 55 key MOV #0xAA, W1 ;

MOV W1, NVMKEY ; Write the AA key

BSET NVMCON, #WR ; Start the erase sequence BTSC NVMCON, #15 ; and wait for it to be

BRA $-2 ; completed

PIC24FJ256GB110 系列

DS39897B_CN 第 60 页

初稿

 2009 Microchip Technology Inc.

4.6.2 编程闪存程序存储器的单字

如果已擦除某个闪存单元,则可以使用表写指令将其编 程为将一个指令字 (24 位)写入写锁存器。 TBLPAG 寄存器被装入闪存地址的8 个最高有效字节。

TBLWTL

TBLWTH

指令将所需数据写入写锁存器,并指定要写

入的程序存储器地址的低16 位。要将 NVMCON 寄存 器配置为字写操作,请将NVMOP位(NVMCON<3:0>)

设置为

0011。通过执行解锁序列并将

WR 位置 1 来执 行写操作 (见例4-4)。

4-4:

编程闪存程序存储器的单字

; Setup a pointer to data Program Memory MOV #tblpage(PROG_ADDR), W0 ;

MOV W0, TBLPAG ; Initialize PM Page Boundary SFR

MOV #tbloffset(PROG_ADDR), W0 ;Initialize a register with program memory address

MOV #LOW_WORD_N, W2 ;

MOV #HIGH_BYTE_N, W3 ;

TBLWTL W2, [W0] ; Write PM low word into program latch TBLWTH W3, [W0++] ; Write PM high byte into program latch

; Setup NVMCON for programming one word to data Program Memory

MOV #0x4003, W0 ;

MOV W0, NVMCON ; Set NVMOP bits to 0011

DISI #5 ; Disable interrupts while the KEY sequence is written

MOV #0x55, W0 ; Write the key sequence

MOV W0, NVMKEY MOV #0xAA, W0 MOV W0, NVMKEY

BSET NVMCON, #WR ; Start the write cycle

 2009 Microchip Technology Inc.

初稿

DS39897B_CN 第 61 页

PIC24FJ256GB110 系列

在文檔中 的 64/80/100 引脚 (頁 57-63)