M
作者:
TB025
访问内存
的读取和写入操作是由一组控制
特殊功能寄存器(SFR) 。有六个
所需的特殊功能寄存器来访问闪存程序存储器:
EECON1
EECON2
EEDATA
EEDATH
EEADR
EEADRH
下载HEX文件到PIC16F87X的PICmicro
微控制器
罗杰·里奇
微芯片技术公司
介绍
在PIC16F87X器件的版本引入了
科幻RST中档Microchip的技器件系列
术具有该能力的读写以交换
最终程序存储器。这个家族FLASH为基础的
程序存储器,SRAM数据存储器和EEPROM
数据存储器。闪存程序存储器允许
一个真正的可重复编程系统。表1示出了如果没有这特性
对PIC16F87X系列器件作上。
寄存器
EEADRH : EEADR
保存12位地址
访问在亲的8K字的位置所需要
程序存储器。寄存器
EEDATH : EEDATA
用于
保存的数据值。当读取程序存储
储器中,
EEPGD
位
(EECON1<7>)
必须被设置为指示
到微控制器,该操作将是
对程序存储器。如果该位被清零时,操作
在该地址处的数据存储器上,将执行
所指向的
EEADR
。该
EEDATA
注册将举行
数据。该
EECON1
注册也有位写使能
并启动读或写操作。也有
已经出现了位,以指示写错误,这可能是由于
到复位条件发生,而在写操作
正在进行中。图1示出的寄存器映射为
EECON1
.
该
EECON2
寄存器不是物理寄存器。阅读
这将导致所有'0' 。该寄存器仅
在EEPROM和FLASH写入序列。
清单1
显示的代码片段,以启动写操作的
在PIC16F87X器件。
表1
PIC16F87X系列的特性
主要特点
PIC16F873
DC - 20 MHz的
POR , BOR
4K
192
128
13
端口A,B ,C
3
2
MSSP , USART
—
5个输入通道
PIC16F874
DC - 20 MHz的
POR , BOR
4K
192
128
14
端口A,B ,C , D,E
3
2
MSSP , USART
PSP
8个输入通道
PIC16F876
DC - 20 MHz的
POR , BOR
8K
368
256
13
端口A,B ,C
3
2
MSSP , USART
—
5个输入通道
PIC16F877
DC - 20 MHz的
POR , BOR
8K
368
256
14
端口A,B ,C , D,E
3
2
MSSP , USART
PSP
8个输入通道
工作频率
复位
闪光PROG存储器( 14位字)
数据存储器(字节)
EEPROM数据存储器
中断
I / O端口
计时器
捕捉/比较/ PWM模块
串行通信
并行通信
10位的模数转换模块
1998年Microchip的科技公司
DS91025A第1页
TB025
图1:
R / W -X
U-0
EEPGD =
bit7
EECON1寄存器
U-0
—
U-0
—
R / W -X
R/W-0
WRERR雷恩
R/S-0
WR
R/S-0
RD
bit0
R =可读位
W =可写位
S =置1位
U =未实现位,
读为' 0 '
- n =上电复位值
第7位:
EEPGD
:程序/数据EEPROM选择位
1 =访问程序存储器
0 =访问数据存储器
注意:在写操作过程中,此位不能被改变。
WRERR
: EEPROM错误标志位
1 =写操作提早终止
(任何MCLR复位或WDT复位正常工作期间)
0 =写操作完成
雷恩
: EEPROM写使能位
1 =允许写周期
0 =禁止写入EEPROM
WR
:写控制位
1 =启动写周期。
该位由硬件清零一次写操作完成。
WR位只能设置(不能清零)软件。
0 =写周期EEPROM完成
RD
:读控制位
1 =启动EEPROM读操作(读操作需要一个周期)
RD由硬件清零。 RD位只能设置(不能清零)软件。
0 =不启动EEPROM读操作
就行了。除以二这个数字得到
每行的字数。
AAAA
- 是一个四位十六进制地址表象
senting的数据记录的起始地址。
格式是高字节科幻RST其次是低字节。该
地址一倍,因为这种格式只支持一
端口8位(以网络ND真正的PICmicro地址,
简单地划分值
AAAA
2 ) 。
TT
- 是,这将是'00'的两位记录类型
数据记录, “01”表示的网络文件记录结束和' 04'
为扩展地址记录(仅INHX32 ) 。
HHHH
- 是一个四位十六进制数据字。换
垫低字节后高字节。将有
be
BB
以下/ 2个数据字
TT.
CC
- 是一个两位十六进制校验和,它是
的二的补码的所有预总和
割让行记录中的字节。
位6 :4:
未实现:
读为' 0 '
位3:
位2:
位1 :
位0:
HEX文件格式
该数据被编程到程序存储器将
被读入到使用其标之一的微控制器
准接口模块: SPI,
2
C , USART ,或PSP 。
可能是最简单的格式将数据发送到所述
微控制器是在所使用的标准HEX格式
Microchip的开发工具。该格式支持部门
移植是Intel HEX格式( INHX8M ) ,英特尔拆分
HEX格式( INHX8S ) ,和Intel HEX格式32
( INHX32 ) 。最常用的格式是
INHX8M和INHX32 ,因此是唯一换
席本文档中讨论。请参阅
在MPASM用户指南( DS33014 )附录A
关于HEX文件连接格式的详细信息。存在差
INHX8M和INHX32之间ENCE是INHX32
支持使用线性地址的32位地址
记录。六角连接文件的基本格式是一样的
这两种格式之间的,如下所示:
: BBAAAATTHHHH ... HHHHCC
每个数据记录以一个9字符预连接x和
总是以2字符校验和结束。所有记录
以'
:
“无论何种格式。个人
下面的元素进行说明。
BB
- 是一个两位十六进制字节数表象
senting的数据字节将出现的数目
DS91025A第2页
由于PIC16F87X设备仅具有一个最大的
8K字的线性地址记录' 04'是通过忽略
该例程。六角连接文件是由ASCII煤焦的
字符0透彻9和A至F和每行的末尾
有一个回车符和换行符。下载器
在PIC单片机代码必须转换
用于亲ASCII字符的二进制数
编程。
1998年Microchip的科技公司
TB025
的PICmicro代码
样本下载代码不具体来说使用
一个PIC16F87X设备上的接口的模块。
相反,所谓的常规
了getByte
检索单
人物从十六进制文件连接至所需的接口。
它是由工程师写围绕该例程
所需的接口。另一种常规
GetHEX8
电话
GET-
字节
两次形成一个两位十六进制数。
一个问题的出现是有多少次重新编程
不正确地编程的位置。样品
提供简单的代码退出下载程序和
存储为0xFF在一个值
WREG
如果一个程序存储器
位置不正确地编程该网络连接第一个尝试。
工程师可以选择添加代码以环数
如果该次事件发生。
还有一个问题,是不是具体来说论及
示例代码是为了防止下载从
覆盖它自己的程序存储器地址。
设计者必须添加一个地址检查,以防止
这种情况的发生。
最后,设计人员必须考虑的情况下
新代码下载到微控制器
由外部事件,例如电源故障中断
或复位。该系统必须能够从这样回收
一个事件。这不是一个简单的任务,是非常系统
依赖性的,并因此留给设计者
提供的保障和恢复机制。
可能发生的另一个错误是行校验
错误。如果计算出的行校验和不匹配
从HEX文件连接线校验,1的值
在返回
WREG
。该程序的调用部分
下载应检查错误为0xFF (不能
编写一个存储单元)和1。如果程序存储器
正确编程,并没有错误已
遇到下载器程序返回一个0
WREG
以指示成功到调用例程。身材
图2示出了佛罗里达州owchart的下载例程。
清单2
显示了下载的完整列表
代码。
常规
ASCII2HEX
将所输入的字符,以
一个二进制数。该例程不提供任何出
误差范围检查传入的字符。自
在HEX网络文件的唯一有效的字符是冒号( :) ,
数字0到9和A到F的字母A ,
该例程可以被高度优化了。这音响首先减去48
从字符值。对于ASCII码0
通过如图9所示,这将导致从值0到9。如果煤焦
个人品格是A到F ,其结果是一个大于
15.例行检查,看看是否的高四位
结果是0,如果不为0 ,则原始值是甲
通过F和例程现在减去额外
43日起,在二进制的字符值10
通过15.结肠未在此例行程序占
叉由于下载程序代码的主要部分
使用它作为一个行同步。
清单1所示:
bsfSTATUS,RP1
bcfSTATUS,RP0
movfAddrH ,W
movwfEEADRH
movfAddrL ,W
movwfEEADR
bsfSTATUS,RP0
bsfEECON1,EEPGD
bsfEECON1,RD
bcfSTATUS,RP0
NOP
movfEEDATA ,W
…
movfEEDATH ,W
…
Flash写序
; BANK2
;加载地址为
; EEADRH : EEADR
;
;
;
;
Bank3
设置程序存储
读操作
Bank2
;数据被读出
;用户现在可以
;存取存储器
1998年Microchip的科技公司
DS91025A第3页
TB025
清单2 :
十六进制代码下载写给MPASM
列表P = 16F877
#包括"c : \\ PROGRA 1 \\ MPLAB \\ p16f877.inc"
DownloadCode
BANKSEL
DCStart
通话
MOVLW
SUBWF
BTFSS
GOTO
通话
MOVWF
MOVWF
BCF
RRF
通话
MOVWF
ADDWF
通话
MOVWF
ADDWF
通话
MOVWF
ADDWF
DataRec
MOVF
BTFSS
GOTO
DRLoop
MOVF
BTFSC
GOTO
通话
MOVWF
ADDWF
通话
MOVWF
ADDWF
WriteDataSequence
BANKSEL
MOVF
MOVWF
MOVF
MOVWF
MOVF
MOVWF
MOVF
MOVWF
BANKSEL
BSF
BSF
BCF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
NOP
;采用USART接收来自PC的数据
RCREG
了getByte
':'
RCREG ,W
STATUS ,Z
DCStart
GetHex8
BYTECOUNT
LineChecksum
STATUS ,C
BYTECOUNT ,女
GetHex8
ADDRH
LineChecksum ,女
GetHex8
ADDRL
LineChecksum ,女
GetHex8
RecType
LineChecksum ,女
;等待结肠
;读取的字节数
;存放在寄存器
;存放于行校验
;除以2字节计数器拿到的话
;阅读的16位地址高字节
;添加高字节的行校验
;阅读的16位地址低字节
;添加低字节的行校验
;读取记录类型
;加入行校验
;数据接收
;检查数据记录( 0H )
;否则,检查EOF
;检查BYTECOUNT = 0
;如果为零,转到校验和验证
;读取数据的低字节( 2个字符)
;添加接收到的数据校验
;读取数据的高字节( 2个字符)
;添加接收到的数据校验
RecType ,女
STATUS ,Z
EndOfFileRec
BYTECOUNT ,女
STATUS ,Z
DRCkChecksum
GetHex8
HexDataL
LineChecksum ,女
GetHex8
HexDataH
LineChecksum ,女
;写序内部前卫。纪念品FLASH
EEADRH
ADDRH ,W
EEADRH
ADDRL ,W
EEADR
HexDataH ,W
EEDATH
HexDataL ,W
EEDATA
EECON1
EECON1,EEPGD
EECON1,WREN
INTCON , GIE
0x55
EECON2
0xaa
EECON2
EECON1,WR
;写地址EEADRH : EEADR寄存器
;将数据写入EEDATH : EEDATA寄存器
;写序
;将EEPGD来表示程序存储器
;启用写入内存
;确保中断被禁止
;要求写序列
;启动内部写周期
DS91025A第4页
1998年Microchip的科技公司
TB025
NOP
BCF
BANKSEL
BSF
BSF
BCF
NOP
MOVF
SUBWF
BTFSS
RETLW
MOVF
SUBWF
BTFSS
RETLW
INCF
BTFSC
INCF
DECF
GOTO
DRCkChecksum
通话
ADDWF
BTFSS
RETLW
GOTO
EndOfFileRec
DECF
BTFSS
GOTO
通话
ADDWF
BTFSS
RETLW
RETLW
EECON1,WREN
EECON1
EECON1,EEPGD
EECON1,RD
STATUS,RP0
EEDATH ,W
HexDataH ,W
STATUS ,Z
0xff
EEDATA ,W
HexDataL ,W
STATUS ,Z
0xff
ADDRL ,女
STATUS ,Z
AddrH ,女
BYTECOUNT ,女
DRLoop
;禁止写入
;读取序列
;将EEPGD来表示程序存储器
;允许从内存中读取
;比较记忆值HexDataH : HexDataL
;如果高位字节不相等,返回FFH
;以表明编程失败
;如果低字节不相等,返回FFH
;以表明编程失败
;增量地址为下一次迭代
;递减字节数
;回到检查BYTECOUNT = 0
;校验和验证
;读入校验
;加入校验和计算
;结果应该是0
;如果没有返回1 ,表示校验失败
;再做一次
;文件结束记录( 01H )
;如果EOF记录,应减量= 0
;不适记录类型,等待下一个:
;读入校验
;加入校验和计算
;结果应该是0
;如果没有返回1 ,表示校验失败
;否则返回0表示成功
GetHex8
LineChecksum ,W
STATUS ,Z
1
DCStart
RecType ,W
STATUS ,Z
DCStart
GetHex8
LineChecksum ,W
STATUS ,Z
1
0
了getByte
;将你的代码在这里,从获取数据的字节
;所需的接口。在这种情况下,它是在F877 USART的。
;明确CTS
;
BANKSEL
PIR1
;GH4Waitbtfss
PIR1,RCIF
;
GOTO
GH4Wait
;设置CTS
NOP
BANKSEL
RCREG
MOVF
RCREG ,W
回报
GetHex8
通话
通话
MOVWF
SWAPF
通话
通话
IORWF
MOVF
回报
了getByte
ASCII2Hex
温度
温度,女
了getByte
ASCII2Hex
温度,女
温度,W
;该函数使用USART
;从USART读取一个字符
;转换角色为二进制
;将结果存储在高字节
;从USART读取一个字符
;转换角色为二进制
;将结果低四位
;将结果存入WREG
1998年Microchip的科技公司
DS91025A第5页