数据接收
数据接收详解
引脚读取数据
数据逐步推入移位寄存器
字节推入移位寄存器后,转入接收寄存器,新的数据继续进入移位寄存器
数据接受完毕,新数据即将进入接受数据寄存器
数据进入接收寄存器,新数据继续推入移位寄存器
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错误标志位及其含义和作用:
-
帧错误(FE, Frame Error):
当接收到的数据帧的格式不正确时(例如,停止位不正确或数据位数量与配置不匹配),帧错误标志位会被置位。该标志位用于指示接收到的数据帧存在格式错误。 -
噪声(NE, Noise Error):
当接收到的数据在数据位期间检测到意外的噪声(即数据位与预期的逻辑电平不匹配)时,噪声错误标志位会被置位。该标志位用于指示接收到的数据受到噪声干扰。 -
溢出错误(ORE, Overflow Error):
当接收FIFO(先进先出队列)溢出时(即接收到的数据超过了FIFO的容量),溢出错误标志位会被置位。该标志位用于指示接收FIFO已经溢出,可能导致数据丢失。 -
奇偶校验错误(PE, Parity Error):
当接收到的数据的奇偶校验位与配置的奇偶校验不匹配时,奇偶校验错误标志位会被置位。该标志位用于指示接收到的数据的奇偶校验错误。