自定义下载应用说明 一 适用产品 :SM59XX 系列 SM59D XX 系列 SM59R XX 系列二 应用方式 : 可以让使用者自定义 command 作为进入 ISP 刻录的通关指令, 透过 UART 连接 ISAP 软件做联机更新三 操作说明 ( 使用 SM59D04G2 为例 ): 1. ISAP 操作方式 : 1.1 先将主程序及 ISP 服务程序烧进 MCU 中 1.2 将 MCU 放至系统版上, 与计算机连接并上电 1.3 启动计算机桌面上之 ISAP 应用程序, 并确认版本为 2.X.X ( 此版本开始支持自定义功能 ) 1.4 选择 自定义, 并依据客户主程序所使用的传输速度设定鲍率值, 因范例程序使用 115200bps, 因此需选择 115200bps 1.5 接着将自定义的指令输入至窗口中, 自定义的指令需配合客户主程序中 UART 中断的接收子程序所接受之自定义的指令, 客户可自定义的指令长度最多达 32 个字节, 数据型态为 16 进制 ISSFA-0134 1 Ver. A 2009/08
1.6 按下 自动执行 按钮, 即开始刻录, 刻录完成后在停止键上方会显示 晶片复位完成! ISSFA-0134 2 Ver. A 2009/08
2. 动作流程图 : PC MCU ISAP V2.X.X Initial UART Run customer's main code Send user-defined command Receive data YES NO Enter UART interrupt Check data = userdefined data YES NO Check data number = ncommandlength YES NO NO Receive ACK Send 0x5A YES Fail Start ISP erase, program, protect, reset LJMP ISP address ISSFA-0134 3 Ver. A 2009/08
3. 范例程序 ( 使用 SM59D04G2 为例 ): 3.1 Keil C 程序范例 : Description main.c (Main program) // 此范例应用包括 main.c GoToISP_Low.A51 #include "SM59D04G2.h" #define ncommandlength 32 #define nackcommand 0x5A unsigned char UartCmdCount; unsigned char code CommandArray[nCommandLength]= 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32; extern GoToISP_Low(); void delayms(unsigned int mscnt) unsigned int i; while(mscnt--) for(i=0;i<250;i++); void init_uart_timer1(unsigned char BR) SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable receive TMOD = 0x22; //TMOD: timer 1, mode 2, 8-bit reload PCON = 0x80; //SMOD = 1; TH1 = BR; //Baud:57600 fosc=22.1184mhz TR1 = 1 ; //timer 1 run EA = 1; //all interrupt enable ES = 1; //UART enable void init_uart_timer2(unsigned int T2value) RCAP2L = (char)t2value; RCAP2H = (char)(t2value>>8); T2CON = 0x34; SCON = 0x50; EA = 1; //all interrupt enable ES = 1; //UART enable void main(void) init_uart_timer2(0xfffa);//choise Timer 1 or Timer 2 as baud rate generator //init_uart_timer1(0xff); //SyncMOS_GoToISP via UART //TH1 = 0xFF; //12T, 3.579MHz(19200), 11.0592MHz(57600) // 6T, 3.579MHz(38400), 11.0592MHz(115200) ISSFA-0134 4 Ver. A 2009/08
//TH1 = 0xFE; //12T, 14.31818MHz(38400), 22.1184MHz(57600), 14.7456MHz(38400) // 6T, 22.1184MHz(115200) //TH1 = 0xFD; //12T, 4MHz(7200), 8MHz(14400), 8.192MHz(14400), 16MHz(28800) // 6T, 4MHz(14400),8MHz(28800), 8.192MHz(28800), 16MHz(57600) //TH1 = 0xFC; // // 6T, 14.31818MHz(38400), 14.7456MHz(38400) //TH1 = 0xFB; //12T, 18.432MHz(19200) // 6T, 18.432MHz(38400) //TH1 = 0xF7; //12T, 24.576MHz(14400), 25MHz(14400) // 6T, 24.576MHz(28800), 25MHz(28800) //TH1 = 0xF5; //12T, 20MHz(9600) // 6T, 20MHz(19200) //TH1 = 0xF3; //12T, 6MHz(2400), 12MHz(4800), 24MHz(9600) // 6T, 6MHz(4800), 12MHz(9600), 24MHz(19200) while(1) P0 = 0xF0; delayms(300); P0 = 0x0F; delayms(300); // P2 = 0xF0; delayms(300); // P2 = 0x0F; delayms(300); GoToISP_Low. A51 void serial(void) interrupt 4 if(ri) if(sbuf == CommandArray[UartCmdCount]) UartCmdCount++; else UartCmdCount=0; RI = 0 ; if(uartcmdcount==ncommandlength) IE = 0x00; //disabling interrupt SBUF = nackcommand; while(!ti); TI = 0; T2CON = 0x00; //disabling T2 because using T1 baud rate generator in ISP code GoToISP_Low(); //LJMP 3E00H ISP code address else TI=0; ; GoToISP_Low.A51 NAME GoToISP_Low?PR?GoToISP_Low?GOTOISP_LOW SEGMENT CODE PUBLIC GoToISP_Low RSEG?PR?GoToISP_Low?GOTOISP_LOW USING 0 GoToISP_Low: MOV DPTR,#3E00H ;LJMP 3E00H ISP code address ISSFA-0134 5 Ver. A 2009/08
PUSH DPL PUSH DPH RETI END 3.2 汇编程序范例 : Description Main program ncommandlength EQU 32 ;setting command length by user UARTCmdCount EQU 20H T2CON EQU 0C8H RCAP2L EQU 0CAH RCAP2H EQU 0CBH ORG 0000H AJMP ISP_Entry ORG 0023H AJMP UART_INTERRUPT ISP_Entry: ACALL SyncMOS_GoToISP ;initial setting main code start /* LED display demo */ MOV DPTR,#TABLE_01 ;DPTR point to data area START: MOV R0,#0 ; MOV R1,#8 ;8 datas LOOP: MOV A,R0 ;put R0 contect to A MOVC A,@A+DPTR ;use indirect address get data, and put into A MOV P0,A ;put ACC to Port 0 MOV P1,A ;put ACC to Port 1 ACALL DELAY100MS ;delay 0.1 second INC R0 ;R0 point to next data DJNZ R1,LOOP ;if R1!= 0 then jump to LOOP SJMP START ;if R1=0 then jump to START dealy subroutine DELAY100MS: MOV R5,#10 ;Dealy 10x10ms=100ms DELAY10MS: MOV R6,#50 ;delay time 10ms @ 11.0592MHz DELAY01: MOV R7,#99 DJNZ R7,$ ; Inner loop delay DJNZ R6,DELAY01 ; DJNZ R5,DELAY10MS RET TABLE_01: DB 11100111B DB 11000011B DB 10000001B DB 00000000B ISSFA-0134 6 Ver. A 2009/08
DB 10000001B DB 11000011B DB 11100111B DB 11111111B main code End SyncMOS_GoToISP Subroutine SyncMOS_GoToISP: ======UART Timer1 setting============= ;MOV TMOD,#00100001B ;Timer 1 is mode1 is mode 2, Timer 0 is mode 1 ;MOV TH1,#0FFH ;baud rate, 12T, 3.579MHz(19200), 11.0592MHz(57600) ; 6T, 3.579MHz(38400), 11.0592MHz(115200) ;MOV TH1,#0FEH ;baud rate, 12T, 14.31818MHz(38400), 22.1184MHz(57600), 14.7456MHz(38400) ; 6T, 22.1184MHz(115200) ;MOV TH1,#0FDH ;baud rate, 12T, 4MHz(7200), 8MHz(14400), 8.192MHz(14400), 16MHz(28800) ; 6T, 4MHz(14400),8MHz(28800), 8.192MHz(28800), 16MHz(57600) ;MOV TH1,#0FCH ;baud rate, ; 6T, 14.31818MHz(38400), 14.7456MHz(38400) ;MOV TH1,#0FBH ;baud rate, 12T, 18.432MHz(19200) ; 6T, 18.432MHz(38400) ;MOV TH1,#0F7H ;baud rate, 12T, 24.576MHz(14400), 25MHz(14400) ; 6T, 24.576MHz(28800), 25MHz(28800) ;MOV TH1,#0F5H ;baud rate, 12T, 20MHz(9600) ; 6T, 20MHz(19200) ;MOV TH1,#0F3H ;baud rate, 12T, 6MHz(2400), 12MHz(4800), 24MHz(9600) ; 6T, 6MHz(4800), 12MHz(9600), 24MHz(19200) ;SETB TR1 ;enable Timer 1 ;MOV PCON,#10000000B ;set SMOD = 1 ====================================== ======UART Timer2 setting============= ;choise Timer 1 or Timer 2 as baud rate generator MOV RCAP2H,#0FFH MOV RCAP2L,#0FAH MOV T2CON,#34H ====================================== MOV SCON,#01010000B ;serial mode 1, REN=1, TI=0, RI=0 MOV IE,#90H ;enable UART interrupt MOV UARTCmdCount,#00H RET UART_INTERRUPT: JB RI,RX ; if RI=1 jump RX,else clear TI CLR TI RETI RX: CLR RI PUSH ACC ISSFA-0134 7 Ver. A 2009/08
PUSH DPL PUSH DPH MOV A,UARTCmdCount MOV DPTR,#COMMAND_TABLE MOVC A,@A+DPTR CJNE A,SBUF,CLR_UARTCmdCount INC UARTCmdCount MOV A,UARTCmdCount CJNE A,#nCommandLength,RETURN CLR EA MOV SBUF,#5AH ;transmit ack MOV DPTR,#3E00H ;LJMP 3E00H ISP code address PUSH DPL PUSH DPH JNB TI,$ CLR TI MOV T2CON,#00H ;disabling T2 because using T1 baud rate generator in ISP code RETI CLR_UARTCmdCount: MOV UARTCmdCount,#00H RETURN: POP DPH POP DPL POP ACC RETI COMMAND_TABLE: DB 01H,02H,03H,04H,05H,06H,07H,08H ;to define command by user DB 09H,10H,11H,12H,13H,14H,15H,16H DB 17H,18H,19H,20H,21H,22H,23H,24H DB 25H,26H,27H,28H,29H,30H,31H,32H END 备注 : 相关范例程序已附在 ISAP V2.X.X 安装目录下 C:\Program Files\SyncMOS\SyncMOS Writers\ISAP\ OnlineUpdate\User-defined Code Size 为 16KB 以下的 IC( 如 SM59D03G2 SM59D04G2), 其 ISP 服务程序地址在 0x3E00H; Code Size 为 32KB 的 IC( 如 SM59R08A2), 其 ISP 服务程序地址在 0x7E00H;Code Size 为 64KB 以上的 IC( 如 SM59R16A2 SM59264 SM5964 SM5964A SM59128), 其 ISP 服务程序地址在 0xFE00H, 请依使用的 IC 型号修改需跳跃的 ISP 地址 SM59XX 系列与 SM59DXX 系列 ISP 服务程序使用 Timer 1 当鲍率产生器, 因此若客户在主程序中使用 Timer2 作为鲍率产生器, 请必须在跳跃到 ISP 服务程序前将 T2CON 给 00H, 避免 Timer2 占用 UART 串口 ISSFA-0134 8 Ver. A 2009/08
四 鲍率设定参考表 : 1. Timer 1,TH1[7:0] 设定值参考表 : 1.1 仅列出部分频率, 其余频率可至新茂网站下载试算程序 (http://www.syncmos.com.tw/download_file/uart.rar) 1.2 下表中未填入数值部分, 因试算结果误差较大, 传输时较易发生传输错误, 不建议使用 Baud rate (BPS) 11.0592MHz/12T 22.1184MHz/12T 11.0592MHz/6T 115200 FF 57600 FF FE 28.6MHz/12T 28.63636MHz/12T 14.31818MHz/6T 36.81875MHz/12T 36.864MHz/12T 18.432MHz/6T 38400 FD FC FB 28800 FE FC 19200 FD FA F8 F6 14400 FC F8 F3 9600 FA F4 EC 7200 F8 F0 EB E5 4800 F4 E8 E1 D8 2400 E8 D0 C2 B0 1200 D0 A0 84 60 ISSFA-0134 9 Ver. A 2009/08
2. Timer 2,RCAP2[15:0] 设定值参考表 : 2.1 仅列出部分频率, 其余频率可至新茂网站下载试算程序 (http://www.syncmos.com.tw/download_file/uart.rar) 2.2 下表中未填入数值部分, 因试算结果误差较大, 传输时较易发生传输错误, 不建议使用 Baud rate (BPS) 3.579MHz/6T 14.7456MHz/12T 20MHz/12T 32MHz/12T 16MHz/6T 36.864MHz/12T 18.432MHz/6T 115200 FFFE FFFC FFF6 57600 FFFC FFF8 FFF5 FFEF FFEC 38400 FFFA FFF4 FFF0 FFE6 FFE2 28800 FFF8 FFF0 FFEA FFDD FFD8 19200 FFF4 FFE8 FFDF FFCC FFC4 14400 FFF1 FFE0 FFD5 FFBB FFB0 9600 FFE9 FFD0 FFBF FF98 FF88 7200 FFE1 FFC0 FFA9 FF75 FF60 4800 FFD1 FFA0 FF7E FF30 FF10 2400 FFA3 FF40 FEFC FE5F FE20 1200 FF46 FE80 FDF7 FCBF FC40 ISSFA-0134 10 Ver. A 2009/08