第一步:把串口用的引脚设置。接收的为
GPIO_Mode_IN_FLOATING; //浮空输入
发送的为GPIO_Mode_AF_PP; // 复用推挽输出
第二部设置 void NVIC_Configuration(void)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel ; // 全局中断、、 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure);
第三部设置 UART 的时钟,波特率,模式等等
void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; // 时钟低电平活动
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; // 时钟低电平
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; // 时钟第二个边沿进行数据捕获 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; // 最后一位数据的时钟脉冲不从SCLK输出
USART_ClockInit(USART1, &USART_ClockInitStructure); // 时钟参数初始化设置
USART_InitStructure.USART_BaudRate = 115200; // 波特率为:115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 在帧结尾传输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); USART_ClearFlag(USART1, USART_IT_RXNE); //清中断,以免一启用中断后立即产生中断
USART_ClearFlag(USART1, USART_IT_TXE);
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //使能USART1接收中断源
//USART_ITConfig(USART1,USART_IT_TXE, ENABLE); //使能USART1发送中断?????????????
//这一句一加上就是一直发送,???????
USART_Cmd(USART1, ENABLE); //USART1总开关:开启
}
第四部:串口服务函数
void USART1_IRQHandler(void)
{
/* if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET ) //发送
{
USART_ClearFlag(USART1, USART_FLAG_TXE);
USART_ClearITPendingBit(USART1, USART_FLAG_TXE);
USART_SendData(USART1, 0x02);
}
*/
/* if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收
{
USART_ClearFlag(USART1, USART_FLAG_RXNE);
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //这两条什么区别
USART_SendData(USART1, 0x00);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;
}
*/
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
{
//将数据回送至超级终端
USART_SendData(USART1, USART_ReceiveData(USART1));
//等待数据发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
}
第五步:发送函数
for( i=0;TxBuf1[i]!='\0';i++)
{
USART_SendData(USART1,TxBuf1[i]);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
//等待数据发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}