新闻  |   论坛  |   博客  |   在线研讨会
Intel HEX格式命令的解析代码
tongxin | 2009-05-18 19:25:23    阅读:1540   发布文章

    在P89C51RD2的ISP状态下,单片机接收上位机发送的命令和数据,这些命令和数据是采用Intel HEX 文件的格式,网上有不少文章中研究甚至反编译了BOOT ROM中的代码,得到了ISP运行的过程,在我的系统中也用到了这个东西,因为要对FLASH中的数据进行升级,所以实现了一整套Intel HEX格式命令的解析,代码如下:

    ;==============================
RUN_MODE:
    MOV     A,DATA_MODE     ;数据操作类型
    RL       A                       ;A=A*2
    ADD     A,DATA_MODE     ;A=A*3   LJMP指令占用三个字节空间
    MOV     DPTR,#IAP_BASE_ADDR ;程序散转,不能超过有84个命,85*3=255
    JMP     @A+DPTR
IAP_BASE_ADDR:
    LJMP     IAP_PRO_DATA       ;00=传送编程数据并完成编程
    LJMP     IAP_SEND_CHAR_OK ;01=传文件结束符
    LJMP     IAP_SETUP_FOSC         ;02=指定振荡器频率
    LJMP     IAP_MPRO_DAT       ;03=杂项编程功能
    LJMP     IAP_READ_CHECK     ;04=显示指定地址段FLASH 数据或查空
    LJMP     IAP_READ_DATA       ;05=各种读功能
    LJMP     IAP_SETUP_BPS       ;06=直接装载波特率
    ;以上兼容Philips的ISP命令,下面为自定义命令
    LJMP     IAP_SET_DEVICE_CLOCK ;07=设置实时时钟
    LJMP     IAP_RESTART         ;08=重新启动系统
    LJMP     IAP_READ_DEVICE_CLOCK     ;09=读取实时时钟
    。。。。。。。。。。

    LJMP     IAP_MAIN_LOOP     ;其他命令

REV_SEND1:
    JNB     RI, $
    CLR     RI
        MOV     A,SBUF       ;接收数据
        RET

;==============================
        ;接收两个ASCII字符并回传;将两个
        ;ASCII码合成为1字节二进制数
        ;==============================
REV_DAT1_SUM:
        ACALL   REV_SEND1
        ACALL   ASCII_HEX   ;将ASCII字符转化为二进制
        SWAP   A
        MOV     B,A       ;首先接收高位字节数据
        ACALL   REV_SEND1
        ACALL   ASCII_HEX   ;将ASCII字符转化为二进制
        ORL     A,B       ;组合成一个字节数据
        MOV     DATA_BUFFER,A
        ADD     A,DATA_SUM     ;计算和校验
        MOV     DATA_SUM,A
        RET

SERIAL_SEND_CHAR:
        JNB     TI,$
        CLR     TI
        MOV     SBUF,A
        RET


    除了实现Philips定义的那些命令外还可以自定义命令,实现自己需要的功能。Philips命令集严格按照芯片文档来写程序,通过前几篇文章可以写出这个IAP的系统调用接口函数。

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客