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

📄 myusart.c

📁 STM32+ov7670
💻 C
字号:
# include "MyUSART.h"

#include "sys.h"
#include "usart.h"

unsigned int g_UART_ISR_CNT = 0;
static unsigned char PC_Array_Buffer[30]={0};
static unsigned char Index=0;
static unsigned char Frame_Length = 0;

void Test_PORT_INIT(void)
{
	//DDRC=0x0f;
	//PORTC=0x0f;
}
void UART_Device_INIT(void)
{								
/*	CLI();
	DDRE &= ~BIT(PE0);
	PORTE |= BIT(PE0);
	
	DDRE |= BIT(PE1);
	PORTE |= BIT(PE1);
	
	UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x17; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
	SEI();*/
}
//中断入口								
//#pragma interrupt_handler UART0_RX_ISR:iv_USART0_RXC
void UART0_RX_ISR(void)
{
	/*PC_Array_Buffer[Index] = UDR0;
	
	if(Index < Frame_Length)
	{
		Index ++;
		g_UART_ISR_CNT = USART_ISR_TOP;		//串口发送速率计数,该变量在T0模块中自减
	}*/
}

void UART0_RxIsrHandler(u8 rx_data)
{
	PC_Array_Buffer[Index] = rx_data;
	
	if((Index < Frame_Length) && (PC_Array_Buffer[0] == 0xaa))
	{
		Index ++;
	}
}
//保证只有在收完一个数据帧后数据才才能实
//现数据拷贝							
//函数增加返回值,判断是否有收到新数据	
//修改日期:2008年,2月12日				
unsigned char Get_PC_Data(unsigned char* p_Array, unsigned char ch_FL)
{
	unsigned char i = 0;
	if(Frame_Length != ch_FL)
	{
		Frame_Length = ch_FL;
	}
	if(Index == Frame_Length)
	{
		for(i=0; i< Frame_Length; i++)
		{
			p_Array[i] = PC_Array_Buffer[i];
		}
		Index = 0;
		return 1;
	}
	return 0;
}

void UART_Send_Line(long Data ,
					unsigned char Is_H, 
				    unsigned char Line_ID)
{
	signed char Temp_A_L;				
	signed char Temp_A_H;
	signed char Temp_B_L;
	signed char Temp_B_H;
	
	unsigned char ch_XOR = 0;
	
	Temp_A_L = Data;
	Temp_A_H = Data>>8;
	Temp_B_L = Data >> 16;
	Temp_B_H = Data >> 24;
	
	ch_XOR ^= 0x09;
	ch_XOR ^= Line_ID;
	
	ch_XOR ^= Temp_B_H;
	ch_XOR ^= Temp_B_L;
	ch_XOR ^= Temp_A_H;
	ch_XOR ^= Temp_A_L;
	
	UART_Transmit(0xaa);
	UART_Transmit(0x09);
	UART_Transmit(Line_ID);
	
	if(Is_H)							//是否是先发高字节?					
	{
		UART_Transmit(Temp_B_H);		//是									
		UART_Transmit(Temp_B_L);
		UART_Transmit(Temp_A_H);
		UART_Transmit(Temp_A_L);
	}
	else
	{
		UART_Transmit(Temp_A_L);		//不是									
		UART_Transmit(Temp_A_H);
		UART_Transmit(Temp_B_L);
		UART_Transmit(Temp_B_H);
	}
	
	UART_Transmit(ch_XOR);
	UART_Transmit(0x55);
}
//函数增加了判断是否有新数据被收到的条件
//修改日期:2008年,2月12日				
unsigned char Get_PC_Rate(long int* p_Rate)
{
	unsigned char Temp_Array[9] = {0};
	unsigned char i =0;						
	long int Temp = 0;						
	long int Temp_Rate = 0;
	static unsigned char ch_CMD = 0;		//命令位用静态变量,保证数据能保持在
											//上一次接收到的值(即不丢失)		
	if(Get_PC_Data(Temp_Array, 9))			//如果收到新数据才进行数据校验与恢复
	{										//这样提高了查询速度				
		if((Temp_Array[0] == 0xaa)&&(Temp_Array[8] == 0x55))
		{
			for(i=3; i<7; i++)
			{
				Temp = Temp_Array[i];
				Temp_Rate |= Temp_Array[i]<<((6-i)<<3);//8*(6-i)				
			}
			ch_CMD = Temp_Array[2];			//获取命令位						
			*p_Rate = Temp_Rate;			//获取数据位						
		}
	}
	return ch_CMD;
}
void UART_Transmit(unsigned char ch_Data)
{
	/*while(!(UCSR0A&BIT(UDRE0)))
		;
	UDR0 = ch_Data;*/
	USART1->DR = (u8) ch_Data;      
	while((USART1->SR&0X40)==0)
	{
		;//循环发送,直到发送完毕  	
	} 

}
void Display_A_String(unsigned char *p_STR)
{
	while(*p_STR)
	{
		UART_Transmit(*p_STR ++);
	}
}
unsigned char Is_Buffer_New(unsigned char* Buffer, unsigned char Buffer_Length)
{
	unsigned char i = 0;
	unsigned char Flag = 0;
	static unsigned char Temp_Buffer[30] = {0};
	{
		for(i = 0; i< Buffer_Length; i++)
		{
			if(Temp_Buffer[i] != Buffer[i])
			{
				Temp_Buffer[i] = Buffer[i];
				Flag = 1;
			}
		}
	}
	return Flag;
}

unsigned int Is_USART_ISR(void)
{
	return g_UART_ISR_CNT;
}
////////////////////////////////////////////////////////////////////////////////
void UART_Debug(unsigned char Debug_Data)
{
	UART_Transmit(0xaa);
	UART_Transmit(Debug_Data);
	UART_Transmit(0x55);
}
////////////////////////////////////////////////////////////////////////////////

void UART_SendData(unsigned char* pbuf, unsigned char length)
{
	unsigned char i = 0;
	pbuf[6] = 0;
	for(i = 1; i < 6; i ++)
	{
		pbuf[6] ^= pbuf[i];
	}
	for(i = 0; i < length; i ++)
	{
		UART_Transmit(pbuf[i]);
	}
}

⌨️ 快捷键说明

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