📄 bsp_uart.c
字号:
#include "BSP_uart.h"
//#include "BSP_lcm.h"
#include "BSP_IOdef.h"
//#include "Sc16is752.h"
//#include "..\TcpPS\PS_TCPIP.h" //Added for TCPIP Protocol Stack by likazhou on 07-04-24
#include <RTL.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
//extern OS_MUT MUT_SC16is752;
// ========================= <<<<<<<< For TCP Protocl Stack >>>>>>> ========================= //
#pragma arm section rwdata = "SRAM",zidata = "SRAM"
sr_RXD_buf UART_RXD_buf[5];
#pragma arm section
// =========================================== <<<<<<< Moddified by likazhou on 07-04-28>>>>>>> //
void UART_open( u8 UARTn, u32 BaudRate, u8 S_parity, u8 S_stopbits, u8 S_mode )
{
//if ( UARTn < 3 ) // STR710上的串口
//{
UARTParity_TypeDef Parity;
UARTStopBits_TypeDef StopBits;
UARTMode_TypeDef Mode;
const UARTParity_TypeDef Tmp_parity[3] =
{
UART_EVEN_PARITY, UART_ODD_PARITY, UART_NO_PARITY
};
const UARTStopBits_TypeDef Tmp_stopbits[4] =
{
UART_0_5_StopBits, UART_1_StopBits, UART_1_5_StopBits, UART_2_StopBits
};
const UARTMode_TypeDef Tmp_mode[5] =
{
UARTM_8D, UARTM_7D_P, UARTM_9D, UARTM_8D_W, UARTM_8D_P
};
Parity = Tmp_parity[S_parity];
StopBits = Tmp_stopbits[S_stopbits];
Mode = Tmp_mode[S_mode];
switch ( UARTn )
{
case 0:
// 配置IO引脚
GPIO_Config( GPIO0, UART0_Tx_Pin, GPIO_AF_PP );
GPIO_Config( GPIO0, UART0_Rx_Pin, GPIO_IN_TRI_CMOS );
// 配置 UART X
UART_OnOffConfig( UART0, ENABLE ); // 使能 UARTX on
UART_FifoConfig( UART0, ENABLE ); // 禁用 FIFOs
UART_FifoReset( UART0, UART_RxFIFO ); // 重置 UART_RxFIFO
UART_FifoReset( UART0, UART_TxFIFO ); // 重置 the UART_TxFIFO
UART_LoopBackConfig( UART0, DISABLE ); //禁止 Loop Back
UART_Config( UART0, BaudRate, Parity, StopBits, Mode ); // 配置串口参数
UART_RxConfig( UART0, ENABLE ); // 允许接收
UART_ItConfig( UART0, UART_RxBufFull, ENABLE ); // 允许中断
break;
case 1:
// 配置IO引脚
GPIO_Config( GPIO0, UART1_Tx_Pin, GPIO_AF_PP );
GPIO_Config( GPIO0, UART1_Rx_Pin, GPIO_IN_TRI_CMOS );
// 配置 UART X
UART_OnOffConfig( UART1, ENABLE ); // 使能 UARTX on
UART_FifoConfig( UART1, ENABLE ); // 禁用 FIFOs
UART_FifoReset( UART1, UART_RxFIFO ); // 重置 UART_RxFIFO
UART_FifoReset( UART1, UART_TxFIFO ); // 重置 the UART_TxFIFO
UART_LoopBackConfig( UART1, DISABLE ); //禁止 Loop Back
UART_Config( UART1, BaudRate, Parity, StopBits, Mode ); // 配置串口参数
UART_RxConfig( UART1, ENABLE ); // 允许接收
UART_ItConfig( UART1, UART_RxBufFull | UART_TimeOutNotEmpty | UART_RxHalfFull, ENABLE ); // 允许中断
break;
case 2:
// 配置IO引脚
GPIO_Config( GPIO0, UART2_Tx_Pin, GPIO_AF_PP );
GPIO_Config( GPIO0, UART2_Rx_Pin, GPIO_IN_TRI_CMOS );
// 配置 UART X
UART_OnOffConfig( UART2, ENABLE ); // 使能 UARTX on
UART_FifoConfig( UART2, ENABLE); // 禁用 FIFOs
UART_FifoReset( UART2, UART_RxFIFO ); // 重置 UART_RxFIFO
UART_FifoReset( UART2, UART_TxFIFO ); // 重置 the UART_TxFIFO
UART_LoopBackConfig( UART2, DISABLE ); //禁止 Loop Back
UART_Config( UART2, BaudRate, Parity, StopBits, Mode ); // 配置串口参数
UART_RxConfig( UART2, ENABLE ); // 允许接收
UART_ItConfig( UART2, UART_RxBufFull | UART_TimeOutNotEmpty | UART_RxHalfFull, ENABLE ); // 允许中断
break;
default:
break;
}
//}
/*
else // SC16IS752上的串口
{
Config_SC752_Uart( UARTn, BaudRate, S_parity, S_stopbits, S_mode );
}
*/
}
/*=============================================================================
* 名称: Discard_nbyte_rxdbuf
* 描述: 从接收缓冲区丢弃n个字节
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 18:52:19
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
void Discard_nbyte_rxdbuf( u8 UARTn, u16 num )
{
UART_RXD_buf[UARTn].out += num;
UART_RXD_buf[UARTn].out %= MAX_UART_RXDBUF_SIZE;
}
/*=============================================================================
* 名称: clear_rxdbuf
* 描述: 清除指定串口的接收缓冲区
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 18:53:55
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
void clear_rxdbuf( u8 UARTn )
{
UART_RXD_buf[UARTn].in = 0;
UART_RXD_buf[UARTn].out = 0;
}
/*=============================================================================
* 名称: query_rxdbuf_received_byte
* 描述: 查询接收缓冲区收到的字节数
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 18:55:37
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
u16 query_rxdbuf_received_byte( u8 UARTn )
{
return ( ( MAX_UART_RXDBUF_SIZE + UART_RXD_buf[UARTn].in - UART_RXD_buf[UARTn].out ) % MAX_UART_RXDBUF_SIZE );
}
/*=============================================================================
* 名称: read_byte_from_UARTbuf
* 描述: 从接收缓冲区读取一个字节,不丢弃
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 18:57:51
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
u8 read_byte_from_UARTbuf( u8 UARTn, u16 position )
{
return( UART_RXD_buf[UARTn].msg[( UART_RXD_buf[UARTn].out + position ) % MAX_UART_RXDBUF_SIZE] );
}
/*=============================================================================
* 名称: read_UARTBUF_TO_TCP
* 描述: 从GPRS接收缓冲区读取一个字节到TCP
* 创建: 赖晓芳 2007年4月20日
* 最后修订: 2007年4月20日 11:55:37
* 调用: None
* 输入参数: UART号,偏移
* 返回值: 读取的一字节内容
* 特殊说明: RVMDK 3.05
*=============================================================================*/
/*
u8 read_Byte_From_UARTbuf_TO_TCP (u8 UARTn, u16 nInOffset) {
return (UART_RXD_buf[UARTn].msg[(UART_RXD_buf[UARTn].in + nInOffset ) % MAX_UART_RXDBUF_SIZE]);
}
*/
/*=============================================================================
* 名称: UART_send_mbytes
* 描述: 向指定串口发送一定长度的数据
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 19:31:08
* 调用: None
* 输入参数: UARTn 串口号
send_msg 发送数据指针
len 发送长度,为0时采用字符串长度计算方法计算
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
u16 UART_send_mbytes( u8 UARTn, u8 *send_msg, u16 len )
{
UART_TypeDef *UART_x[3] =
{
UART0, UART1, UART2
};
/*
u8 sc752_channel[2] =
{
SC752_UARTA, SC752_UARTB
};
*/
u16 msg_len;
/*
// ========================= <<<<<<<< For TCP Protocl Stack >>>>>>> ========================= //
if ((UARTn == UART_GPRS) && tcpPS_IsTcpConnect()) {
LED_COM_ON();
tcpPS_Send_Data (send_msg, len);
LED_COM_OFF();
return 1;
}
*/
// ============================================ <<<<<<< Modified by likazhou on 07-04-24>>>>>>> //
// LED_COM_ON();
if ( len == 0 )
{
msg_len = strlen( ( char* )send_msg );
}
else
{
msg_len = len;
}
msg_len %= MAX_UART_RXDBUF_SIZE;
if ( UARTn < 3 )
{
while ( msg_len )
{
UART_ByteSend( UART_x[UARTn], send_msg );
send_msg += 1;
msg_len -= 1;
}
while(!(UART_x[UARTn]->SR & UART_TxEmpty)); // 等待发送完成
}
/*
else
{
WriteSC752Str( sc752_channel[UARTn - 3], send_msg, msg_len );
}
*/
// LED_COM_OFF();
return 1;
}
/*=============================================================================
* 名称: UART_get_line
* 描述: 从缓冲区读取一行数据(以0x0d为判断标准)
* 创建: 赖晓芳 2006年9月15日
* 最后修订: 2006年9月15日 19:10:59
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: RVMDK 3.01a
*=============================================================================*/
u16 UART_get_line( u8 UARTn, u8 *msg, u16 max_len, u16 timeout )
{
u16 i, tmo, len = 0;
tmo = timeout * 1000 / 110;
*msg = 0x00;
for ( i = 0; i < tmo; i += 1 )
{
while ( query_rxdbuf_received_byte( UARTn ) )
{
*msg = read_byte_from_UARTbuf( UARTn, 0 );
Discard_nbyte_rxdbuf( UARTn, 1 );
if ( *msg == 0x0d )
{
*msg = 0x00;
return ( len );
}
if ( isprint( *msg ) )
{
msg += 1;
len += 1;
}
if(len >= max_len)
return (len);
}
if ( len < max_len )
{
os_dly_wait( 10 );
}
else
{
return ( len );
}
}
return ( len );
}
void ISR_RXD_read(u8 channel)
{
UART_TypeDef *UART_x[3] =
{
UART0, UART1, UART2
};
while ( ( UART_x[channel]->SR & ( UART_RxHalfFull | UART_RxBufFull | UART_TimeOutNotEmpty) ) )//UART_TimeOutIdle
{
UART_RXD_buf[channel].msg[UART_RXD_buf[channel].in] = ( u8 )UART_x[channel]->RxBUFR;
UART_RXD_buf[channel].in += 1;
UART_RXD_buf[channel].in %= MAX_UART_RXDBUF_SIZE;
if ( UART_RXD_buf[channel].in == UART_RXD_buf[channel].out )
{
UART_RXD_buf[channel].out += 1;
UART_RXD_buf[channel].out %= MAX_UART_RXDBUF_SIZE;
}
}
}
void UART_rxd_data( void )
{
UART_TypeDef *UART_x[3] =
{
UART0, UART1, UART2
};
/*
u8 sc752_channel[2] =
{
SC752_UARTA, SC752_UARTB
};
*/
u16 i;
//for ( i = 0; i < 5; i += 1 )
for ( i = 0; i < 3; i += 1 )
{
if ( i < 3 )
{
if ( ( UART_x[i]->SR & ( UART_RxHalfFull | UART_RxBufFull ) ) )//UART_TimeOutIdle
{
//LED_COM_ON();
UART_RXD_buf[i].msg[UART_RXD_buf[i].in] = ( u8 )UART_x[i]->RxBUFR;
UART_RXD_buf[i].in += 1;
UART_RXD_buf[i].in %= MAX_UART_RXDBUF_SIZE;
if ( UART_RXD_buf[i].in == UART_RXD_buf[i].out )
{
UART_RXD_buf[i].out += 1;
UART_RXD_buf[i].out %= MAX_UART_RXDBUF_SIZE;
}
//LED_COM_OFF();
}
}
/*
else
{
u8 rxlvl, reg, j;
u32 tmo;
os_mut_wait( MUT_SC16is752, 0xffff );
rxlvl = ReadSC752Reg( SC752_RXLVL, sc752_channel[i - 3] );
reg = SC752_RHR;
reg <<= 3;
reg |= 0x80;
reg |= sc752_channel[i - 3];
//LED_COM_ON();
OUT_752_CS( 0 );
BPSI_DataSendReceive( reg );
// ========================= <<<<<<<< For TCP Protocl Stack >>>>>>> ========================= //
if (tcpPS_IsModemNeedInitialization ()) {
for ( j = 0; j < rxlvl; j++ )
{
UART_RXD_buf[i].msg[UART_RXD_buf[i].in] = BPSI_DataSendReceive( reg );
UART_RXD_buf[i].in += 1;
UART_RXD_buf[i].in %= MAX_UART_RXDBUF_SIZE;
if ( UART_RXD_buf[i].in == UART_RXD_buf[i].out )
{
UART_RXD_buf[i].out += 1;
UART_RXD_buf[i].out %= MAX_UART_RXDBUF_SIZE;
}
}
}
else {
for ( j = 0; j < rxlvl; j++ ) {
com_getcharFromUART (BPSI_DataSendReceive (reg));
}
}
// ============================================ <<<<<<< Modified by likazhou on 07-04-24>>>>>>> //
tmo = 10000000;
while ( BSPI1->CSR2 & BSPI_TFNE )
{
Clear_WDT( );
tmo -= 1;
if(tmo == 0)
break;
}
//LED_COM_OFF();
OUT_752_CS( 1 );
os_mut_release( MUT_SC16is752 );
}
*/
}
}
/*
// ========================= <<<<<<<< For TCP Protocl Stack >>>>>>> ========================= //
void tcpPS_ReceiveTcpPackage (U8 *pBuf, U16 nLength) {
int i;
struct _sr_RXD_buf *p = &UART_RXD_buf[UART_GPRS];
if ((MAX_UART_RXDBUF_SIZE - p->in) >= nLength) {
for (i = 0;i < nLength; i++) {
p->msg[p->in++] = *(pBuf + i);
}
}
else {
for (i = 0;i < nLength; i++) {
p->msg[p->in++] = *(pBuf + i);
p->in %= MAX_UART_RXDBUF_SIZE;
if ( p->in == p->out )
{
p->out++;
p->out %= MAX_UART_RXDBUF_SIZE;
}
}
}
}
// ============================================= <<<<<<< Added by likazhou on 07-04-24>>>>>>> //
*/
extern OS_MUT MUT_RS485_1;
extern OS_MUT MUT_RS485_2;
void RS485_MUT_wait(u8 port)
{
if(port == UART_RS485_1)
os_mut_wait(MUT_RS485_1, 0xffff);
else if(port == UART_RS485_2)
os_mut_wait(MUT_RS485_2, 0xffff);
}
void RS485_MUT_release(u8 port)
{
if(port == UART_RS485_1)
os_mut_release(MUT_RS485_1);
else if(port == UART_RS485_2)
os_mut_release(MUT_RS485_2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -