【STM32】USART串口接收(Rx)详解


文章目录

  • 前言
  • 一、定义、概念 、缩写、性质
  • 二、代码与操作
  • 1. 初始化(相对于TX)
  • 2. 轮询接收
  • 3. 中断接收
  • 4. 配置读取并处理 Rx 信息的函数
  • 5. 主函数内实现单片机接收数据(中断方式)
  • 总结

  • 前言

    接着 tx 的部分来


    一、定义、概念 、缩写、性质

    1. RXNE (Receive Not Empty)标志:当RXNE标志位为1时,表示UART的接收缓冲区中有新的数据可以被读取。当数据被读取后,RXNE标志位会被自动置为0。这个标志用于判断是否可以从缓冲区读取数据。有点像 riscv 汇编语言的 bne, beq

    2. NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。对于NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级

    3. IRQHandler:中断请求处理(Interrupt Request Handler)

    4. 其它:见 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 的优先级,这里为2
  • 	/*NVIC中断分组*/
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			//配置NVIC为分组2
    
  • 配置 NVIC 结构体的参数
  • 	// 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);							
    
  • 使能 USART1
  • 	/*USART使能*/
    	USART_Cmd(USART1, ENABLE);								//使能USART1,串口开始运行
    
  • 在最外面 def 两个 Rx 变量
  • 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 信息的函数

  • 读取 Rx_flag 后自动清零
  • /**
      * 函    数:获取串口接收标志位
      * 参    数:无
      * 返 回 值:串口接收标志位,范围: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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32】USART串口接收(Rx)详解

    发表回复