1.初始化串口配置
//---------------------------------------------------------------------
// name : UARTconfig_Initial
// function:
// input : PA8 --- RXD
// output : PA9 --- TXD
//---------------------------------------------------------------------
void UARTconfig_Initial(void)
{
UART_InitTypeDef UART_InitStructure;
//--------UART 脚位设置 ------------------------------
GPIO_ModeConfig (GPIOA,GPIO_PinSource8,GPIO_Mode_IN); // PA8 -- RXD
GPIO_PupdConfig (GPIOA,GPIO_PinSource8,GPIO_PuPd_DOWN); //
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_UART); //
GPIO_ModeConfig (GPIOA,GPIO_PinSource9,GPIO_Mode_OUT_PP); // PA9 -- TXD
GPIO_PupdConfig (GPIOA,GPIO_PinSource9,GPIO_PuPd_NOPULL); //
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_UART); //
//------- UART 时钟设置 ------------------------------
RCC_APBPeriphClockCmd (RCC_APBPeriph_UART0, ENABLE); //
RCC_UARTCLKConfig(RCC_UARTCLK_HCLK,RCC_UARTDIV_2); // 24M/2 = 12M
//-------- UART 功能配置 ------------------------------
UART_InitStructure.BaudRate = 9600 ;
UART_InitStructure.Parity = UART_Parity_No;
UART_InitStructure.Mode = UART_Mode_Tx | UART_Mode_Rx ;
UART_InitStructure.RXFIFOThreshold = 1 ;
UART_InitStructure.TXFIFOThreshold = 1 ;
UART_Init(&UART_InitStructure);
//----------------------
UART_IT_Enable();
UART_Cmd (ENABLE);
}
2.打开中断使能模式
void UART_IT_Enable(void)
{
UART_ClearFlag(UART_Flag_RNE| UART_Flag_TE); //
NVIC_IRQxEnable(IRQ_UART0); //
UART_ITConfig (UART_IT_RNE, ENABLE); //
}
3.实现收发代码部分
//串口收发中断
void UART_ISR(void)
{
//串口收到数据
if( UART_GetFlagStatus(UART_Flag_RNE))
{
UART_ClearFlag(UART_Flag_RNE);//清标志位
urbuf[ReceDataLen] = UART_ReceiveData();
if(ReceDataLen+1 < sizeof(urbuf)){ReceDataLen++;}//如没溢出就接收
ReceTimeOver = SysClock;//用作判断多长时间没接收到字节用
}
//串口发送数据
if(UART_GetFlagStatus(UART_Flag_TE))
{
UART_ClearFlag(UART_Flag_TE);//清标志位
if(SendDataLen > 0)//待发长度
{
UART_SendData(*SendDataPrt++);
SendDataLen--;
}
else{UART_ITConfig (UART_IT_TE, DISABLE);}//发完失能发送中断
}
}
备注:装载发送数据包
/***********************************************************
* 功能: 通信数据包装
* 输入: 命令,缓冲,长度,等待发送完毕
* 返回: 无
***********************************************************/
void uart_send_packet(uint8_t cmd, uint8_t *buf, uint8_t len, uint8_t wait)
{
utbuf[0] = COMM_HAND1;
utbuf[1] = COMM_HAND2;
utbuf[2] = cmd;
utbuf[3] = 'U';
utbuf[4] = len;
mem_copy(buf,&utbuf[5],len);
utbuf[utbuf[4]+5] = Crc8(utbuf,utbuf[4]+5);
SendDataPrt = &utbuf[0];
SendDataLen = len+6;
UART_ITConfig (UART_IT_TE, ENABLE);//触发发送中断
}