单片机课程设计-ATMEL51系列单片机编程器
有次去面试,我对面试官说我设计过一块开发板,然后那面试官直接问了个核心问题:这个编程器的固件是你自己写的吗?一下子就问到了痛处。是的,编程器固件不是自己写的,那为什么不自己设计一个呢? 我说的自己设计是包括硬件电路、单片机程序以及电脑端界面等等所有东西全部自己DIY。当一个真正的DIYer。所以我动手了,用了几天几夜时间弄了一个可以支持两种芯片(AT89S51 AT89S52)
的基于ISP下载的编程器
首先要说的是,要设计个编程器, 这方面的资料在网上基本是找不到的,估计是大家不想开源(open source code)...所以必须自己按照某一芯片的官方数据手册慢慢搞懂它的下载协议,然后写成固件。
STEP 1. 研究数据手册
首先找了一份S52芯片的中文数据手册,一看傻了眼,翻译得很垃圾,垃圾还不要紧,最重要是里面把关于FLASH编程的章节直接忽略掉了。。想看都没得看。没办法,那就直接研究英文数据手册算了,用了一天多时间认真把数据手册看懂。。这里本人一直有个误区,从大一的时候开始就以为S52会有256B的用户RAM,比S51高级,其实不是,S52也只有128B内存,FLASH容量比S51多4KB也就是8KB。。谨记谨记。。或者你可以选择接入外部RAM,不过这会浪费掉你至少16个IO口用来做数据及地址总线,而且还要加外一个地址锁存器用来复用本来就不够用的IO口,而汇编指令中的MOVX就是用来操作外部RAM的。OK数据手册研究完毕(还算幸运的,因为S52的数据手册只有30多页)。
STEP 2. HEX文件的本来面目以及怎样将HEX文件转换成机器码
之前我一直以为HEX文件就像镜像文件一样对应着单片机FLASH的每一个数据,然后烧录软件LOAD程序的时候是直接将HEX文件里面的数据一个一个输入到单片机的FLASH中,又来了个误区,事实情况却不是这样的。正解是:HEX文件是一种用ASCII编码的文件,就是说里面的数据都是字符来的,比如说里面记录了一个地址为0X00EF的话,如果按照二进制格式应该是:0000 0000 1110 1111 这样记录的,但HEX采用了ASCII字符编码,直接在里面写成:‘0’ ‘0’ ‘E’ ‘F’ (这是ASCII字符!!!)。基于这个原理,要想正确下载程序就必须写一个HEX->机器码转换算法,将HEX文件转换成机器码。用了几个小时就把算法搞定。具体实现过程就不说了,想了解的可以直接找我聊啦,总之最后结果就是我实现了一个 HEX_Translate(char *Input,char *Output)函数搞定
评论