附上代码:
#if 1 //PB6 PB7
#define USART1_ALT_GPIO_CLK  RCC_AHB1Periph_GPIOB
#define USART1_ALT_GPIO  GPIOB
#define USART1_TX_PIN  GPIO_Pin_6
#define USART1_RX_PIN  GPIO_Pin_7
#define TX_ALT_PIN  GPIO_PinSource6
#define RX_ALT_PIN  GPIO_PinSource7
#else  //PA9 PA10
#define USART1_ALT_GPIO_CLK  RCC_AHB1Periph_GPIOA
#define USART1_ALT_GPIO  GPIOA
#define USART1_TX_PIN  GPIO_Pin_9
#define USART1_RX_PIN  GPIO_Pin_10
#define TX_ALT_PIN  GPIO_PinSource9
#define RX_ALT_PIN  GPIO_PinSource10
#endif
#define TEST_PA9  

Aout(9) 
#define TEST_PA10 PAout(10)		 
void Test_PA9PA10(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  TEST_PA9=0;
TEST_PA10=0;
TEST_PA9=1;
TEST_PA10=1;
TEST_PA9=0;
TEST_PA10=0;
}
//??????IO ?®??1 
//bound:?¨????
void uart_init(u32 bound)
{
   //GPIO?????è??
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(USART1_ALT_GPIO_CLK,ENABLE); //????GPIOA?±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//????USART1?±??
 
//?®??1????????????????
GPIO_PinAFConfig(USART1_ALT_GPIO,TX_ALT_PIN,GPIO_AF_USART1); //GPIOA9??????USART1
GPIO_PinAFConfig(USART1_ALT_GPIO,RX_ALT_PIN,GPIO_AF_USART1); //GPIOA10??????USART1
//USART1????????
  GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN | USART1_RX_PIN; //GPIOA9??GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//????????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//????50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //???ì????????
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //????
GPIO_Init(USART1_ALT_GPIO,&GPIO_InitStructure); //??????PA9??PA10
   //USART1 ???????è??
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_Cmd(USART1, ENABLE);  //?????®??1 
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//?????à??????
//Usart1 NVIC ????
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//?®??1?????¨??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//×???????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ?¨??????
NVIC_Init(&NVIC_InitStructure);	//?ù?????¨????????????VIC?????÷??
//Test_PA9PA10();
}
void USART1_SendChar(u8 ch)
{ 
while((USART1->SR&0X40)==0);//???··???,?±??·????ê±?   
USART1->DR = (u8) ch;      
}
void USART1_IRQHandler(void)                	//?®??1????·??????ò
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //????????(????????????±?????0x0d 0x0a?á??)
{
Res =USART_ReceiveData(USART1);//(USART1->DR);	//????????????????
USART1_SendChar(Res);
  } 
}