使用宏晶科技的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字节,现将整个空间作如下划分: FLASH空间中,从地址0000H开始的连续59K字节的空间为用户程序区。当满足特定的下载条件时,需要用户将PC跳转到用户ISP程序区,此时可对用户程序区进行擦除和改写,以达到更新用户程序的目的。 二、程序的基本框架 三、下位机固件程序说明 下位机固件程序包括两部分:ISP(ISP代码)和AP(用户代码) ●ISP代码包括如下外部接口模块: ISPPROGRAM:程序下载入口地址,绝对地址EC00H ISP_ENTRY:上电系统自检程序(系统自动调用) 对于用户程序而言,用户只需要在满足下载条件时,将PC值跳转到ISPPROGRAM (即EC00H的绝对地址),即可实现代码更新。 ●用户代码 用户代码可以使用C或者汇编语言编写,但对于汇编代码需要注意一点:位于0000H的复位入口地址处的指令必须是一个长跳转语句(类似LJMP START)。在用户代码中,需要设置好串口,并在满足下载条件时,将PC值跳转到ISPPROGRAM (即EC00H的绝对地址),以实现代码更新。对于汇编代码,我们可以使用“LJMP EC00H”指令进行调用,如下图 在C代码中,必须定义一个函数指针变量,并将此变量赋值为0xEC00,然后再调用,如下图 具体细节请参考附件中的代码。 四、上位机应用程序说明 上位机的程序是基于MFC的对话框项目,对于串口的访问是直接调用Windows的API函数,而没有使用串口控件,从而省去的控件的注册以及系统版本不兼容的诸多问题。界面较简单,只是为这一功能的实现提供了一个框架,其他的功能及要求均还可以往上面添加。 上位机程序的核心模块是基于类CISPDlg的一个友元函数“UINT Download(LPVOID pParam);”,此函数负责与下位机通讯,发送各种通讯命令来完成对用户程序的更新。用户可以根据各自不同的需求增加命令。 五、上位机应用程序的使用方法 ●打开上位机界面,如下图 ●选择串口号,设置与下位机相同的串口波特率 ●打开要下载的源数据文件,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) <返回首页> |
|