stm32串口使用
stm32串口使用
查询方式使用串口
1、配置时钟,由于使用串口是在复用IO口,需要打开串口时钟和相应的IO口时钟。
2、配置IO口,串口相应的IO口需要配置,输出口配置成复用推挽输出,输出速度根据需
要配置,输入口配置为悬空输入。
3、配置串口,主要包括波特率、数据长度、停止位、奇偶校验、硬件流控制、接收发送模
式。
4、最后打开串口
例子
/*************************************************************
配置串口1,引脚为PA.09,PA.10,串口引脚配置,开启时钟,打开串口
功能:配置USART1,配置PA.09,PA.10,开启串口时钟,打开串口
入口参数:无
出口参数:无
**************************************************************/
void Config_Usart1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//配置USATR1时钟,同时打开引脚时钟和USART1时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
//配置USART1的TX,PA.09,推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//配置USART1的RX,PA.10 为input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART1 模式配置9600 9位数据,偶校验,不使用硬件流控制,发送和接收
USART_https://www.360docs.net/doc/f38119710.html,ART_BaudRate = 9600;
USART_https://www.360docs.net/doc/f38119710.html,ART_WordLength = USART_WordLength_9b;
USART_https://www.360docs.net/doc/f38119710.html,ART_StopBits = USART_StopBits_1;
USART_https://www.360docs.net/doc/f38119710.html,ART_Parity = USART_Parity_Even;
USART_https://www.360docs.net/doc/f38119710.html,ART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_https://www.360docs.net/doc/f38119710.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//初始化USART1,打开USART1
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
/****************************************************************
功能:接收一个字节的数据
入口参数:无
出口参数:返回收到的数据
*****************************************************************/
uint8_t error_evenflag = 0x01;//串口接收偶校验错误标志
uint8_t rxdata;//存储收到的数据
uint8_t Receive_OneByte(void)
{
//uint8_t rxdata;
if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)//串口收到数据
{
if(USART_GetITStatus(USART1, USART_FLAG_PE) == RESET)//偶校验正确
{
rxdata = USART_ReceiveData(USART1);
}
else
{
error_evenflag = 0x00;//偶校验错误时置0
return error_evenflag;
}
}
return rxdata;
}
/****************************************************************
USATR1 发送一个字节
功能:发送一个字节的数据
入口参数:发送到数据
出口参数:无
*****************************************************************/
void Send_OneByte(uint8_t onebyte)
{
while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));//等待发送完毕USART_SendData(USART1, onebyte);
}