STM32F103(纯代码)-串口通信USART1-3 UART4-5

1.usart.h

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
#include "sys.h" 

#define USART_REC_LEN  			200  	//¶¨Òå×î´ó½ÓÊÕ×Ö½ÚÊý 200


#define USART1_CLK RCC_APB2Periph_USART1 //USART1 ʱÖÓ
#define USART1_TX_GPIO_CLK RCC_APB2Periph_GPIOA //GPIOA ʱÖÓ
#define USART1_RX_GPIO_CLK RCC_APB2Periph_GPIOA //GPIOA ʱÖÓ
#define	USART1_TX_GPIO_PORT GPIOA //GPIOA
#define	USART1_RX_GPIO_PORT GPIOA //GPIOA
#define USART1_TX_GPIO_Pin GPIO_Pin_9 //Pin_9
#define USART1_RX_GPIO_Pin GPIO_Pin_10 //Pin_10
#define USART1_TX_GPIO_Mode GPIO_Mode_AF_PP //¸´ÓÃÍÆÍìÊä³ö
#define USART1_RX_GPIO_Mode GPIO_Mode_IN_FLOATING //¸¡¿ÕÊäÈë
extern u8  USART1_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 USART1_RX_STA;         		//½ÓÊÕ״̬±ê¼Ç


#define USART2_CLK RCC_APB1Periph_USART2 //USART2 ʱÖÓ
#define USART2_TX_GPIO_CLK RCC_APB2Periph_GPIOA //GPIOA ʱÖÓ
#define USART2_RX_GPIO_CLK RCC_APB2Periph_GPIOA //GPIOA ʱÖÓ
#define	USART2_TX_GPIO_PORT GPIOA //GPIOA
#define	USART2_RX_GPIO_PORT GPIOA //GPIOA
#define USART2_TX_GPIO_Pin GPIO_Pin_2 //Pin_2
#define USART2_RX_GPIO_Pin GPIO_Pin_3 //Pin_3
#define USART2_TX_GPIO_Mode GPIO_Mode_AF_PP //¸´ÓÃÍÆÍìÊä³ö
#define USART2_RX_GPIO_Mode GPIO_Mode_IN_FLOATING //¸¡¿ÕÊäÈë
extern u8  USART2_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 USART2_RX_STA;         		//½ÓÊÕ״̬±ê¼Ç	


#define USART3_CLK RCC_APB1Periph_USART3 //USART3 ʱÖÓ
#define USART3_TX_GPIO_CLK RCC_APB2Periph_GPIOB //GPIOB ʱÖÓ
#define USART3_RX_GPIO_CLK RCC_APB2Periph_GPIOB //GPIOB ʱÖÓ
#define	USART3_TX_GPIO_PORT GPIOB //GPIOB
#define	USART3_RX_GPIO_PORT GPIOB //GPIOB
#define USART3_TX_GPIO_Pin GPIO_Pin_10 //Pin_10
#define USART3_RX_GPIO_Pin GPIO_Pin_11 //Pin_11
#define USART3_TX_GPIO_Mode GPIO_Mode_AF_PP //¸´ÓÃÍÆÍìÊä³ö
#define USART3_RX_GPIO_Mode GPIO_Mode_IN_FLOATING //¸¡¿ÕÊäÈë
extern u8  USART3_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 USART3_RX_STA;         		//½ÓÊÕ״̬±ê¼Ç	

#define UART4_CLK RCC_APB1Periph_UART4 //UART4 ʱÖÓ
#define UART4_TX_GPIO_CLK RCC_APB2Periph_GPIOC //GPIOC ʱÖÓ
#define UART4_RX_GPIO_CLK RCC_APB2Periph_GPIOC //GPIOC ʱÖÓ
#define	UART4_TX_GPIO_PORT GPIOC //GPIOC
#define	UART4_RX_GPIO_PORT GPIOC //GPIOC
#define UART4_TX_GPIO_Pin GPIO_Pin_10 //Pin_10
#define UART4_RX_GPIO_Pin GPIO_Pin_11 //Pin_11
#define UART4_TX_GPIO_Mode GPIO_Mode_AF_PP //¸´ÓÃÍÆÍìÊä³ö
#define UART4_RX_GPIO_Mode GPIO_Mode_IN_FLOATING //¸¡¿ÕÊäÈë
extern u8  UART4_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 UART4_RX_STA;         		//½ÓÊÕ״̬±ê¼Ç

#define UART5_CLK RCC_APB1Periph_UART5 //UART5 ʱÖÓ
#define UART5_TX_GPIO_CLK RCC_APB2Periph_GPIOC //GPIOC ʱÖÓ
#define UART5_RX_GPIO_CLK RCC_APB2Periph_GPIOD //GPIOD ʱÖÓ
#define	UART5_TX_GPIO_PORT GPIOC //GPIOC
#define	UART5_RX_GPIO_PORT GPIOD //GPIOD
#define UART5_TX_GPIO_Pin GPIO_Pin_12 //Pin_12
#define UART5_RX_GPIO_Pin GPIO_Pin_2 //Pin_2
#define UART5_TX_GPIO_Mode GPIO_Mode_AF_PP //¸´ÓÃÍÆÍìÊä³ö
#define UART5_RX_GPIO_Mode GPIO_Mode_IN_FLOATING //¸¡¿ÕÊäÈë
extern u8  UART5_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.Ä©×Ö½ÚΪ»»Ðзû 
extern u16 UART5_RX_STA;         		//½ÓÊÕ״̬±ê¼Ç	


void Usart1_Init(u32 bound);
void Usartl_SendByte(uint8_t Byte);
void Usart1_SendArray(uint8_t *Array, uint16_t Length);
void Usartl_SendString(char *String);
uint32_t Usart1_Pow(uint32_t X, uint32_t Y);
void Usart1_SendNumber(uint32_t Number, uint8_t Length);


void Usart2_Init(u32 bound);
void Usart2_SendByte(uint8_t Byte);
void Usart2_SendArray(uint8_t *Array, uint16_t Length);
void Usart2_SendString(char *String);
uint32_t Usart2_Pow(uint32_t X, uint32_t Y);
void Usart2_SendNumber(uint32_t Number, uint8_t Length);
void Usart2_printf(char* fmt,...);

void Usart3_Init(u32 bound);
void Usart3_SendByte(uint8_t Byte);
void Usart3_SendArray(uint8_t *Array, uint16_t Length);
void Usart3_SendString(char *String);
uint32_t Usart3_Pow(uint32_t X, uint32_t Y);
void Usart3_SendNumber(uint32_t Number, uint8_t Length);
void Usart3_printf(char* fmt,...) ;

void Uart4_Init(u32 bound);
void Uart4_SendByte(uint8_t Byte);
void Uart4_SendArray(uint8_t *Array, uint16_t Length);
void Uart4_SendString(char *String);
uint32_t Uart4_Pow(uint32_t X, uint32_t Y);
void Uart4_SendNumber(uint32_t Number, uint8_t Length);
void Uart4_printf(char* fmt,...);

void Uart5_Init(u32 bound);
void Uart5_SendByte(uint8_t Byte);
void Uart5_SendArray(uint8_t *Array, uint16_t Length);
void Uart5_SendString(char *String);
uint32_t Uart5_Pow(uint32_t X, uint32_t Y);
void Uart5_SendNumber(uint32_t Number, uint8_t Length);
void Uart5_printf(char* fmt,...);

#endif

2.usart.c

#include "usart.h"	  

struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//Öض¨Òåfputcº¯Êý 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->DR = (u8) ch;      
	return ch;
}

//½ÓÊÕ״̬
//bit15£¬	½ÓÊÕÍê³É±êÖ¾
//bit14£¬	½ÓÊÕµ½0x0d
//bit13~0£¬	½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u8 USART1_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
u16 USART1_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  

u8 USART2_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
u16 USART2_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  

u8 USART3_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
u16 USART3_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  

u8 UART4_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
u16 UART4_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  

u8 UART5_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
u16 UART5_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç	  


void Usart1_Init(u32 bound)
{
  //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(USART1_CLK | USART1_TX_GPIO_CLK | USART1_RX_GPIO_CLK, ENABLE);	//ʹÄÜUSART1£¬GPIOAʱÖÓ
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = USART1_TX_GPIO_Pin; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = USART1_TX_GPIO_Mode;	//¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(USART1_TX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOA.9
   
  //USART1_RX	  GPIOA.10³õʼ»¯
  GPIO_InitStructure.GPIO_Pin = USART1_RX_GPIO_Pin;//PA10
  GPIO_InitStructure.GPIO_Mode = USART1_RX_GPIO_Mode;//¸¡¿ÕÊäÈë
  GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOA.10  

  //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
  //USART ³õʼ»¯ÉèÖÃ
	USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½

  USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
  USART_Cmd(USART1, ENABLE);                    //ʹÄÜ´®¿Ú1 

}

void USART1_IRQHandler(void)                	//´®¿Ú1ÖжϷþÎñ³ÌÐò
	{
	u8 Res;

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
		{
		Res =USART_ReceiveData(USART1);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		
		if((USART1_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
			{
			if(USART1_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
				{
				if(Res!=0x0a)USART1_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else USART1_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
				}
			else //»¹Ã»ÊÕµ½0X0D
				{	
				if(Res==0x0d)USART1_RX_STA|=0x4000;
				else
					{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ;
					USART1_RX_STA++;
					if(USART1_RX_STA>(USART_REC_LEN-1))USART1_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
					}		 
				}
			}   		 
     } 

} 

void Usartl_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Usartl_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Usartl_SendByte(Array[i]);
	}
}

void Usartl_SendString(char *String)
{
	uint16_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Usartl_SendByte(String[i]);
	}
}

uint32_t Usart1_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

void Usart1_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		Usartl_SendByte(Number / Usart1_Pow(10, Length - i - 1) % 10 + '0');
	}
}

void Usart2_Init(u32 bound){
  //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(USART2_CLK, ENABLE);//ʹÄÜUSART2ʱÖÓ
	RCC_APB2PeriphClockCmd(USART2_TX_GPIO_CLK | USART2_RX_GPIO_CLK, ENABLE);	//ʹÄÜGPIOAʱÖÓ
  
	//USART2_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = USART2_TX_GPIO_Pin; //PA2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = USART2_TX_GPIO_Mode;	//¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(USART2_TX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOA2
   
  //USART2_RX	  GPIOA.3
  GPIO_InitStructure.GPIO_Pin = USART2_RX_GPIO_Pin;//PA3
  GPIO_InitStructure.GPIO_Mode = USART2_RX_GPIO_Mode;//¸¡¿ÕÊäÈë
  GPIO_Init(USART2_RX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOA3 

  //Usart2 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
   //USART ³õʼ»¯ÉèÖÃ

	USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½

  USART_Init(USART2, &USART_InitStructure); //³õʼ»¯´®¿Ú2
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
  USART_Cmd(USART2, ENABLE);                    //ʹÄÜ´®¿Ú2

}

void USART2_IRQHandler(void)                	//´®¿Ú2ÖжϷþÎñ³ÌÐò
	{
	u8 Res;

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
		{
		Res =USART_ReceiveData(USART2);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		
		if((USART2_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
			{
			if(USART2_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
				{
				if(Res!=0x0a)USART2_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else USART2_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
				}
			else //»¹Ã»ÊÕµ½0X0D
				{	
				if(Res==0x0d)USART2_RX_STA|=0x4000;
				else
					{
					USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
					USART2_RX_STA++;
					if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
					}		 
				}
			}   		 
     } 

} 
	
void Usart2_SendByte(uint8_t Byte)
{
	USART_SendData(USART2, Byte);
	while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}

void Usart2_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Usart2_SendByte(Array[i]);
	}
}

void Usart2_SendString(char *String)
{
	uint16_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Usart2_SendByte(String[i]);
	}
}

uint32_t Usart2_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

void Usart2_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		Usart2_SendByte(Number / Usart2_Pow(10, Length - i - 1) % 10 + '0');
	}
}

void Usart2_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART2_RX_BUF,fmt,ap);
	va_end(ap);
	//i=USART3_RX_STA&0x8000;		//´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È
	i=strlen((const char*)USART2_RX_BUF);
	for(j=0;j<i;j++)							//Ñ­»··¢ËÍÊý¾Ý
	{
		Usart2_SendByte(USART2_RX_BUF[j]);
	} 
}

void Usart3_Init(u32 bound){
  //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(USART3_CLK, ENABLE);//ʹÄÜUSART3ʱÖÓ
	RCC_APB2PeriphClockCmd(USART3_TX_GPIO_CLK | USART3_RX_GPIO_CLK, ENABLE);	//ʹÄÜGPIOBʱÖÓ
  
	//USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = USART3_TX_GPIO_Pin; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = USART3_TX_GPIO_Mode;	//¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(USART3_TX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOB10
   
  //USART3_RX	  GPIOB.11
  GPIO_InitStructure.GPIO_Pin = USART3_RX_GPIO_Pin;//PB11
  GPIO_InitStructure.GPIO_Mode = USART3_RX_GPIO_Mode;//¸¡¿ÕÊäÈë
  GPIO_Init(USART3_RX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOB11

  //Usart3 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
  //USART ³õʼ»¯ÉèÖÃ
	USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½

  USART_Init(USART3, &USART_InitStructure); //³õʼ»¯´®¿Ú3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
  USART_Cmd(USART3, ENABLE);                    //ʹÄÜ´®¿Ú3

}



void USART3_IRQHandler(void)                	//´®¿Ú3ÖжϷþÎñ³ÌÐò
	{
	u8 Res;

	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
		{
		Res =USART_ReceiveData(USART3);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		
		if((USART3_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
			{
			if(USART3_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
				{
				if(Res!=0x0a)USART3_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else USART3_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
				}
			else //»¹Ã»ÊÕµ½0X0D
				{	
				if(Res==0x0d)USART3_RX_STA|=0x4000;
				else
					{
					USART3_RX_BUF[USART3_RX_STA&0X3FFF]=Res ;
					USART3_RX_STA++;
					if(USART3_RX_STA>(USART_REC_LEN-1))USART3_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
					}		 
				}
			}   		 
     } 

} 
void Usart3_SendByte(uint8_t Byte)
{
	USART_SendData(USART3, Byte);
	while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}

void Usart3_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Usart3_SendByte(Array[i]);
	}
}

void Usart3_SendString(char *String)
{
	uint16_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Usart3_SendByte(String[i]);
	}
}

uint32_t Usart3_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

void Usart3_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		Usart3_SendByte(Number / Usart3_Pow(10, Length - i - 1) % 10 + '0');
	}
}

void Usart3_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART3_RX_BUF,fmt,ap);
	va_end(ap);
	//i=USART3_RX_STA&0x8000;		//´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È
	i=strlen((const char*)USART3_RX_BUF);
	for(j=0;j<i;j++)							//Ñ­»··¢ËÍÊý¾Ý
	{
		Usart3_SendByte(USART3_RX_BUF[j]);
	} 
}

void Usart4_Init(u32 bound){
	
  //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(UART4_CLK, ENABLE);//ʹÄÜUART4ʱÖÓ
	RCC_APB2PeriphClockCmd(UART4_TX_GPIO_CLK | UART4_RX_GPIO_CLK, ENABLE);	//ʹÄÜGPIOCʱÖÓ
  
	//UART4_TX   GPIOC.10
  GPIO_InitStructure.GPIO_Pin = UART4_TX_GPIO_Pin; //PC10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = UART4_TX_GPIO_Mode;	//¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(UART4_TX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOC10
   
  //UART4_RX	  GPIOC.11
  GPIO_InitStructure.GPIO_Pin = UART4_RX_GPIO_Pin;//PC11
  GPIO_InitStructure.GPIO_Mode = UART4_RX_GPIO_Mode;//¸¡¿ÕÊäÈë
  GPIO_Init(UART4_RX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOC11

  //Uart4 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
  //USART ³õʼ»¯ÉèÖÃ
	USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½

  USART_Init(UART4, &USART_InitStructure); //³õʼ»¯´®¿Ú4
  USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
  USART_Cmd(UART4, ENABLE);                    //ʹÄÜ´®¿Ú4

}

void UART4_IRQHandler(void)                	//´®¿Ú4ÖжϷþÎñ³ÌÐò
	{
	u8 Res;

	if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
		{
		Res =USART_ReceiveData(UART4);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		
		if((UART4_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
			{
			if(UART4_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
				{
				if(Res!=0x0a)UART4_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else UART4_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
				}
			else //»¹Ã»ÊÕµ½0X0D
				{	
				if(Res==0x0d)UART4_RX_STA|=0x4000;
				else
					{
					UART4_RX_BUF[UART4_RX_STA&0X3FFF]=Res ;
					UART4_RX_STA++;
					if(UART4_RX_STA>(USART_REC_LEN-1))UART4_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
					}		 
				}
			}   		 
     } 

} 

void Uart4_SendByte(uint8_t Byte)
{
	USART_SendData(UART4, Byte);
	while (USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);
}

void Uart4_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Uart4_SendByte(Array[i]);
	}
}

void Uart4_SendString(char *String)
{
	uint16_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Uart4_SendByte(String[i]);
	}
}

uint32_t Uart4_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

void Uart4_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		Uart4_SendByte(Number / Uart4_Pow(10, Length - i - 1) % 10 + '0');
	}
}

void Uart4_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)UART4_RX_BUF,fmt,ap);
	va_end(ap);
	//i=USART3_RX_STA&0x8000;		//´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È
	i=strlen((const char*)UART4_RX_BUF);
	for(j=0;j<i;j++)							//Ñ­»··¢ËÍÊý¾Ý
	{
		Uart4_SendByte(UART4_RX_BUF[j]);
	} 
}

void Uart5_Init(u32 bound){
	
  //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(UART5_CLK, ENABLE);//ʹÄÜUART5ʱÖÓ
	RCC_APB2PeriphClockCmd(UART5_TX_GPIO_CLK | UART5_RX_GPIO_CLK, ENABLE);	//ʹÄÜGPIOC GPIODʱÖÓ
  
	//UART5_TX   GPIOC.12
  GPIO_InitStructure.GPIO_Pin = UART5_TX_GPIO_Pin; //PC12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = UART5_TX_GPIO_Mode;	//¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(UART5_TX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOC12
   
  //UART5_RX	  GPIOD.2
  GPIO_InitStructure.GPIO_Pin = UART5_RX_GPIO_Pin;//PD2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = UART5_RX_GPIO_Mode;//¸¡¿ÕÊäÈë
  GPIO_Init(UART5_RX_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯GPIOD2

  //Uart4 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
   //USART ³õʼ»¯ÉèÖÃ

	USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½

  USART_Init(UART5, &USART_InitStructure); //³õʼ»¯´®¿Ú5
  USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
  USART_Cmd(UART5, ENABLE);                    //ʹÄÜ´®¿Ú5

}

void UART5_IRQHandler(void)                	//´®¿Ú5ÖжϷþÎñ³ÌÐò
	{
	u8 Res;

	if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
		{
		Res =USART_ReceiveData(UART5);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		
		if((UART5_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
			{
			if(UART5_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
				{
				if(Res!=0x0a)UART5_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
				else UART5_RX_STA|=0x8000;	//½ÓÊÕÍê³ÉÁË 
				}
			else //»¹Ã»ÊÕµ½0X0D
				{	
				if(Res==0x0d)UART5_RX_STA|=0x4000;
				else
					{
					UART5_RX_BUF[UART5_RX_STA&0X3FFF]=Res ;
					UART5_RX_STA++;
					if(UART5_RX_STA>(USART_REC_LEN-1))UART5_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ	  
					}		 
				}
			}   		 
     } 
} 

void Uart5_SendByte(uint8_t Byte)
{
	USART_SendData(UART5, Byte);
	while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);
}

void Uart5_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Uart5_SendByte(Array[i]);
	}
}

void Uart5_SendString(char *String)
{
	uint16_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Uart5_SendByte(String[i]);
	}
}

uint32_t Uart5_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

void Uart5_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		Uart5_SendByte(Number / Uart5_Pow(10, Length - i - 1) % 10 + '0');
	}
}

void Uart5_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)UART5_RX_BUF,fmt,ap);
	va_end(ap);
	//i=USART3_RX_STA&0x8000;		//´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È
	i=strlen((const char*)UART5_RX_BUF);
	for(j=0;j<i;j++)							//Ñ­»··¢ËÍÊý¾Ý
	{
		Uart5_SendByte(UART5_RX_BUF[j]);
	} 
}

3.main

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "sys.h"
#include "stdio.h"

#include "Led.h"	
#include "Key.h"
#include "Beep.h"
#include "usart.h"


int main(void)
{
	
	Led_Init();
	Key_Init();
	Beep_Init();
	Usart1_Init(115200);
	Usart3_Init(115200);
	while(1)
	{
		printf("ok");
		Delay_s(2);
	
		if(USART3_RX_STA&0x8000)
		{	
			printf("%s\r\n",USART3_RX_BUF);
			USART3_RX_STA = 0;
		}

	}	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值