STM32-USART-串口发送接收
STM32-USART-串口发送+接收
一:串口发送
串口发送–原文链接:https://blog.csdn.net/rxy0727/article/details/1460446498
二:串口接收
在串口发送初始化部分上加上接收的部分
首先是GPIO口,要使用RX引脚,在引脚定义表里可以知道,USART的RX复用在PA10引脚。所以要再初始化一下PA106
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
在USART_Mode中加上串口模式RX,就开启了同时发送和接收部分
//配置USART USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure);
三:串口查询的两种方法
1.查询
如果使用查询,那初始化到上一步就结束了,查询的流程是,在主函数里不断判断RXNE标志位,如果置1了,就说明收到数据了。再调用ReceiveData,读取DR寄存器。
函数: USART_ GetFlagStatus
函数功能 :
检查指定的
USART
标志位设置与否
参数1:USARTx
:
x
可以是
1
,
2
或者
3
,来选择
USART
外设
参数2:USART_FLAG
:待检查的
USART
标志位
由状态寄存器USART_SR可得,读DR可以自动清除标志位,所以不需要重新清除标志位
函数: USART_ ReceiveData
函数功能: 返回
USARTx
最近接收到的数据
参数:USARTx
:
x
可以是
1
,
2
或者
3
,来选择
USART
外设
代码:
while(1)
{
if(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET)
{
//如果if成立
RxData = USART_ReceiveData(USART1);
OLED_ShowHexNum(1,1,RxData,2);
}
}
结果:
2.中断
如果使用中断,则还需要开启中断,配置NVIC.
第一步:开启RXNE标志位到NVIC的输出
函数 USART_ITConfig
函数功能: 使能或者失能指定的
USART
中断
参数1: USARTx
:
x
可以是
1
,
2
或者
3
,来选择
USART
外设
参数2:USART_IT
:待使能或者失能的
USART
中断源
输入参数
USART_IT
使能或者失能
USART
的中断。可以取下表的一个或者多个取值的组合作为该参数的值。
代码:
USART_ITConfig(USART1, USART_IT_RXNE ENABLE);
第二步:配置NVIC
函数 NVIC_PriorityGroupConfig
函数功能: 设置优先级分组:先占优先级和从优先级
参数:NVIC_PriorityGroup
:优先级分组位长度
该参数设置优先级分组位长度,见下表
函数NVIC_Init
功能描述: 根据
NVIC_InitStruct
中指定的参数初始化外设
NVIC
寄存器
NVIC的相关函数:
NVIC_IRQChannel
该参数用以使能或者失能指定的
IRQ
通道
NVIC_IRQChannelPreemptionPriority
该参数设置了成员
NVIC_IRQChannel
中的先占优先级
配置NVIC代码:
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure(&NVIC_InitStructure);
总结:RXNE一旦置1,就会向NVIC申请中断,之后就可以在中断里接收数据
函数封装
uint8_t Serial_GetRxFlag(void)
{
if(Serial_RxFlag == 1)
{
Serial_RxFlag=0;//读后自动清除功能
return 1;
}
return 0;
}
uint8_t Serial_GetRxData(void)
{
return Serial_RxData;
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE)== SET)
{
//如果置1了就进入if
Serial_RxData = USART_ReceiveData(USART1);
Serial_RxFlag = 1;//读完之后置一个自己的标志位
USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除标志位
}
}
主函数调用
while(1)
{
if(Serial_GetRxFlag()==1)
{
//如果if成立
RxData = Serial_GetRxData();
Serial_SendByte(RxData);//数据回传
OLED_ShowHexNum(1,1,RxData,8);
}
}
结果:
四:学习心得
在这个学习过程中,对USART通信有了更清楚的认识
USART的配置和使用方法
配置STM32的USART主要包括以下几个步骤:
- 初始化 :设置波特率、数据位、停止位和校验方式。
- 发送数据 :通过 函数发送数据,并等待发送缓冲区为空。
- 接收数据 :使用 函数接收数据,并处理接收到的数据。
- 中断处理 :配置中断源,处理接收和发送完成的中断事件。
今天也是收获满满的一天,开心!!!