分享

使用宏晶科技的IAP系列单片机开发自己的ISP程序(转自:WWW.STCMCU.COM)

 quasiceo 2015-12-02
使用宏晶科技的IAP系列单片机开发自己的ISP程序

原文及程序打包下载:http://www./datasheet/stc/STC-USER-CODE/STC-USER-IAP-ISP-DEMO(公开发布版本)-2011-3-9.rar(大小:135KB)

  随着IAP(In-Application-Programming)技术在单片机领域的不断发展,给应用系统程序代码升级带来了极大的方便。宏晶科技的串口ISP(In-System-Programming)程序就是使用IAP功能来对用户的程序进行在线升级的,但是出于对用户代码的安全着想,底层代码和上层应用程序都没有开源,为此宏晶科技推出了IAP系列单片机,即整颗MCU的Flash空间,用户均可在自己的程序中进行改写,从而使得有用户需要开发字节的ISP程序的想法得以实现。本文以宏晶科技的IAP12C5A60S2为例,详细说明了使用宏晶科技的IAP单片机开发用户自己的ISP程序的方法,并给出了基于Keil环境的汇编和C源码。

一、内部FLASH规划
示例单片机使用IAP12C5A60S2,用户可以使用的最大程序空间为59K字节,现将整个空间作如下划分:
宏晶IAP单片机开发自己的ISP程序
FLASH空间中,从地址0000H开始的连续59K字节的空间为用户程序区。当满足特定的下载条件时,需要用户将PC跳转到用户ISP程序区,此时可对用户程序区进行擦除和改写,以达到更新用户程序的目的。

二、程序的基本框架
宏晶IAP单片机开发自己的ISP程序

三、下位机固件程序说明
下位机固件程序包括两部分:ISP(ISP代码)和AP(用户代码)
●ISP代码包括如下外部接口模块:
ISPPROGRAM:程序下载入口地址,绝对地址EC00H
ISP_ENTRY:上电系统自检程序(系统自动调用)
对于用户程序而言,用户只需要在满足下载条件时,将PC值跳转到ISPPROGRAM (即EC00H的绝对地址),即可实现代码更新。

●用户代码
用户代码可以使用C或者汇编语言编写,但对于汇编代码需要注意一点:位于0000H的复位入口地址处的指令必须是一个长跳转语句(类似LJMP START)。在用户代码中,需要设置好串口,并在满足下载条件时,将PC值跳转到ISPPROGRAM (即EC00H的绝对地址),以实现代码更新。对于汇编代码,我们可以使用“LJMP EC00H”指令进行调用,如下图
宏晶IAP单片机开发自己的ISP程序

宏晶IAP单片机开发自己的ISP程序

在C代码中,必须定义一个函数指针变量,并将此变量赋值为0xEC00,然后再调用,如下图
宏晶IAP单片机开发自己的ISP程序

具体细节请参考附件中的代码。

四、上位机应用程序说明
上位机的程序是基于MFC的对话框项目,对于串口的访问是直接调用Windows的API函数,而没有使用串口控件,从而省去的控件的注册以及系统版本不兼容的诸多问题。界面较简单,只是为这一功能的实现提供了一个框架,其他的功能及要求均还可以往上面添加。

上位机程序的核心模块是基于类CISPDlg的一个友元函数“UINT Download(LPVOID pParam);”,此函数负责与下位机通讯,发送各种通讯命令来完成对用户程序的更新。用户可以根据各自不同的需求增加命令。

五、上位机应用程序的使用方法
●打开上位机界面,如下图
宏晶IAP单片机开发自己的ISP程序

●选择串口号,设置与下位机相同的串口波特率

●打开要下载的源数据文件,Bin或者Intel hex格式均可以

●点击“下载数据”按钮即可开始下载数据

六、下位机固件程序的使用方法
下位机的目标文件有两个“IAPISP.hex”和“AP.hex”,对于一块新的单片机,第一次必须使用宏晶科技的ISP下载工具将“IAPISP.hex”写入到芯片内,之后再更新便不再需要写“IAPISP.hex”这个文件了,附件中的“AP.hex”只是一个用户程序的模板,当满足下载条件时,用户只需要将PC值跳转到EC00H的地址,即可实现代码更新。


/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC IAP 系列单片机实现用户ISP 演示程序 ----------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* 如果要在程序中使用或者在文章中引用该程序,请在程序中或文章中注明  */
/* 使用了宏晶科技的资料或程序                                       */
/*------------------------------------------------------------------*/

#include "reg51.h"

#define FOSC 18432000L                  //系统时钟频率
#define BAUD (256 - FOSC/32/115200)     //定义串口波特率
#define ISPPROGRAM  0xec00              //ISP下载程序入口地址

/* 定义串口相关SFR */
sfr AUXR = 0x8E;                        //波特率发生器控制寄存器
sfr BRT = 0x9C;                         //波特率发生器定时器

void (*IspProgram)() = ISPPROGRAM;        //定义指针函数
char cnt7f;                             //Isp_Check内部使用的变量

void uart() interrupt 4 using 1         //串口中断服务程序
{
    if (TI) TI = 0;                     //发送完成中断
    if (RI)                             //接收完成中断
    {
        if (SBUF == 0x7f)
        {
            cnt7f++;
            if (cnt7f >= 16)
            {
                IspProgram();           //调用下载模块(****重要语句****)
            }
        }
        else
        {
            cnt7f = 0;
        }
        RI = 0;                         //清接收完成标志
    }
}

void main()
{
    SCON = 0x50;                        //定义串口模式为8bit可变,无校验位
    AUXR = 0x15;                        //波特率发生器12倍速,并启动波特率发生器定时器
    BRT = BAUD;                         //初始化波特率发生器定时器的定时初值
    ES = 1;                             //使能串口中断
    EA = 1;                             //打开全局中断开关

    while (1)
    {
        P1++;
    }
}

(请以STC官网最新资料为准,注意更新!录入整理 by 2013.07.30)

<返回首页>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多