📄 uart_t2.c
字号:
uPSD3200系列芯片提供两个标准的8032 UART 串行口。串口1连接到P3.0(RX)和P3.1(TX)。串口2连接到P1.2(RX)和P1.3(TX)。这两个串口为全双工接口,即接收和发送可以同时进行。串行口的接收和发送是通过SBUF寄存器(对串口2是SBUF2寄存器)的访问进行的。串行I/O口有4种工作方式, 可以通过SCON寄存器(对串口2是SCON2寄存器)中的SM0和SM1位编程来选择。如表1所示。
表1 串行I/O口4种工作方式
串行口的波特率在方式0和方式2中是固定的,只有在方式1和方式3中波特率由定时器的溢出率决定。在uPSD3200系列中,定时器1和定时器2都可以用作串口1和串口2的波特率发生器,仅仅需要在T2CON和PCON寄存器中设置TCLK、TCLK1、 RCLK和RCLK2位就可以了,波特率由定时器1、2的初值TH1、RCAP2H和RCAP2L决定。
例如将串口1和串口2 定义为19200波特率,使用定时器2作为波特率发生器的串口设置源程序如下 :
T2CON = 0x34; // 使用定时器2作为波特率发生器
// 使串口1使用定时器2作为波特率发生器
PCON |= 0x0C; // 使串口2使用定时器2作为波特率发生器
RCAP2L = 0xc6 ; //设置定时器2初值
RCAP2H = 0xff ;
SCON = 0x50; // 初始化串口1
SCON2 = 0x50; // 初始化串口2
EA = 1; // 开中断
SST89C58单片机的在线编程说明
SST89CXX单片机简介
SST89C系列单片机为Flash Flex 51系列单片机,包括SST89C54/58。SST89C5X系列单片机有如下技术特点:
◎ SST89C54/58 片内程序空间包括:高可靠Super Flash EEPROM
16KB(Block0)+4KB(Block1)/32KB+4KB。
◎ 系统在线编程(In-Application Programming-IAP)模式或离线式用万用编程器编程.
? Flash擦写次数达1万次以上,程序保存时间可达到100年;
? 由于Flash具有掉电保持的特性而系统内可编程(IAP)功能提供了象RAM一样的带电状态可随时改写的特性,可用做数据存储器和在线软件升级功能;
◎ 有看门狗(WDT);
? 宽电源范围:2.7V--5V电源
? 具有三种节电模式,使功耗降至最低。
? 与8052系列单片机兼容,片内有RAM 256字节;3个16位定时计数器;4个8位I/O端口;
? 器件有多种加密方式, 是绝不会被解密的单片机;有DIP-40,PLCC-44,TQFP-44三种封装形式等;
SST89C系列单片机,给单片机应用带来全新概念。
6. 开发实验。不需编程器就可做单片机实验,这对初次学习单片机的人们, 尤其对学校单片机教学带来极大的方便。是一种最低成本的单片机开发手段。
7. 产品的软件升级。不需外加监控芯片,只是通过串行口便可将PC机内的产品升级软件下载到产品中去,而实现产品软件升级换代。在自己的实验室便可通过MODEM对远方的产品进行软件升级。这将是以后电子产品的必然趋势。
8. 在线对产品参数的修改。可实现在线对现场历史数据的存储、曲线参数校正等功能。适用一些需经常改变数据的应用产品(如利息计、计费器、密码锁、及需要升级的产品,如微型打印机等)及需远距离改变设备参数的产品( 遥控报警器、遥控家用电器等遥控设备)
9. SST89C5X大容量存储器,更适合一些特殊应用场合,使单片机的产品,只用一片(单片)芯片。
如SST89C5X系列单片机用在线编程方式,则程序空间 (Block1:F000H-F3FFH)高4KB存储器,存放通讯联机操作程序等数据(指本公司研制的IAP_SST系统在线编程提供的监控软件存放的地址范围)。用户也可根据自己的实际情况编写自己的在线编程监控软件,本公司附送监控软件的源代码及其操作说明,以便用户能够真正实现自己产品的软件在线升级,以适应未来的需要。
SST89C5X单片机在线下载管理程序操作:
一.准备工作:
6. 首先确认自己产品线路板上,单片机的串行口有无与PC机相连的RS232的接口电路。如已有,可直接将PC机的RS232接口相连;如没有,需要做一块RS232的接口板与PC机相连。然后在P1.0端加一个对地的跳线,这个主要是用来区分是执行在线下载程序(P1.0=0)还是执行用户程序(P1.0=1)的开关,这个开关用户也可根据我们提供源程序(iap_sst.asm)改为其它端口或软件开关。
7. 将我们提供的在线编程的监控程序的目标代码(iap_sst.hex),通过万用编程器烧录到SST89C58单片机内,再对RB0或RB1位编程,这样这个SST89C58的芯片就具备了在线编程的功能。以后就不需要再用编程器来对它编程了。
8. 将P1.0接地,接好PC机的RS232口,对产品线路板通电。在PC机上执行我们提供的在线下载的管理程序(SST_IAP.EXE),根据操作菜单的提示进行操作即可实现在线编程功能,下面详细介绍:
二.操作步骤:
0- 执行SST_IAP.EXE,出现以下界面:
2.选择1-内部存储器模式,出现界面如下:
3. 选择1-选择芯片型号(58-SST89C58),串行口(1-COM1),波特率(0-自动检测波特率),出现界面如下:
4. 待出现测试串行口通过(显示…PASS…)之后,再选择2-下载的用户程序的目标代码(16进制或二进制文件),例如:TWOBALL.BIN,出现界面如下:
5. 待出现PRIMARY BLOCK VERIFIED OK!字样,说明烧录正确。如没有出现OK!,则说明烧录的内容没有完全通过,再重复第4步下载过程,一般都通过。
6. 下载正确后,将P1.0的跳线拔下(开关指向用户程序),对用户板复位,即可执行用户程序。如果需要再修改用户程序,修改编译完后,插上P1.0的跳线,复位用户板,重复第4步下载过程,将更新的软件烧录到芯片中。如此重复此步骤,即可完成用户程序的调试。
7. 当调试完毕,选择两次0-退出下载管理程序。
8. 下载菜单说明:
0- 退出下载或切换内外存储器模式
1- 选择芯片型号,通讯口以及波特率
2- 下载用户程序到SST89C5X芯片中
3- 读用户板中的SST89C5X芯片的内容并存储到文件中
4- SST89C5X芯片内容的空白检查
5- 擦除SST89C5X芯片的内容
6- 对SST89C5X芯片加密
SST器件型号(Block0)的扇区数十进制与对应十六进制对照表
器件型号SST89F54/58/59
扇区数十进制 对应十六进制单元
1 80H
2 100H
3 180H
4 200H
8 400H
10 500H
20 A00H
30 F00H
32 1000H
64 2000H
128 4000H(16K)
256 8000H(32K)
512 FFFFH(64K)
本公司提供SST89C58在线编程的工具如下:
1.89c58.pdf: SST89C58的DATASHEET
2. SST89C5X_IAP.DOC: 本文件在线编程的操作说明
3.Iap_sst.hex: SST89C58的片内在线编程的目标代码(16进制)
4.iap_sst.asm: SST89C58的片内在线编程的源代码及说明
5.SST_IAP.exe: PC机在线编程SST89C5X的执行程序
附录:SST89C58的片内在线编程的源代码:
;*********************************************************************************************************************
; iap在线编程监控程序示例
;主要介绍SST89C54/SST89C58单片机的IAP在线编程功能,如何使用FLASH寄存器对内部FLASH的操作
; 技术支持: 深圳雅创 田伯运
; TEL: 0755-3762602,3762751
; E-MAIL: tian.boyun@actrontech.com
;*********************************************************************************************************************
; 在线编程操作说明
;用户可用支持SST89C58的编程器(例如:ALL07),将本文件编译后生成的目标文件Iap_sst.hex写入SST89C58,然后再选择"O"项编程CONFIG.BYTE的RB0位,
;这样这片SST89C58就具有了在线编程功能,;在用户板上只要将RXD,TXD,P1.0三线引出来,RXD,TXD接一个RS232电平转换电路与PC机的串行口接起来,
;P1.0口用来选择是在线编程用还是执行用户程序,;P1.0=0处于在线编程状态,P1.0=1处于执行用户程序状态.
; 在线编程时,首先将RS232接口电路与PC机接好,将P1.0接地,用户板通电,在PC机上执行F51pblb3.exe程序,操作步骤为:
; 1.选择"1"内部存储器,回车
; 2.选择"1"选择芯片型号(58)与通信端口(1或2),通信速率(1-38.4K或0-自动检测)(注:单片机晶振为11.592MHZ,也可用其它晶振,波特率要选好)
; 3.选择"2"输入用户的烧写文件名称,即可对SST89C58芯片进行在线编程.
;*********************************************************************************************************************
STATUS EQU 20H ; STATUS = copy of SFCF
BUSY BIT STATUS.2 ; busy flag of CPU on concurrent operation
FLAGS EQU 21H ; FLAGS = bootcode operational & error flags
RX BIT FLAGS.0 ; flag of received data from PC
TX BIT FLAGS.1 ; flag of sent data to PC
ERR BIT FLAGS.2 ; flag of operation error
ERR1 BIT FLAGS.3 ; flag indicating no boot because syst. locked
ERR2 BIT FLAGS.4 ; flag indicating copy error moving boot code
ERR3 BIT FLAGS.5 ; flag indicating incorrect command ID
;****************************************************************
;* *
;* OTHER SFR ADDRESSES *
;* *
;****************************************************************
SFCF EQU 0B1H ; SuperFlash Configuration
SFCM EQU 0B2H ; SuperFlash Command
SFAL EQU 0B3H ; SuperFlash Address Low
SFAH EQU 0B4H ; SuperFlash Address High
SFDT EQU 0B5H ; SuperFlash Data
SFST EQU 0B6H ;SUPERFLASH STATUS
T2CON DATA 0C8H
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
TL2 DATA 0CCH
TH2 DATA 0CDH
WDTC EQU 0C0H ; Watchdog Timer Control
WDTD EQU 86H ; Watchdog Timer Data/Reload
;****************************************************************
;* *
;* REGISTER BANK ASSIGNMENTS *
;* *
;****************************************************************
CMD EQU 02H ; PC command
PCDATA EQU 03H ; PC data
ADRHI EQU 04H ; start address - high byte
ADRLO EQU 05H ; start address - low byte
COUNT EQU 06H ; byte count or size
;---------------------------------------------
baud_h equ 0ffh ;11.0592 MHz, 波特率发生器使用定时器2,定时常数的高位字节
baud_384 equ 0f7h ;11.0592 MHz, 38400 baud的定时常数2的低位字节
baud_192 equ 0eeh ;11.0592 MHz, 19200 baud的定时常数2的低位字节
baud_96 equ 0dch ;11.0592 MHz, 9600 baud的定时常数2的低位字节
baud_48 equ 0b8h ;11.0592 MHz, 4800 baud的定时常数2的低位字节
baud_24 equ 070h ;11.0592 MHz, 2400 baud的定时常数2的低位字节
;定时常数2的计算公式:rcaphl=65536-31250*osc/band
;************************************************************************
; IAP 在线编程主程序
;由于事先已对RB1,RB0编程,上电复位时,通过映射功能,程序首先从0F000H开始执行
;************************************************************************
org 0f000h
ajmp cld_start ;IAP主程序开始
org 0f003h
reti
org 0f00bh
reti
org 0f013h
reti
org 0f01bh
reti
org 0f023h
ljmp rs232 ;串行中断子程序
org 0f02bh
reti
;*****************************************************************************
; 开始执行程序,判断是否执行在线编程程序或用户程序
;*****************************************************************************
org 0f030h
cld_start:
mov SFCF,#0c1h ;VIS=1:F000-FFFFH区可见,
;IAPEN=1,MAP_EN=01:映射有效F000H--F3FFH映射到000H--03FFH
setb p1.0
nop
jb IAP_SW,USER_start ;IAP_SW=0,进入在线编程程序
;用户也可根据其它条件作为执行在线编程或用户程序的开关,
;例如:其它没用到的IO口,或软件开关
AJMP ISP_START
USER_START:
LJMP USER_START1
ORG 0FFFAH
USER_START1:
mov SFCF,#80h ;#80h ;IAP_SW=1,使映射无效,转进入用户程序(0000H--7FFFH)
LJMP 0000H ;执行"mov SFCF,#80h"后,此时PC指针并未改变,
;所以这个语句一定要跳出映射区域.
;*****************************************************************************
; 在线编程程序(IAP)
;*****************************************************************************
isp_start:
mov psw,#00h ;寄存器初始化
mov a,#00h
mov sp,#60h
mov ie,#00h
mov ip,#00h
clr RX
clr TX
anl scon,#0ch ;
orl scon,#50h ; 串行口模式: mode 1 (8-bit UART),8-bits, 1 stop bit, NO parity check
; 允许接收
mov T2CON,#34h ; 波特率发生器使用定时器2,
mov RCAP2H, #baud_h ; 11.0592 MHz, 定时常数的高位字节
mov RCAP2L, #baud_192 ; 11.0592 MHz, 9600 baud定时常数2的低位字节
mov pcon,#00h ; 波特率不加倍
setb es ; 打开串行口中断
setb ea
clr ti
clr ri
ljmp loop
;************************************************************************
;* *
;* WAITING FOR PC COMMANDS *
;* PC COMMAND:
;* 04H--加密 (06)
;* 05H--为读状态命令
;* 06H--闪速编程 (05)
;* 0BH--扇区擦除 (01)
;* 0CH--字节校验 (03)
;* 0DH---块擦除 (04)
;* 0EH--字节编程 (02)
;************************************************************************
loop:
jnb RX,$ ; 等待PC发来的命令
clr RX
mov a,b
mov CMD,a
cmd_S:
cjne a,#05h,cmd1 ;
mov a,SFCF ;05为读状态命令
anl a,#03h
mov r0,a ;取MAP_EN1.0
mov a,SFST ;读状态,读取映射位MAPEN[1.0],忙闲位(BUSY,FLASH_BUSY),保密位(SECD2.1.0)
orl a,r0
jnb TX,$ ;
clr TX
mov sbuf,a ;发送SST89C58的当前状态
cmd0_0:
mov a,SFST ;读状态
anl a,#80h
cjne a,#80h,loop
setb ERR1
ajmp cmd0_0
cmd1:
mov FLAGS,#0c0h ;标志初始化
cjne a,#0bh,cmd2 ;01-扇区(128字节)擦除命令,PC=0BH
mov r0,#01h
ajmp cmd_proc
cmd2:
cjne a,#0eh,cmd3 ;02-字节编程命令,PC=0EH
mov r0,#02h
ajmp cmd_proc
cmd3:
cjne a,#0ch,cmd4 ;03-字节校验命令,PC=0CH
mov r0,#03h
ajmp cmd_proc ;
cmd4:
cjne a,#0dh,cmd5
mov r0,#04h ;04-块擦除,PC=0DH
ajmp cmd_proc
cmd5:
cjne a,#06h,cmd6
mov r0,#05h ;05-闪速编程,PC=06H
ajmp cmd_proc
cmd6:
cjne a,#04h,cmd_err
mov r0,#06h ;加密
ajmp cmd_proc
cmd_err:
setb ERR3 ;接收为无效命令代码,置错误标志--ERR3
ajmp loop
nop
nop
ajmp loop ; 软件陷阱
nop
nop
nop
ajmp loop ; 软件陷阱
;************************************************************************
;* 命令执行过程 *
;************************************************************************
cmd_proc:
clr c
mov a,r0 ;
subb a,#07h ;校验输入命令,不在1-6之间,为无效命令
jnc cmd_end
cjne r0,#06h,cmd_1
sjmp cmd_6 ;06-转加密编程
cmd_1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -