?? syshal.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 + -