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

📄 bsp_uart.c

📁 使用STR710的SPI接口访问外部EEPROM的例子程序.使用KEIL UV3编译.使用了MDK3.05操作系统.
💻 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 + -