⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drivers.asm

📁 SPCE061A为核心的转换控制(Drivers汇编代码):以太网 RS232
💻 ASM
📖 第 1 页 / 共 3 页
字号:
///
 // Copyright (c) 2003, Wolver Wang, MinShan Inc. R&D Center
 // wolver@minshan-inc.com
 // All rights reserved. 
 //
 // Redistribution and use in source and binary forms, with or without 
 // modification, are permitted provided that the following conditions 
 // are met: 
 // 1. Redistributions of source code must retain the above copyright 
 //    notice, this list of conditions and the following disclaimer. 
 // 2. Redistributions in binary form must reproduce the above copyright 
 //    notice, this list of conditions and the following disclaimer in the 
 //    documentation and/or other materials provided with the distribution. 
 // 3. All advertising materials mentioning features or use of this software
 //    must display the following acknowledgement:
 //      This product includes software developed by Wolver Wang.
 // 4. The name of the author may not be used to endorse or promote
 //    products derived from this software without specific prior
 //    written permission.  
 //
 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 ///
 

///
 // Copyright (c) 2003, Wolver Wang, MinShan Inc. R&D Center
 // wolver@minshan-inc.com
 // All rights reserved. 
 //
 // Redistribution and use in source and binary forms, with or without 
 // modification, are permitted provided that the following conditions 
 // are met: 
 // 1. Redistributions of source code must retain the above copyright 
 //    notice, this list of conditions and the following disclaimer. 
 // 2. Redistributions in binary form must reproduce the above copyright 
 //    notice, this list of conditions and the following disclaimer in the 
 //    documentation and/or other materials provided with the distribution. 
 // 3. All advertising materials mentioning features or use of this software
 //    must display the following acknowledgement:
 //      This product includes software developed by Wolver Wang.
 // 4. The name of the author may not be used to endorse or promote
 //    products derived from this software without specific prior
 //    written permission.  
 //
 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 ///
 

///
 // 版权 2003, 王卫无,四川绵阳岷山集团有限公司--研究开发中心
 // wolver@minshan-inc.com
 // 保留一切权利
 //
 // 如果符合以下条件,则无论是以原代码或非原代码代码形式,且不论是否修改,
 // 再分发和使用本软件都是被允许的。
 // 1. 原代码的再分发必须保留上述的版权声明、本条件说明和以下免责声明。
 // 2. 非原代码形式的再分发,必须在证明文件和(或)其它一同提供的材料中重新
 //    作上述的版权声明、本条件说明和以下免责声明。
 // 3. 一切提及本软件和使用的广告材料必须显示以下致谢:
 //    本产品包含王卫无(四川绵阳岷山集团有限公司--研究开发中心)开发的软件。
 // 4. 如果没有预先得到特定的书面许可,不能用作者的名字来宣传推广基于本软件得到
 //    的产品。
 //
 // 免责声明:
 // 本软件是由某某作者提供,如果出现以下情况,作者都不承担任何责任。
 // 1. 因作者的说明以及任何明确的或暗示的保证(包括但不限于表达某种商业性和适合某一
 //    特定目的暗示性保证)而产生的损失。
 // 2. 无论在何种情况下,对使用本软件造成的任何直接的、间接的、偶然的、特定的、可预
 //    见性的和连带产生的损失(包括但不限于获取产品和服务、作用丧失、数据遗失、利益损
 //    失或商业干预),无论这些损失是怎样造成的,并且是以何种方式阐释责任。
 // 3. 任何因使用本软件而相关的合同、严格赔偿责任和侵权行为(包含:疏忽或其它)的损失,
 //    甚至即便是可能的此类已经明示或暗示的损失。
 ///




.include spce061a.inc
.include rtl8019as.inc



// 定义全局变量及相关常数 -------------------------------------
// 说明:
// 供外部C语言引用的全局定义,所有外部的引用定义必须和这里的定义
// 相同。包括宏的定义。
// 这样做是方便以后封装成lib使用

.isram
//时基2Hz中断统计次数统计,原始定义
.public _guwTime2
_guwTime2: .dw 0

// 系统消息状态(按bit定义),原始定义
.isram 
.public _guwMsg_Route
_guwMsg_Route: .dw 0
.define cM_ARP_TIME			0x0001			// ARP表老化事件
.define cM_TCP_PERIODIC		0x0002			// TCP轮询事件
.define cM_ADC_ENABLE		0x0004			// 允许ADC 转换开始
.define cM_DAC1_ENABLE		0x0008			// 允许DAC1转换开始
.define cM_DAC2_ENABLE		0x0010			// 允许DAC2转换开始

// 分配系统应用临时缓冲区(按 wrod 定义),引用drivers.h里的定义(包括宏)
.external _guwAppBuf

// 保存UART已接收到的Byte长度,原始定义
.isram
.public _guwUartRxLen
_guwUartRxLen:  .dw 0
// UART接收缓冲区地址,按Word存放,引用drivers.h里的定义
.define _guwRxBuf _guwAppBuf
// 定义UART已接收到的Byte长度上限,引用drivers.h里的定义
.define cUART_RX_MAXLEN   1460    // 必须小于等于guwAppBuf的Byte容量

// 保存 MIC A/D 已接收到的Byte长度,原始定义
.isram
.public _guwMicRxLen
_guwMicRxLen:  .dw 0
// MIC A/D 接收缓冲区地址,按Word存放,引用drivers.h里的定义
.define _guwMicRxBuf _guwAppBuf
// 定义MIC A/D允许使用的最大缓存,按Byte计算,引用drivers.h里的定义
.define cMIC_RX_MAXLEN   730    // 必须小于等于(guwAppBuf/2)的Byte容量

// 保存 DAC1 已转换完成的Byte长度,原始定义
.isram
.public _guwDAC1TxLen
_guwDAC1TxLen:  .dw 0
// DAC1 发送缓冲区地址,按Word存放,引用drivers.h里的定义
.define _guwDAC1TxBuf   (_guwAppBuf + cMIC_RX_MAXLEN)
// 定义DAC1允许使用的最大缓存,按Byte计算,引用drivers.h里的定义
.define cDAC1_MAXLEN   cMIC_RX_MAXLEN    // 必须等于guwMicRxBuf的Byte容量
// 定义当前DAC1需要转换的总Byte长度(当存放值超过cDAC1_MAXLEN,会自动截为cDAC1_MAXLEN的长度),原始定义
.isram
.public _guwDAC1TotalLen
_guwDAC1TotalLen: .dw 0






//////////////////////////////////////////////////////////////////
//Define Interrupt Vector Programm
//////////////////////////////////////////////////////////////////
.text
.public _FIQ
_FIQ: .proc
	fiq off
	push R1, BP to [SP]				//
	BP = C_FIQ_TimerB
	test BP, [P_INT_Ctrl]
	jnz FIQ_TimerB
	BP = C_FIQ_TimerA
	test BP, [P_INT_Ctrl]
	jnz FIQ_EXIT
	BP = C_FIQ_Fosc_1024
FIQ_TimerA:
	[P_INT_Clear] = BP			//
// Write your TimerA code here...
	PC = FIQ_EXIT
FIQ_TimerB:
	[P_INT_Clear] = BP			//
// Write your TimerB code here...

// First: We proceess D/A
DAC1_PROCESS:
	R4 = [_guwDAC1TxLen]		// 读DAC1已经转换完的Bytes
	cmp R4, [_guwDAC1TotalLen]	// 比较是否转换完成
	jae MIC_AD_PROCESS			// if guwDAC1TxLen >= guwDAC1TotalLen then ByPass DAC1
	BP = R4 lsr 1				// 计算缓冲区地址,BP存放缓冲区地址
	BP += _guwDAC1TxBuf			//
	R3 = [BP]					// 读转换数据(bit15:6有效)
	R4 += 1						// 计算下一个Byte的长度
	test R4, 1					// 判断长度的奇偶性
	jz DAC1_EVEN
DAC1_ODD:  // 将要处理奇byte,它在High_8bit	
	R3 &= 0xff00				// 丢最后2bit(bit7:6 = 0)
	jmp DAC1_START
DAC1_EVEN:  // 将要处理偶byte,它在Low_8bit	
	R3 = R3 lsl 4				// 由Low_8bit -> High_8bit
	R3 = R3 lsl 4				// 
DAC1_START:
	R3 |= 0x0080				// 补偿误差(bit7 = 1)
	[P_DAC1_Data] = R3			// 启动DAC1转换
	[_guwDAC1TxLen] = R4		// 更新已转换完成长度

// Second: We process A/D
MIC_AD_PROCESS:
	R4 = [_guwMicRxLen]			// 读当前MIC_AD的长短
	cmp R4, cMIC_RX_MAXLEN		// 比较缓冲是否用完
	jae FIQ_EXIT				// 没有缓冲区,不做MIC_AD转换
	R3 = [P_ADC_Data]			// 读转换数据(bit15:6有效)
	BP = R4 lsr 1				// 计算缓冲区地址,BP存放缓冲区地址
	BP += _guwMicRxBuf			//
	R4 += 1						// 计算下一个Byte的长度
	test R4, 1					// 判断长度的奇偶性
	jz MIC_AD_EVEN
MIC_AD_ODD:  // 将要处理奇byte,它在High_8bit	
	R3 &= 0xff00				// 丢最后2bit(bit7:6 = 0)
	jmp MIC_AD_OVER
MIC_AD_EVEN:  // 将要处理偶byte,它在Low_8bit	
	R3 = R3 lsr 4				// 由High_8bit -> Low_8bit, 并丢弃AD的最后2bit
	R3 = R3 lsr 4				// 
	R2 = [BP]					// 读原来的High_8bit
	R3 |= R2					// 组合原来的High_8bit
MIC_AD_OVER:
	[BP] = R3					// 写到缓冲区
	[_guwMicRxLen] = R4			// 更新已转换完成长度

FIQ_EXIT:
	pop R1, BP from [SP]
	fiq on	
	reti
.endp

.text
.public _IRQ0
_IRQ0: .proc
	irq off
	push BP to [SP]				//
	BP = C_IRQ0_Fosc_1024
	[P_INT_Clear] = BP			//
// Write your PWM code here....
IRQ0_EXIT:
	pop BP from [SP]
	irq on	
	reti
.endp

.text
.public _IRQ1
_IRQ1: .proc
	irq off
	push BP to [SP]				//
	BP = C_IRQ1_TimerA
	[P_INT_Clear] = BP			//
// Write your TimerA code here...
IRQ1_EXIT:
	pop BP from [SP]
	irq on	
	reti
.endp

.text
.public _IRQ2
_IRQ2: .proc
	irq off
	push BP to [SP]				//
	BP = C_IRQ2_TimerB
	[P_INT_Clear] = BP			//
// Write your TimerB code here...
IRQ2_EXIT:
	pop BP from [SP]	
	irq on
	reti
.endp

.text
.public _IRQ3
_IRQ3:	.proc
	irq off
	push BP to [SP]				//
	BP = C_IRQ3_KeyChange
	test BP, [P_INT_Ctrl]
	jnz IRQ3_KeyChange
	BP = C_IRQ3_Ext1
	test BP, [P_INT_Ctrl]
	jnz IRQ3_Ext1
	BP = C_IRQ3_Ext2
IRQ3_Ext2:
	[P_INT_Clear] = BP			//
// Write your 'Ext2' code here...
	PC = IRQ3_EXIT
IRQ3_Ext1:
	[P_INT_Clear] = BP			//
// Write your 'Ext1' code here...
	PC = IRQ3_EXIT
IRQ3_KeyChange:
	[P_INT_Clear] = BP			//
// Write your 'KeyChange' code here...
IRQ3_EXIT:
	pop BP from [SP]
	irq on	
	reti
.endp

.text
.public _IRQ4
_IRQ4: 	.proc					//
	irq off
	push BP to [SP]				//
	BP = C_IRQ4_1024Hz			//
	test BP, [P_INT_Ctrl]
	jnz IRQ4_1024Hz
	BP = C_IRQ4_2048Hz			//
	test BP, [P_INT_Ctrl]
	jnz IRQ4_2048Hz
	BP = C_IRQ4_4096Hz			//
IRQ4_4096Hz:
	[P_INT_Clear] = BP			//
// Write you code here.....
	PC = IRQ4_EXIT
IRQ4_2048Hz:
	[P_INT_Clear] = BP			//
// Write you code here.....
	PC = IRQ4_EXIT
IRQ4_1024Hz:
	[P_INT_Clear] = BP			//
// Write you code here.....
IRQ4_EXIT:
	pop BP from [SP]			//
	irq on
	reti;
.endp

.text
.public _IRQ5
_IRQ5: .proc
	irq off
	push R4, BP to [SP]			//
	BP = 1						//
	[P_Watchdog_Clear] = BP		// Clear Watchdog(@750mS)!
	BP = C_IRQ5_2Hz				//
	test BP, [P_INT_Ctrl]
	jnz IRQ5_2Hz
	BP = C_IRQ5_4Hz				//
IRQ5_4Hz:
	[P_INT_Clear] = BP			//
// Write you code here.....
	PC = IRQ5_EXIT
IRQ5_2Hz:						//
	[P_INT_Clear] = BP			// Clear Time_Base 2Hz Interrupt
	BP = [_guwTime2]			// 统计已过秒数
	BP += 1						//
	[_guwTime2] = BP			//
	test BP, 0x0001				// 添加TCP轮询事务@1秒
	jz IRQ5_2Hz_1				// guwTime2是奇数有效
	R4 = [_guwMsg_Route]		// guwTime2 = 1,3,5...  TCP轮询事务
	R4 |= cM_TCP_PERIODIC		//
	[_guwMsg_Route] = R4		//
IRQ5_2Hz_1:
	test BP, 0x000f				// ARP表老化检测 @ 8秒 
	jnz IRQ5_EXIT				// guwTime2是偶数有效
	R4 = [_guwMsg_Route]		// guwTime2 = 0,16,32... ARP表老化检测
	R4 |= cM_ARP_TIME			//
	[_guwMsg_Route] = R4		//
IRQ5_EXIT:
//	[P_TimeBase_Clear] = PC		// 校准时基,因为PC正常运行时永不为0
	pop R4, BP from [SP]		//
	irq on
	reti
.endp

.text
.public _IRQ6
_IRQ6: .proc
	irq off
	push BP to [SP]
	BP = C_IRQ6_TMB1
	test BP, [P_INT_Ctrl]
	jnz IRQ6_TMB1
	BP = C_IRQ6_TMB2
IRQ6_TMB2:
	[P_INT_Clear] = BP			//
// Write you TMB2 code here.....
	PC = IRQ6_EXIT
IRQ6_TMB1:
	[P_INT_Clear] = BP			//
// Write you TMB1 code here.....
IRQ6_EXIT:
	pop BP from [SP]	
	irq on
	reti
.endp

.text
.public _IRQ7
_IRQ7: .proc
// Write you code here.....
	irq off
	push R2, BP to [SP]
	R2 = [P_UART_Data]		// 读UART
	R4 = [_guwUartRxLen]	// 保存Byte长度给guwUartRxLen

	cmp R4, cUART_RX_MAXLEN
	jae IRQ_7_EXIT			// 接收缓冲区益出?

	BP = R4 lsr 1			// 转换byte长度为word长度,得到将要存放word的buffer位置。
	BP +=  _guwRxBuf		// 保存Word缓冲区位置
	R4 += 1					// 接收Byte长度加1,给guwUartRxLen

	test R4, 0x0001			// 从UART接收的Byte将置放在word缓冲区的:高8位
	jz IRQ7_1
	R2 = R2 lsl 4			// 写word缓冲区高8位,低8位忽略
	R2 = R2 lsl 4			//
	[BP] = R2				//
	jmp IRQ7_2
// 从UART接收的Byte将置放在word缓冲区的:低8位	
IRQ7_1:
	R3 = [BP]				// 读当前word缓冲区
	R3 &= 0xff00			// 保留高8位

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -