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

📄 syshal.c

📁 周立功Magic2410开发板uCOS-II基础实验的ModBus主从通信源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                  广州致远电子有限公司
**
**                                 http://www.21cm.com.cn
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: syshal.c
**创   建   人: 周立山
**最后修改日期: 2006年2月23日
**描        述: Modbus基于MagicARM2410低层驱动移植文件。
**                
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

/**********************************
** RS485 收发初始化
***********************************/
#define RS_485_S_R		13							// 485发送与接收控制引脚,初始化GPIO
#define RS_485_INI()	rGPECON = (rGPECON & (~(0x03<<26))) | (0x01<<26);
						
		
#define RS_485_S()		rGPEDAT |= (1<<RS_485_S_R);		// 485发送使能
#define RS_485_R()		rGPEDAT &= ~(1<<RS_485_S_R);	// 485接收使能

/*********************************************************************************************************
** Function name: SendResponse
** Descriptions:  发送帧函数为底层字符发送处理函数,ZLG/MODBUS RTU协议栈中使用该函数发送帧数据。
** Input: buff,字符串指针,类型:unsigned char
**        len,字符长度,类型:unsigned short     
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SendResponse(uint8 *buff,uint16 len)
{
	uint16 i,k;
	RS_485_S();						// RS485发送使能

	for(k=0;k<len;k++)
	{
	  while(!(rUTRSTAT1 & 0x02));	// 等待发送器THR为空
   	  for(i=0; i<10; i++);
   	  rUTXH1 = buff[k];				// 发送数据
   	  while(!(rUTRSTAT1 & 0x02));	// 等待发送器THR为空
	}
	while(!(rUTRSTAT1 & 0x04));		// 等待发送器THR为空
	RS_485_R();						// RS485接收使能
}

#define TIMERS_UP_MAK  (~0x222202)

/*********************************************************************************************************
** Function name: StartCountT15
** Descriptions:  使能T1.5计数。T1.5的时间值为UART传输1.5个字符的时间。
**			      注意:该函数只是使能计时,不允许在函数中产生任何延时。
**			            如果T1.5时间结束执行T15EndHandle函数。
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StartCountT15(void)
{
	uint32 temp = rTCON& TIMERS_UP_MAK;
	rTCNTB2 = 75;				// 定时750 us

	rTCON = temp|(1<<13);		// 更新定时器数据		
	rTCON = temp|(1<<12);		// 启动定时器

}


/*********************************************************************************************************
** Function name: StartCountT35
** Descriptions:  使能T3.5计数。T3.5的时间值为UART传输3.5个字符的时间。
**			      注意:该函数只是使能计时,不允许在函数中产生任何延时。
**			             如果T3.5时间结束执行T35EndHandle函数。
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StartCountT35(void)
{
	uint32 temp = rTCON & TIMERS_UP_MAK;
	rTCNTB3 = 750;				// 定时1750 us
	
	rTCON = temp|(1<<17);		// 更新定时器数据		
	rTCON = temp|(1<<16);		// 启动定时器
	
}


/*********************************************************************************************************
** Function name: Start10mS
** Descriptions:  10mS开始计数,只在Modbus主机使用,从机不使用该中断。该定时器需要自动加载。
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Start10mS(void)
{
	uint32 temp = rTCON& TIMERS_UP_MAK;
	rTCNTB4 = 1000;						// 定时10000 us
	
	rTCON = temp|(1<<21);				// 更新定时器数据		
	rTCON = temp|(1<<20)|(1<<22);		// 启动定时器

}


/*********************************************************************************************************
** Function name: T15_Exception
** Descriptions:  T15定时中断处理
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
 void T15_Exception(void)
{
    rSRCPND = BIT_TIMER2;       //Clear pending bit
    rINTPND = BIT_TIMER2;
    rINTPND;                    //Prevent an double interrupt pending
	
	T15EndHandle();
	rTCON &= ~(1<<12);		// 关定时器
}

/*********************************************************************************************************
** Function name: T35_Exception
** Descriptions:  T35定时中断处理
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
 void T35_Exception(void)
{
    rSRCPND = BIT_TIMER3;       //Clear pending bit
    rINTPND = BIT_TIMER3;
    rINTPND;                    //Prevent an double interrupt pending

	T35EndHandle();
	rTCON &= ~(1<<16);		// 关定时器
}

/*********************************************************************************************************
** Function name: T10ms_Exception
** Descriptions:  T10ms定时中断处理
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
 void T10ms_Exception(void)
{
        
    rSRCPND = BIT_TIMER4;       //Clear pending bit
    rINTPND = BIT_TIMER4;
    rINTPND;                    //Prevent an double interrupt pending

		Time10mSHandle();

}


/*********************************************************************************************************
** Function name: Time1Init
** Descriptions:  定时器初始化函数,系统启动时调用该函数初始化定时器。
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TimersInit(void)
{ 
	// Fclk=200MHz,Pclk=50MHz。
	// 定时器的记数单位为1微秒
	rTCFG0 &=~(0xff<<8);
	rTCFG0 |= 250<<8;			// 预分频器0设置为250,取得200KHz
	rTCFG1 &= ~(0xf<<8);		// TIMER2再取1/2分频,取得100KHz
	rTCFG1 &= ~(0xf<<12);		// TIMER3再取1/2分频,取得100KHz
	rTCFG1 &= ~(0xf<<16);		// TIMER4再取1/2分频,取得100KHz

	rTCON &= ~(0x7ff<<12);		// 初始化定时器2、3、4的控制位,全为零
}



/*********************************************************************************************************
** Function name: UART1_Exception
** Descriptions:  串口中断处理函数
** Input:无       
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  UART1_Exception(void)
{
	rINTSUBMSK|=(BIT_SUB_RXD1|BIT_SUB_ERR1);

	if(rUTRSTAT1 & 0x01)			
	{

		ReceOneChar(rURXH1);		// 调用MODBUS接收字符函数,;
	}

 	ClearPending(BIT_UART1);
   rSUBSRCPND =(BIT_SUB_RXD1|BIT_SUB_ERR1);
   rINTSUBMSK &=~(BIT_SUB_RXD1|BIT_SUB_ERR1);
    
}



/*********************************************************************************************************
** Function name: IniUART1
** Descriptions:  串口初始化。系统起动时调用该函数初始化串口
** Input:	bps ,串口波特率    
** Output:        无
** Created by:    周立山
** Created Date:  2006-02-21
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void IniUART1(uint32 bps)
{  	
	RS_485_INI();
	// IO口设置 (GPH5,GPH4)
	rGPHUP = rGPHUP | (0x03<<4);
	rGPHCON = (rGPHCON & (~0x00000F00)) | (0x00000A00);	
	
	// 串口模式设置
	rUFCON1 = 0x00;   	// 禁止FIFO功能
	rUMCON1 = 0x00;   	// AFC(流控制)禁能
	rULCON1 = 0x07; 	// 禁止IRDA,无奇偶校验,2位停止位,8位数据位
	rUCON1  = 0x105; 	// 使用PCLK来生成波特率,发送中断为电平触发模式,接收中断为边沿触发模式,
	                    // 禁止接收超时中断,使能接收错误中断,正常工作模式,中断或查询方式(非DMA)	
	// 串口波特率设置
	rUBRDIV1=(int)(PCLK/16.0/bps + 0.5) -1; 

} 

⌨️ 快捷键说明

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