【stm32】USART 串口的接收(Rx)



前言

接着 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())
### 回答1: STM32 USART DMA接收数据是一种高效的数据传输方式。具体步骤如下: 1. 配置USART接收参数,包括波特率、数据位、停止位、校验位等。 2. 配置DMA通道,设置传输方向为从USART接收数据到内存,设置传输数据长度和内存地址。 3. 启动DMA传输,等待传输完成。 4. 在DMA传输完成中断中,处理接收到的数据。 需要注意的是,在使用DMA接收数据时,需要开启USART的DMA接收中断,以便在数据接收完成后触发DMA传输完成中断。同时,还需要在程序中处理DMA传输错误中断,以确保数据传输的正确性。 以上就是STM32 USART DMA接收数据的基本步骤,希望能对您有所帮助。 ### 回答2: stm32是一款广泛应用于嵌入式系统中,功能强大的微控制器,其内置的USART模块可以实现串口通信,使用DMA(Direct Memory Access,直接内存访问)可以在USART接收数据时,将数据自动存入内存,减少CPU的参与,提高接收数据的效率。 接收数据的DMA配置: 1. 选择USART接收模式:使能USART接收中断,并清除接收中断标志位USART_CR1_RE = 1,USART_CR1_RXNEIE = 1,USART_ICR_IDLECF = 1; 2. 选择DMA通道: 发送数据是从存储器读取数据并通过USART发送,接收数据时与之相反。先选择合适的DMA通道进行配置,如:DMA1_Channel7; 3. 配置DMA数据传输方向:设置DMA数据传输方向为从外设到存储器DMA_CCR_DIR类似于串口接收,属于从外设读取数据,然后通过DMA传输到存储器中,因此需进行设置。 4. 配置存储器地址:DMA传输数据到目的地存储器的起始地址,如&rx_buff[0]; 5. 配置数据长度:设置DMA传输数据长度,如:DMA_CNDTR7 = sizeof(rx_buff); 6. 配置DMA内存地址自增模式:DMA传输时,需要自动将传输的数据存储到连续的内存地址中,需要设置DMA_CCR_MINC为1,表示DMA传输时内存地址自动递增,如:DMA_CCR7 |= DMA_CCR_MINC; 7. 配置传输完成中断:DMA传输完成后触发一个中断请求,可以根据中断标志位来完成后续处理,如:DMA_CR_TCIF7 = 1; 8. 配置DMA开启:配置完成后,通过设置DMA_CCR_EN使能DMA通道,如:DMA_CCR7 |= DMA_CCR_EN; 以上就是使用DMA接收USART数据的具体步骤,除此之外,还需要在主函数中初始化串口和DMA,并在中断服务函数中完成数据的处理。当接收到数据后,DMA会自动将数据存入内存中,并通过中断通知CPU做出相应的操作。这样可以节省CPU资源,提高系统的响应速度。 ### 回答3: STM32是一款由意法半导体公司(STMicroelectronics)推出的32位单片机,拥有丰富的外设接口和强大的处理能力。其中USART是串行通信的一种形式,也是STM32通信类外设中常用的一种。 在STM32中使用USART进行接收数据时,传统的方式是通过中断触发接收数据,并在中断处理函数中进行数据的处理。然而,这种方式存在一些问题,例如中断响应时延、数据丢失等。为了解决这些问题,STM32还提供了DMA(Direct Memory Access)接口,可以实现无中断干扰的数据接收。 在USART DMA接收数据过程中,我们需要先配置好UART的基本参数,例如波特率、数据位、停止位、校验位等,然后再开启DMA传输。具体步骤如下: 1.配置USART串口参数:包括波特率,数据位,停止位和校验位等参数。 2.配置DMA通道:首先选择DMA通道,然后设置DMA缓存地址和长度,这里的缓存地址是我们存储接收数据的地址。 3.开启USART DMA接收:配置好USART串口参数和DMA通道后,通过设置USART的DMA接收位(即USART_CR3寄存器中的DMAEN位)来开启USART DMA接收。 4.等待数据的接收:等待DMA完成数据的接收并存储到缓存中,可以通过DMA传输完成中断和状态标志位等方式来判断是否已经接收到数据。 5.处理数据:在DMA传输完成中断处理函数中对接收到的数据进行处理,例如打印、解析或存储等。 总体来说,使用USART DMA接收数据可以提高数据的可靠性和稳定性,也有利于系统的性能优化和资源的节约。虽然配置复杂,但是在实际应用中确实是一种十分可靠和高效的数据通信方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值