DIY编程器网
标题: EASY51PRO实现分析 [打印本页]
作者: liyf 时间: 2011-4-15 16:50
标题: EASY51PRO实现分析
EASY51PRO 软件是一个很经典的写AT89X51系列单片机的ISP下载软件,先对其实现机理做一简单分析,具体内部怎么实现,作者精心巧妙的设计,耐人寻味.
ChipList.chip -- 芯片的类型记录文件
EasyIsp.ini -- EasyIsp-2的引脚定义
EasyPro_Info.ini -- 设置记录文件
LastFile.ini -- 记录上次打开的文件
WinIo.sys -- WINIO库,可以在保护模式下,直接读写端口,这里用来对并口直接操作
ChipManager.exe -- 设置芯片类型的可视化程序
Easy 51Pro.exe -- EASY51下载的主程序
IspTest.exe -- 测试并口ISP下载线的测试程序
Hook.dll -- 钩子函数,这样单独抽出来写DLL,目的是可以钩子windows消息,用来实现发送系统消息的.有待深入研究,具体使用那种类型的钩子!
WinIo.dll -- WINIO库
XT2000Lib.dll -- 界面库,这个大可不必吧,我在我的486上倒置了好久才让我看到程序界面,实在鸡肋啊.
先简单分析下,真希望作者能透露下具体内幕,多多学习!
2007年12月13日 星期四 22:32
发现这篇文章的访问量特高,因此,我决定拿出我珍藏的另一份文档继续完成,那就是Easy51Pro的源码分析,就参详后续文章。
2008年08月07日 星期四 09:11
前言:
Easy51Pro是由聂忠强编写的一款优秀的针对单片机ISP下载的软件,并且提供可拓展的芯片型号的支持,引脚检测等功能。并且更值得敬佩的是,作者将代码开源了,我拿到这个代码已久,早就技痒想分析下这些代码,因为工作的原因一直拖延,近日由于对界面库对比使用的频繁(Easy51Play使用Xtreme界面库,本篇不涉及界面库使用方法的分析),再次读了一遍EASY51源码,因为作者优秀的OOP编程思想,使得代码流畅易懂,我边读边记录并把它公开,希望能给大家一些帮助。网上也有人对比Easy51Pro和Atmel的Microcontroller ISP Software,其中有一个功能就是Run Target的实现,最终我们也会进行探讨。希望写的纰漏的地方,大家能够不吝指正,共同进步。另期待作者的《Easy51Pro的秘密》一文早日面世,我想这是很多电子爱好者期待已久的事情吧。
图1.工程结构图
CParallelPort 是一个由WINIO库封装的并口操作类,在这里简单对WINIO库进行一下介绍。
由于MS-Windows的保护模式,出于安全的考虑,禁止用户对硬件端口进行操作,因此,对串并口的读写设置就稍微复杂了一些,不能随心所欲的对接口寄存器操作,而WINIO库就提供了接口,方便用户对端口的直接读取写入。
下面是WINIO库的几个核心函数:
WINIO_API bool _stdcall InitializeWinIo(); //初始化WINIO库
WINIO_API void _stdcall ShutdownWinIo(); //关闭WINIO库
//////////////////// 函数描述 Begin ////////////////////
// *
// * 函数名: WINIO_API bool _stdcall GetPortVal
// *
// * 参数: 3个参数
// * 参数1:WORD wPortAddr 端口地址
// * 参数2DWORD pdwPortVal 读取的值
// * 参数3:BYTE bSize 值位数
// *
// * 返回值: bool 类型;
// *
// * 备注: 读取端口的值
// *
// * 最后修改时间: 2008-8-9 上午 02:38:55
// *
//////////////////// 函数描述 End ////////////////////
WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
//////////////////// 函数描述 Begin ////////////////////
// *
// * 函数名:bool _stdcall SetPortVal
// *
// * 参数: 3个参数
// * 参数1:WORD wPortAddr 端口地址
// * 参数2WORD dwPortVal 读取的值
// * 参数3:BYTE bSize 值位数
// *
// * 返回值: WINIO_API 类型;
// *
// * 备注: 向端口写入值
// *
// * 最后修改时间: 2008-8-9 上午 02:41:41
// *
//////////////////// 函数描述 End ////////////////////
WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
这些函数使用简单方便,如果对平台有限制的话,可以利用API判断下是否为NT系统,Win2000或WinXP先使用InstallWinIoDriver()函数安装驱动,WinIo库也提供了成员接口,更多信息,大家可以在WinIo.h文件中查看。
现在回到CParallelPort类,这个类在WinIo基础上,根据并口操作的特点,进行了封装,应该说作者的OOP观念是非常好的,它的几个关键函数:
BOOL SetPinLogic(int nPin,BOOL bLogic); //设置指定引脚, 1高电平,0低电平
BOOL GetPinLogic(int nPin); //得到指定引脚的电平
BOOL SetPinL(int nPin); //设置指定引脚为低电平
BOOL SetPinH(int nPin); //设置指定引脚为高电平
WriteData(BYTE Data); //写数据口
BYTE ReadData(); //读数据口
WriteCtrl(BYTE Ctrl); //写控制字
BYTE ReadCtrl(); //读控制字
BYTE ReadState(); //读状态字
CString m_strDrivePath; //驱动程序所在路径
BYTE m_CtrlByte,m_DataByte,m_StatByte; //保存当前的数据字,状态字,控制字
unsigned short m_nCtrlPort,m_nDataPort,m_nStatPort; //端口地址
值得说明的是,如果大家在改进这个类的时候,需要读写数据,该类已经帮大家做好了反相引脚的转换,这点大家可以参考我空间的《并口编程学习笔记》里的说明,因为1,14,11,17引脚是反相的,所以平时这点大家也不要马虎大意。
下面我们说说CParallelPro,通过名称分析,这个类和CParallelPort类有莫大的关系,作者的注释说:“ParallelPro.cpp: implementation of the CParallelPro class.这个类负责对并口下载线进行控制,利用’Isp编程方法对象’对器件编程”。
根据源码分析,这个类在并口类的基础上,进一步加入了通过并口进行ISP编程的特点,它的类操作流程和功能,大致是,初始化并口,从EasyIsp.ini配置文件中,读取ISP编程针脚的设置,然后再根据下载线类型等设置来进行控制。另外它还提供了诸如查找支持该FID的"Isp编程方法对象" CIsPro* CParallelPro::GetIsPro(BYTE FID) 等接口函数。
这里我们知道了在CParallelPro类里,还引入了:CAt89s51Isp(AT89S51的Isp编程方法)和IsPro(这个纯虚类封装了Isp编程流程的一般操作,请从这个类派生出对具体器件的Object)。
这两个类,是我们对本源码进行扩充和改进的关键,很多人都想对新型号的单片的ISP下载进行改进支持,这两个类是大家要研究的关键,但是我们要放到下一节中继续分析。
转至 大伦子 的大作
作者: jy11 时间: 2017-12-25 15:06
好文章呀,多年以后读来,都有启发。
作者: muelfox 时间: 2018-8-13 18:46
感谢分享,感谢分享
欢迎光临 DIY编程器网 (http://diybcq.com./) |
Powered by Discuz! X3.2 |