📄 drivers.asm
字号:
///
// 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 + -