STM32学习(八)

数据接收

数据接收详解

引脚读取数据

数据逐步推入移位寄存器

字节推入移位寄存器后,转入接收寄存器,新的数据继续进入移位寄存器

数据接受完毕,新数据即将进入接受数据寄存器

数据进入接收寄存器,新数据继续推入移位寄存器

RxNE标志

RxNE(Receive Data Register Not Empty)是USART(通用同步异步收发器)模块中的一个重要标志位。RxNE是接收缓冲区非空标志,用于指示接收缓冲区中是否有数据可读。

当USART模块接收到数据时,RxNE标志位会被硬件自动置位,表示接收缓冲区中有数据等待处理。软件可以通过检查RxNE标志位来确定何时读取接收数据寄存器中的数据。

接收数据实现

USART_ReceiveData函数

uint16_t USART_ReceiveData(USARTTypeDef *USARTx)

USART_ReceiveData函数用于从USART的接收数据寄存器(USART_DR)中读取接收到的数据。当USART接收到数据时,接收数据寄存器会被填充,并且接收缓冲区非空标志(RxNE)会被置位。通过调用USART_ReceiveData函数,可以读取接收到的数据,并清除RxNE标志。

USART_ReceiveData函数通常接受一个参数,即USART模块的实例(如USART1、USART2等)。该函数返回一个字符(8位数据),表示从接收数据寄存器中读取到的数据。

void My_USART_SendBytes(USART_TypeDef *USARTx,uint8_t *pData, uint16_t Size);
void my_USART_Init();
void my_OnBoardLED_Init();


int main(){
  
	my_USART_Init();
	my_OnBoardLED_Init();
	while(1){
			while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET){}
				
			uint8_t byteRcwd = USART_ReceiveData(USART1);

			if(byteRcwd == '0'){
					GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
			}else if(byteRcwd == '1'){
					GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
			}
				
	}
	
	//printf("Hello world. \r\n");
	
	//My_USART_SendBytes(USART1,bytesToSend,5);
	
}


//@作用:初始化串口,初始化GPIO对应引脚
//@参数:无参数
void my_USART_Init(){
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO模块时钟
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//设置重载映射
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开时钟
	
	USART_InitTypeDef USART_InitStruct;//建立串口结构体
	
	USART_InitStruct.USART_BaudRate = 115200;//波特率115200
	USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//双向传输模式
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8位数据位
	USART_InitStruct.USART_Parity = USART_Parity_No;//无校验
	USART_InitStruct.USART_StopBits = USART_StopBits_1;//1位停止位
	
	USART_Init(USART1,&USART_InitStruct);
	
	USART_Cmd(USART1,ENABLE);
}

void my_OnBoardLED_Init(){
		
		GPIO_InitTypeDef GPIO_InitStruct;
	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
		GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
		GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
		GPIO_Init(GPIOC,&GPIO_InitStruct);
	
		GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}

上述代码通过串口接收数据‘1’或‘0’,当接收‘1’时板载LED点亮,当接收‘0’时板载LED熄灭

发送框内输入1,点击发送,板载LED点亮

错误标志位

在STM32单片机的USART模块中,存在多个错误标志位,用于指示USART接收过程中发生的错误。以下是一些常见的USART错误标志位及其含义和作用:

  1. 帧错误(FE, Frame Error)‌:

    当接收到的数据帧的格式不正确时(例如,停止位不正确或数据位数量与配置不匹配),帧错误标志位会被置位。该标志位用于指示接收到的数据帧存在格式错误。
  2. 噪声(NE, Noise Error)‌:

    当接收到的数据在数据位期间检测到意外的噪声(即数据位与预期的逻辑电平不匹配)时,噪声错误标志位会被置位。该标志位用于指示接收到的数据受到噪声干扰。
  3. 溢出错误(ORE, Overflow Error)‌:

    当接收FIFO(先进先出队列)溢出时(即接收到的数据超过了FIFO的容量),溢出错误标志位会被置位。该标志位用于指示接收FIFO已经溢出,可能导致数据丢失。
  4. 奇偶校验错误(PE, Parity Error)‌:

    当接收到的数据的奇偶校验位与配置的奇偶校验不匹配时,奇偶校验错误标志位会被置位。该标志位用于指示接收到的数据的奇偶校验错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值