1 引 言
p89c51rd2是ph ilips 公司的8位单片机产品。在保证80c51指令系统和硬件结构的大体框架的同时, 扩充了许多功能, 包括看门狗、isp功能和f lash操作。值得一提的是, ph ilips的技术并非完全公开, 这就给单片机的使用带来了一定的困难。
比如说, 它的boot rom 区本来是4k 字节, 但在手册中只提及了1k 字节, 其他部分程序隐藏调用, 这就给程序设计带来了很大的麻烦。同时, 除了手册中提及的高位地址特殊寄存器区, p89c51rd2 还设计了一些特殊功能寄存器, 对这些寄存器的意外访问也有可能造成芯片的异常。因此, 有必要对这些功能区进行分析, 以找出其所有单片机资源。
2 boo trom 固件代码的读出
对于1k ( 地址fc00h ~ ffffh ) boot rom 的flash代码读取方法, 参考文献已经有提及, 这里只是在此基础上进行进一步分析。下面来看pgm _mtp入口地址的部分代码。
push 0e4h ; 保存e4h值
orl 0e 4h, # 80h ; 置位e4h 最高位
push psw
acall 0f9adh ; 调用看门狗服务程序
c jne r1, # 00h, 0ff4fh
acall 0f9d9h ; 读生产批号子程序
通过这部分程序可以看出, boo trom 区调用了0f9adh 地址中的子程序, 而从手册上, 只写出有fc00h ~ ffffh 地址。所以, 这是一个需要特殊访问的flash区。同时, 程序还控制了e4h, 这个特殊功能寄存器也是手册里面没有提及的。鉴于p89c51rd2有专门的控制位来控制1k flash, 假设还有一个控制位, 位于e4h 的最高位, 也是通过置位方式, 能够得到flash切换的效果, 只要程序中首先置位了e 4h, 就可以通过movc 指令得到隐藏区的程序。实践证明这个假设是对的, 从f000h ~ffffh 都读出了数据, 其中f000h ~ f7ffh 地址中全为0。而f800h ~ fbffh中存在1k 可执行程序,并且这些程序就是pgm _mtp调用的隐藏子程序。
通过反汇编这一区间程序, 可以找到全部flash底层操作的程序。所以实际的p89c51rd2的f lash 空间分布应该如图1所示。
手册里面1k 字节的boo t rom 区, 实际上是由一个4k 的flash块构成的, 其中2k 字节的flash最终被填写进00h, 另外2k 用于实现boot rom 的实际操作。所以, 用户也可以将这2k 的地址空间, 作为用户的使用空间, 存放一些需要保留的重要数据。
3 部分子程序分析
p89c51rd2多余的1k 程序空间写满了程序。
这些程序都是由fff0的子程序调用的。通过反汇编这一段子程序, 能够知道单片机的底层操作细节。
由于篇幅所限, 这里面仅列出flash写操作的部分程序, 有兴趣的读者可以依照上面的方法反汇编所有程序进行分析。以下是编程数据字节子程序的反汇编结果。
; 编程数据字节一级子程序
f9c9: 75 e4 91mov 0e4h, # 91h ; e4h 未公开
f9cc: 31 d1 acall 0f9d1h ;
f9ce: 65 e5 xrl a, 0e5h ; 返回e5h 参数
f9d0: 22 ret
; 编程数据字节二级子程序
f9d1: f5 e5mov 0e5h, a
f9d3: 31 25 acall 0f925h ; 多入口子程序,连续写和读e6h, flash操作
f9d5: 75 e4 80mov 0e4h, # 80h
f9d8: 22 ret
; 编程数据字节三级子程序
f925: c0 f0 push b
f927: c0 e0 push acc
f929: 31 83 acall 0f983h ; flash1
f92b: 75 f0 05mov b, # 05h
f92e: 31 a3 acall 0f9a3h ; 看门狗子程序
f930: e5 e6mov a, 0e6h
f932: 54 08 anl a, # 08h
f934: 60 03 jz 0f939h
f936: d5 f0 f5 djnz b, 0f92eh
f939: 31 93 acall 0f993h ; flash2
f93b: 31 9b acall 0f99bh ; flash3
f93d: d0 e0 pop acc
f93f: d0 f0 pop b
f941: 22 ret
; flash底层操作1
f983: 75 e6 c0mov 0e6h, # 0c0h
f986: 00 nop
f987: 75 e6 d0mov 0e6h, # 0d0h
f98a: 00 nop
f98b: 00 nop; 这里面较多的nop 起延迟作用
f992: 22 ret
; flash底层操作2
f993: 75 e6 c0mov 0e6h, # 0c0h
f996: 00 nop
f997: 75 e6 e 0mov 0e6h, # 0e0h
f99a: 22 ret
; flash底层操作3
f99b: 75 e6 c0mov 0e6h, # 0c0h
f99e: 00 nop
f99f: 75 e6 00mov 0e 6h, # 00h
f9a2: 22 ret
上面的flash 区写字节子程序, 动用了e4h、e5h 和e6h 三个隐藏的特殊功能寄存器, 其中e4寄存器带入状态, e5寄存器返回结果, e 6寄存器用于发布实际的写操作命令。这就要求在程序设计中, 一定注意不能随便对上述地址做操作, 否则可能会意外改写程序区。同时, 从程序中也可以看到, 每一个具体的子程序操作, 到底使用了多大的堆栈空间。在程序设计中, 遇到调用写f lash 子程序时, 有了对堆栈使用情况的了解, 可以防止堆栈的溢出, 对堆栈的设计考虑起辅助作用。
4 结论与展望
通过对p89c51rd2的分析可以看出, 在单片机功能增加方面, 采用的设计方法就是扩展高位地址特殊功能寄存器, 而这种方法几乎应用在所有80c51架构和指令集的扩展型单片机中。由于能够读出p89c51rd2的所有程序, 实际应用中可以将boot rom 区转移到其他地址, 或者为用户扩展2k的隐藏空间。从分析中还可以发现, flash 区的隐藏, 是通过特殊寄存器的控制位切换来实现的。因此, 这一读出boot rom 区的方法, 也可以应用于分析其他型号单片机的flash区。
降压开关控制器70V转5V 1A电源芯片
从2D到3D,沉浸式的实时视频通信是如何实现的?
关于人员定位追踪系统的详细说明
细数毫米波雷达在中国的这几年
新触控技术将使新款iPhone、iPad更有趣
P89C51RD2隐藏分区的读取方法
ldo内部结构和工作原理
顺络电子助力笔电再次扬威
MOS管怎么选?——从电压、电流两方面考虑
漏电测试器,Leakage Tester
为什么我的数码照片文件如此庞大,而其他网站上却那么小?
PCIe的Spec中明确规定只有Root有权限发起配置请求
华为mate9保时捷版收购价最高高达99万元?
总体而言 2019年的厨电行业内外部环境优于2018年
两种优化开关模式在高频SVPWM逆变电源中的应用
360终端安全管理系统装载了全新一代7.0主动防御引擎
应用于现代医疗电子设备中的蓝牙技术
华为Mate9、荣耀V9、华为P10、荣耀9对比评测:同为麒麟960旗舰,荣耀9势头迅猛,其他三款统统降价让路
有颜有实力的四款手机:华为荣耀Magic、Mate9保时捷版、小米MIX、三星S7 edge
神舟优雅XS-5Y10S1超极本外观评测