📄 uart.asm
字号:
//======================================================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//========================================================================================
// 工程名称: book_UART.spj
// 功能描述: 异步通讯自发自收程序
// 准备5个数据分别是'0x55aa,0xff55,0x1010,0x3344,0x66aa' 发送
// 同时程序接收自身发送的数据,
// 文件来源: 《SPCE061单片机原理及应用技术》第五章 中断系统,第197页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
//
// 涉及的库:
//
// 组成文件:
// main.asm/hardware.asm
// hardware.inc/hardware.h
//
// 日期: 2002-6-12
//===========================================================================================
.INCLUDE hardware.inc
.DEFINE UART_DATA_SIZE 0x0005;
.DATA //发送的数据
SendData: .DW 0x55aa,0xff55,0x1010,0x3344,0x66aa
.ISRAM
.PUBLIC RecData //接收数据缓冲区
RecData: .DW 5 dup(0);
.VAR recNum //接收数据个数
.VAR sendNum //发送数据个数
.VAR sendFlag; //1,发送高8位,0,发送低8位
.VAR recFlag //1,接收高8位,0,接收低8位
.CODE
//========================================================================
//主程序
//========================================================================
.PUBLIC _main;
_main:
r2 = RecData;
_UART_INIT:
F_UART_INIT:
r1 = 0x0480; //设置IOB7为输入IOB10为输出
[P_IOB_Attrib] = r1;
r1 = 0x0400;
[P_IOB_Dir] = r1;
r1 = 0x0000;
[P_IOB_Data] = r1;
r1 = 0x006b; //设置波特率 114.84KHz(~=115.2KHz)
[P_UART_BaudScalarLow] = r1;
r1 = 0x0000;
[P_UART_BaudScalarHigh] = r1;
r1 = 0x00C0;
[P_UART_Command1] = r1; //开接收发送中断
[P_UART_Command2] = r1; //使能RX和TX
r1 = 0x0000;
[sendNum] = r1; //初始化发送数据个数
[recNum] = r1; //初始化接收数据个数
r1 = 0x0001 ;
[sendFlag] = r1; //初始化发送位标识
[recFlag] = r1; //初始化接收位标识
int IRQ; //开中断
loop:
nop;
goto loop;
//=============================================================================
//串口中断
//描述:在发送中断中发送数据,接收中断中接收数据
//注意:串口异步通讯每次只能收发一个字节的数据,所以无论是
//接收数据和发送数据需进行移位处理
//=============================================================================
.TEXT
.PUBLIC _IRQ7
UART_RECC_IRQ:.PROC
_IRQ7:
INT OFF
push r1,r5 to [sp]
r1 = 0x0080 //判断是接收还是发送数据
test r1,[P_UART_Command2]
jnz UART_RECV_IRQ;
//发送数据处理
UART_SEND_IRQ:
r2 = [sendFlag];
r2 ^= 0x0001
[sendFlag] = r2; //发送位标识取反
r1 = SendData;
r4 = [sendNum]
r3 = UART_DATA_SIZE
cmp r4,r3; //数据是否发送结束
je exit_INT; //结束,退出发送
//继续发送处理
r1 = r1+r4
r1 = [r1] //取发送数据
r2 = [sendFlag]
jz Send_Data;
//发送一个字的高八位
r1 = r1 lsr 4;
r1 = r1 lsr 4; //发送高8位
r4 += 1; //发送的数据加1
[sendNum] = r4;
Send_Data:
[P_UART_Data] = r1 ; //发送数据
goto exit_INT;
UART_RECV_IRQ:
r2 = [recFlag];
r2 ^= 0x0001 //接收标识取反
[recFlag] = r2;
r4 = [recNum];
r3 = UART_DATA_SIZE
cmp r3,r2; //数据是否接收结束
je exit_INT; //接收结束,退出接收
//否则,继续接收
r1 = [P_UART_Data] ; //接收数据
r2 = [recFlag] //接收低8位数据
jnz Shift_Data;
r3 = r4 + RecData; //保存数据低8位
[r3] = r1;
goto exit_INT;
Shift_Data: //接收高8位数据
r1 = r1 lsl 4
r1 = r1 lsl 4;
r2 = [recNum];
r3 = r2 + RecData; //保存数据高8位
r4 = [r3]
r4 |= r1;
[r3] = r4;
r2 += 1; //接收数据数量加1
[recNum] = r2;
exit_INT:
pop r1,r5 from [sp];
int IRQ,FIQ
reti;
.ENDP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -