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

📄 function.asm

📁 SPT6608平台软件
💻 ASM
📖 第 1 页 / 共 3 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////
//| 文件名:function.asm
//| 功  能:将系统需要的各项功能封装为模块函数
//| 编码人:陈欣蕊
//| 版  本:V1.0
//| 时  间:2005.11.25
//| 修改历史:
////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////
//| 包含的头文件
.include SPT6608.INC
.include main.h

////////////////////////////////////////////////////
//| 外部函数声明
.external F_ChNameInit



////////////////////////////////////////////////////
//| 全局函数定义

//系统初始化
.public F_WakeUpCheck;								//判断是否是从standby模式唤醒
.public F_CPUInit;									//CPU硬件资源复位
.public F_PlatInit;									//软件平台和各项参数初始化
.public F_Restore;									//系统唤醒后各项参数恢复

//消息队列函数
.public F_PostMessage;								//投递消息函数
.public F_GetMessage;								//获取消息函数
.public F_ClearMessage;								//清消息队列函数



//UART处理
.public F_UARTProc;

.public F_UARTSetBaudRate;							//设置波特率处理模块
.public F_UARTGotoSleep;							//进入休眠状态
.public F_UARTGotoSleep1;

.public F_UARTSendByte;								//串口发送BYTE
.public F_UARTSendWord;								//串口发送WORD
.public F_UARTSendBuffer;							//串口发送Buffer

//系统函数
//.public F_UARTInit;								//系统重新初始化
.public F_Delay;									//延时程序


.public F_TimerAEnable;								//使能TimerA中断
.public F_TimerADisable;							//禁止TimerA中断
.public F_TimerBEnable;								//使能TimerB中断
.public F_TimerBDisable;							//禁止TimerB中断

.public F_ComposePlay;
.public F_PhrasePlay;
.public F_SoundPlay
.public F_StopPlay
.public F_VolumeSet
//.public F_bMultiVoiceMode
.public F_SetSpaceTime
.public F_SetSilenceTime
.public F_SetPlayTime
.public F_ClearPlayRam
.public F_ClearOnePlayRam
.PUBLIC F_SPT6608_Init



.Public			RW_Length,RW_CountAddr;
.Public			RW_Flag,RW_Address,RW_Temp1;

.external  	  _RES_CHIMES24_ENC_SA;
.external     _RES_CORRECT24_ENC_SA;
.external     _RES_FOLDER24_ENC_SA;
.external     _RES_LING24_ENC_SA;
.external     _RES_MCITEST24_ENC_SA;
.external     _RES_RIGHT_ENC_SA;
.external     _RES_SYSMSG24_ENC_SA;


.ram 
.var		RW_DebounceReg	
.VAR		RW_KeyBufOld;           
.VAR		RW_KeyCode;        
.VAR		RW_Flag
.var		RW_Length
.Var		RW_Address
.var		RW_CountAddr
.var		RW_Temp1
.var        TTS_Status
.var        R_StrLen

.const  B_RecordBeginAddr  =  0x1000
.public R_Resouce_BS
.public R_Resouce_DS
.var R_Resouce_BS
.var R_Resouce_DS

.const  B_PhraseNum  =  0x41
.const  B_SoundNum  =  0x07

.define     C_UserBuffer	0x1000;     
.define		C_EndAddrBuf	0x6FFF
.define		C_EndAddrFlag	0x2
.define		C_RecEndFlag	0x1


////////////////////////////////////////////////////
//| 函数模块实现
.CODE

////////////////////////////////////////////////////
//| 函数名:F_WakeUpCheck
//| 功  能:检测系统是否是从休眠模式刚刚被唤醒的
//| 入  口:无
//| 出  口:R1 =C_True 	被唤醒
//|            =C_False	不是被唤醒的
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_WakeUpCheck:
				R1 = [P_WakeUpClr];
				TEST R1, 0x0002						//保留其低11位
				JZ ?_WakeUpCheck_False;				//是0,表示不是被唤醒的
				R1 = C_True;
				JMP ?_WakeUpCheck_Quit;
?_WakeUpCheck_False:
				R1 = C_False;
?_WakeUpCheck_Quit:
				RETF
//END F_WakeUpCheck;

////////////////////////////////////////////////////
//| 函数名:F_CPUInit
//| 功  能:对硬件进行初始化
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_CPUInit:
				PUSH R1, R5 TO [SP];
//IO口初始化
				r1 =	0x00FF
				[P_IOA_Dir] = r1			//Set IOA as output ports
        		[P_IOB_Dir] = r1			//Set IOB as output ports
        		[P_IOC_Dir] = r1			//Set IOC as output ports
				R1 = 0x7F;
				[P_IOE_Dir] = R1;                    //IOE7设置为输入
				R1 = 0x8000; 
				[P_IOE_PullR] = R1;		             //IOE7上拉电阻
				R1 = 0x0080
				[P_IoeWakeUp] = R1;                  //设置IOE7唤醒
				
				R1 = [P_IOE_Latch];
				
				R2 = 0x00FF;
				[P_IOD_Dir] = R2;					//设置IOD为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOD_Data] = R2;
				R2 = 0x00FF;
				[P_IOA_Dir] = R2;					//设置IOA为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOA_Data] = R2;
				R2 = 0x00FF;
				[P_IOB_Dir] = R2;					//设置IOB为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOB_Data] = R2;
				R2 = 0x00FF;
				[P_IOC_Dir] = R2;					//设置IOC为输出状态(都设置为输出状态--低功耗)
                R2 = 0x0000;
				[P_IOC_Data] = R2;
//允许串行中断、定时器中断
				R1 = 0x0020;
				[P_UARTCmd1] = R1;	
				
				R1 = B_RxIntEn; //Set register again 
				[P_UARTCmd1] = R1; //Enable RX , auto-calibrate clock 
				R1 = B_TxIntEn | B_RxIntEn;
				[P_UARTCmd2] = R1;
										
				CALL  F_UARTConfigCheck
				CALL  F_UARTSetBaudRate
								
                //设置时钟源和计数			
				R1 =B_8KHz+B_Enable32768+B_Strong32768+B_128Hz
		        [P_TimeBaseSet] = R1;  
		        
		        R1 = B_UARTInt | B_IoaInt| B_T128HzInt;// | B_TmrBInt;//B_TmrAInt ;//允许UART、timerA、timerB中断
				[P_Int] = R1;
				[P_IntClr] = R1;
				
				R1 = 0x8000;
				[R_DAC] = R1;
				[P_DAC] = R1;    
		        
		        nop
				R1 = 0x55AA
				R2 = 16
				R4 =0
				R3 = R1 ror 4
		
				R3 = R1 ror 4
Loop1:
				R3 = R3 LSL 1
				R2 -=1
				JNZ		Loop1		
			
		     	//timerA定时中断16K
				R1 = 0xFFFE;
				[P_TmrA_Data] = R1;
				[P_TmrA_Load] = R1;
				
				R1 = C_WaitTime1000;							//timerB定时中断50ms
				[P_TmrB_Data] = R1;
				[P_TmrB_Load] = R1;
				
				R1 = 0xD5D0;//0xD5D0;//0xDDD0;                           //定时器A使能
				[P_Tmr_Ctrl] = R1;
				//关闭PGA等等
				r1 =	0x55aa
				[P_Watchdog_Clr] = r1			//Reset watchdog
				R1 = 0xFFFF
				[P_IntClr] = R1
				Int IRQ,FIQ;
				nop
				POP R1, R5 FROM [SP];
				RETF
//END F_CPUInit;

////////////////////////////////////////////////////
//| 函数名:F_PlatInit
//| 功  能:对软件平台进行初始化
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_PlatInit:
				PUSH R1 TO [SP];
				//消息队列初始化
				R1 = MsgQueue;
				[R_MQHeadPtr] = R1;
				[R_MQTailPtr] = R1;
				
				R1 = M_Null;
				[R_MessageType] = R1;				//消息全局变量设置为空消息
				R1 = 0x0000;
				[R_MsgNum] 	     = R1;				//消息队列中消息的个数设置为0
				[R_MessageValue] = R1;				//消息参数全局变量设置为0
				[R_CommandType]  = R1;				//命令全局变量设置为0
				[R_CommandValue] = R1;				//命令参数变量设置为0
				[R_playnumhead]  = R1;              //清播放队列的头
				[R_playnumtail]  = R1;			    //清播放队列的尾	
				[R_playnum]      = R1;              //清空播放条数
				[R_MultiMode]    = R1;              //姓名多音字设置默认为无效
				R1 = 15
				[R_spacetime] = R1;
				R1 = 80
				[R_chartime] = R1;
				R1 = 0                              //默认设置为延时0s                
				[R_playspacetime] = R1;
				R1 = 0x0F
				[R_VolumeSet] = R1;

				R1 = C_True
				[R_PlayName] =  R1;                 //初始化为播放姓名
				R1 = C_False
				[R_StopSign] = R1
								
				R1 = C_False;   
				[R_ValidFrame] = R1
				POP R1 FROM [SP];
				RETF;
//END F_PlatInit;

////////////////////////////////////////////////////
//| 函数名:F_UARTConfigCheck
//| 功  能:检测UART跳线设置
//| 入  口:无
//| 出  口:R1 
//| 		   =C_UARTConfig9600	不跳线时波特率配置为9600
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_UARTConfigCheck:
				PUSH R2 TO [SP];
				R1 = 0x0078;
				[P_IOE_Dir] = R1;					//IOE0-2 配置为输入
				R1 = 0x8700;
				[P_IOE_PullR] = R1;					//将IOE0-2配置为PULL HIGH
				R1 = [P_IOE_Data];
			    R1 &= 0xFF			
				CMP R1 , 0
				JE  ?_UARTConfigCheck_1200
				CMP R1 , 1
				JE  ?_UARTConfigCheck_2400
				CMP R1 , 2
				JE  ?_UARTConfigCheck_4800
				CMP R1 , 3
				JE  ?_UARTConfigCheck_19200
				CMP R1 , 4
				JE  ?_UARTConfigCheck_38400
				CMP R1 , 5
				JE  ?_UARTConfigCheck_57600
				CMP R1 , 6
				JE  ?_UARTConfigCheck_115200
				CMP R1 , 7
				JE  ?_UARTConfigCheck_9600
				JMP ?_UARTConfigCheck_9600
?_UARTConfigCheck_1200:				
                R1 = C_UARTConfig1200;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_2400:				
                R1 = C_UARTConfig2400;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_4800:				
                R1 = C_UARTConfig4800;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_19200:				
                R1 = C_UARTConfig19200;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_38400:				
                R1 = C_UARTConfig38400;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_57600:				
                R1 = C_UARTConfig57600;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_115200:				
                R1 = C_UARTConfig115200;
				JMP ?_UARTConfigCheck_Quit;
?_UARTConfigCheck_9600:				
                R1 = C_UARTConfig9600;
?_UARTConfigCheck_Quit:              
//恢复IOE1低功耗状态
//				R2 = 0x007F;
//				[P_IOE_Dir] = R2;					//将IOE6配置为输出状态,其他设置为输入状态
//				R2 = 0x0000;
//				[P_IOE_PullR] = R2;					//将IOE全部悬空
				POP R2 FROM [SP];
				RETF
//END F_UARTConfigCheck;

////////////////////////////////////////////////////
//| 函数名:F_Restore
//| 功  能:当系统被唤醒后恢复系统的默认的设置
//| 入  口:无
//| 出  口:无
//| 影响的寄存器:无
////////////////////////////////////////////////////
F_Restore:
				PUSH R1 TO [SP];
				//关闭唤醒触发
				//恢复波特率
				
				R1 = C_False
				[R_StopSign] = R1

				R1 = 0x0020;
				[P_UARTCmd1] = R1;					//串口初始化
				
				R1 = B_RxIntEn;
				[P_UARTCmd1] = R1;
				R1 = B_RxIntEn | B_TxIntEn;
				[P_UARTCmd2] = R1;
				
								
				R1 = [R_UARTStatus];
				CALL F_UARTSetBaudRate;
				
?_Restore_Uart:				
				R1 = [P_UARTCmd2]
				R1 &=  0x01
				JZ  ?_Restore_Uart
			    R1 = [P_UARTData]                  //清除PE,OE       		

				R1 = B_UARTInt | B_IoaInt | B_T128HzInt;
				[P_Int] = R1;
				[P_IntClr] = R1;
				
				CALL F_ClearMessage;
				POP R1 FROM [SP];
				RETF
//END F_Restore;

////////////////////////////////////////////////////
//| 函数名:F_PostMessage
//| 功  能:向系统消息队列投递消息的函数
//| 入  口:R1 消息类型
//| 出  口:R1 =C_True 成功 =C_False 失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_PostMessage:
				PUSH R2 TO [SP];
				R2 = [R_MsgNum];
				CMP R2, C_MQLen
				JGE ?_PostMessage_Quit1;			//如果消息队列中的消息个数已经达到上限,退出(C_False)
				//投递消息
				R2 = [R_MQHeadPtr];
				[R2] = R1;							//消息放入到消息队列
				
				//消息队列中消息个数++
				INT OFF
				R1 = [R_MsgNum];
				R1 += 1;
				[R_MsgNum] = R1;	
				INT FIQ, IRQ
				
				R1 = C_True;						//设置返回值为C_True;
				
				//移动消息队列尾指针
				CMP R2, MsgQueue + C_MQLen - 1
				JL ?_PostMessage_Next;				//如果消息队列头指针没有到达缓冲区最后,直接++
				//否则尾指针回到消息缓冲区头
				R2 = MsgQueue;
				[R_MQHeadPtr] = R2;
				JMP ?_PostMessage_Quit;				//返回
?_PostMessage_Next:
				R2 += 1;
				[R_MQHeadPtr] = R2;					//消息队列头指针++
				JMP ?_PostMessage_Quit;
?_PostMessage_Quit1:
				R1 = C_False;
?_PostMessage_Quit:
				POP R2 FROM [SP];
				RETF
//END F_PostMessage;

////////////////////////////////////////////////////
//| 函数名:F_GetMessage
//| 功  能:从系统消息队列中获取消息的函数
//| 入  口:无
//| 出  口:[R_MessageType]的消息值
//|			R1 =C_True 成功 =C_False 失败
//| 影响的寄存器:R1
////////////////////////////////////////////////////
F_GetMessage:
				PUSH R2 TO [SP];
				R1 = [R_MsgNum];
				JZ ?_GetMessage_Failure;			//系统消息队列中没有消息,跳转退出
				
				R2 = [R_MQTailPtr];
				R1 = [R2];
				[R_MessageType] = R1;				//取消息到消息全局变量中
				
				//消息队列中的消息个数--
				//INT OFF
				R1 = [R_MsgNum];
				R1 -= 1;
				[R_MsgNum] = R1;
				//INT FIQ, IRQ
				
				R1 = C_True;						//设置返回值=C_False
				
				CMP R2, MsgQueue + C_MQLen - 1
				JL ?_GetMessage_Next;				//尾指针可以直接++处理
				R2 = MsgQueue;
				[R_MQTailPtr] = R2;
				JMP ?_GetMessage_Quit;				//将尾指针设置到消息缓冲区的头
?_GetMessage_Next:
				R2 += 1;
				[R_MQTailPtr] = R2;
				JMP ?_GetMessage_Quit;				//重新设置尾指针,退出
?_GetMessage_Failure:
				R1 = M_Null;
				[R_MessageType] = R1;				//取消息失败,消息变量设置为空消息
				R1 = C_False;						//返回值设置C_False
?_GetMessage_Quit:
				POP R2 FROM [SP];
				RETF

⌨️ 快捷键说明

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