【STM32】USART串口接收(Rx)详解
文章目录
前言
接着 tx 的部分来
一、定义、概念 、缩写、性质
-
RXNE (Receive Not Empty)标志:当RXNE标志位为1时,表示UART的接收缓冲区中有新的数据可以被读取。当数据被读取后,RXNE标志位会被自动置为0。这个标志用于判断是否可以从缓冲区读取数据。有点像 riscv 汇编语言的 bne, beq
-
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。对于NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级
-
IRQHandler:中断请求处理(Interrupt Request Handler)
-
其它:见 TX 章节 USART串口的接收(TX)
二、代码与操作
1. 初始化(相对于TX)
发送
操作中的 tx 引脚 GPIO 初始化 /*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA9引脚初始化为复用推挽输出
为了初始化 rx 引脚,要初始化 GPIO 的 pin_10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 将PA10引脚初始化为上拉输入
发送
操作中的 tx 引脚 USART 初始化结构体 USART_InitStructure.USART_Mode = USART_Mode_Tx
将其改为 Tx 和 Rx
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //模式,发送模式和接收模式均选择
2. 轮询接收
如果在主函数中要轮询判断是否接收到中断信息:
// 定义用于接收串口数据的变量
uint8_t RxData;
whlie(1)
{
if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET )
{
RxData = USART_ReceiveData(USART1)
OLED_ShowHexNum(1, 8, RxData, 2); //显示串口接收的数据
}
}
3. 中断接收
查阅数据手册 USART – 寄存器 – 状态(status)
/*中断输出配置*/
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 开启串口接收数据的中断,开启 RXNE 标志位到 NVIC 的输出
/*NVIC中断分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2
// NVIC配置
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //选择配置NVIC的USART1线
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC线路的抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1
// 传递多个参数,配置NVIC外设(将结构体地址交给NVIC_Init)
NVIC_Init(&NVIC_InitStructure);
/*USART使能*/
USART_Cmd(USART1, ENABLE); //使能USART1,串口开始运行
uint8_t Serial_RxData; //定义串口接收的数据变量
uint8_t Serial_RxFlag; //定义串口接收的标志位变量
void USART1_IRQHandler(void)
{
// 如果USART1j寄存器里有东西
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{ // 读取 USART Rx 寄存器里面的东西
Serial_RxData = USART_ReceiveData(USART1);
// 置接收标志位变量为1
Serial_RxFlag = 1;
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除USART1的RXNE标志位
//读取数据寄存器会自动清除此标志位
//如果已经读取了数据寄存器,也可以不执行此代码
}
}
4. 配置读取并处理 Rx 信息的函数
/**
* 函 数:获取串口接收标志位
* 参 数:无
* 返 回 值:串口接收标志位,范围:0~1,接收到数据后,标志位置1,读取后标志位自动清零
*/
uint8_t Serial_GetRxFlag(void)
{
if (Serial_RxFlag == 1) //如果标志位为1
{
Serial_RxFlag = 0;
return 1; //则返回1,并自动清零标志位
}
return 0; //如果标志位为0,则返回0
}
/**
* 函 数:获取串口接收的数据
* 参 数:无
* 返 回 值:接收的数据,范围:0~255
*/
uint8_t Serial_GetRxData(void)
{
return Serial_RxData; //返回接收的数据变量
}
5. 主函数内实现单片机接收数据(中断方式)
while (1)
{
if (Serial_GetRxFlag() == 1) //检查串口接收数据的标志位
{
RxData = Serial_GetRxData(); //获取串口接收的数据
Serial_SendByte(RxData); //串口将收到的数据回传回去,用于测试
OLED_ShowHexNum(1, 8, RxData, 2); //显示串口接收的数据
}
}
总结
字典:
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
作者:tsumikistep