stm32通信方式-USART

一、通信目的

  1. 数据传输

    • 将数据从一个设备传送到另一个设备。这可以是在STM32微控制器之间或者STM32与另一类型的设备之间进行。
  2. 系统扩展

    • 通过通信接口连接更多的硬件模块,如传感器、执行器或其他微控制器,从而扩展系统的功能。
  3. 远程控制

    • 允许用户通过网络或无线通信远程控制设备。
  4. 实时监控

    • 通过通信接口收集来自传感器的数据,并将其传输到中央处理单元或其他监控设备进行分析。
  5. 软件更新

    • 通过通信接口进行固件或软件的在线升级。
  6. 调试与测试

    • 在开发过程中,通过串口或其他接口进行调试信息的输出,帮助开发者诊断问题。
  7. 同步化

    • 在某些应用中,通信协议可能不需要物理地址,这样可以简化分布式系统的同步过程。
  8. 交互式应用

    • 使STM32能够与用户界面进行交互,例如响应触摸屏上的用户动作。

二、通信方式

1. 单工通信 (Simplex)

  • 定义:在单工通信中,数据只能沿着一个方向传输。这意味着通信的双方中,一方是固定的发送端,另一方是固定的接收端,无法改变角色。
  • 特点
    • 使用一根数据线进行通信。
    • 数据传输是单向的,不可逆。
  • 应用实例
    • 监视器、打印机、电视机等。
    • 领导给员工训话的比喻。

2. 半双工通信 (Half-Duplex)

  • 定义:在半双工通信中,数据可以在两个方向上传输,但同一时间内只能有一个方向的传输发生。
  • 特点
    • 使用一根数据线,既可以发送数据也可以接收数据,但不能同时进行。
    • 每一端需要一个收发切换的电子开关,通过切换来决定数据向哪个方向传输。
    • 可能会产生时间延迟,信息传输效率相对较低。
  • 应用实例
    • 对讲机。
    • 早期的家庭网络连接设备,如一些调制解调器。

3. 全双工通信 (Full-Duplex)

  • 定义:在全双工通信中,数据可以同时在两个方向上传输,即发送和接收可以同时进行。
  • 特点
    • 使用两根数据线,一根用于发送,一根用于接收。
    • 每一端都有发送器和接收器。
    • 信息传输效率高。

三、USART简介

        USART (Universal Synchronous/Asynchronous Receiver/Transmitter) 是一种通用的串行通信接口,广泛应用于微控制器中,包括STM32系列。USART 支持同步和异步通信模式,并且可以配置为全双工模式,这意味着它可以同时发送和接收数据。        

主要特性

  1. 异步通信:USART 支持标准的异步串行通信协议,如UART,允许通过简单的起始位、数据位、校验位和停止位来传输数据。

  2. 同步通信:USART 还支持同步串行通信模式,可以与SPI等同步串行接口兼容。

  3. 全双工操作:可以同时进行数据的发送和接收。

  4. 多种数据宽度:支持不同的数据位长度(5至9位)。

  5. 可编程波特率:可以根据需要配置不同的数据传输速率。

  6. 硬件流控制:支持硬件流控,如RTS (Request To Send) 和CTS (Clear To Send)。

  7. 中断和DMA支持:支持中断和DMA传输,以减轻CPU的负担。

  8. 错误检测:支持多种错误检测机制,如奇偶校验、溢出检测等。

  9. 唤醒功能:支持从低功耗模式唤醒的功能。

  10. 多个USART接口:STM32通常包含多个USART接口,允许同时连接多个串行设备。

四、串口通信的相关参数

1.波特率

作用:

波特率设置的作用是在串行通信中确定数据传输的速度。波特率定义了每秒钟传输的信号变化次数,通常与比特率相同,在简单的异步串行通信中尤其如此。设置正确的波特率对于确保数据能够准确无误地发送和接收至关重要

stm32通信方式-USART_第1张图片

2.数据帧

数据帧是在串行通信中传输数据的基本单位。数据帧通常包含一系列的位,这些位按照一定的格式组织在一起,以便于发送和接收端能够正确地识别和解释数据。数据帧的结构和格式取决于具体的通信协议,但在异步串行通信中(如UART通信),数据帧通常包括以下几个组成部分:

  1. 起始位(Start Bit):数据帧的开始标志,通常是一个逻辑0位,表示一个数据帧的开始。

  2. 数据位(Data Bits):实际要传输的数据位,通常为5到8位,但某些协议支持更多位。

  3. 奇偶校验位(Parity Bit):可选的校验位,用于检测数据传输中的错误。奇偶校验位可以是偶校验或奇校验,具体取决于所使用的校验类型。

  4. 停止位(Stop Bit):数据帧的结束标志,通常是一个或两个逻辑1位,表示一个数据帧的结束。

数据帧的组成

起始位
  • 作用:标识数据帧的开始。
  • 长度:1位,通常是逻辑0。
数据位
  • 作用:传输实际数据。
  • 长度:通常为5到8位,有时可以达到9位。
奇偶校验位
  • 作用:用于错误检测,帮助接收端判断数据帧是否在传输过程中发生了错误。
  • 长度:1位,可选。
停止位
  • 作用:标识数据帧的结束。

长度:通常为1位或2位,均为逻辑1。


空闲状态下:一般维持在高电平


3.检测噪声数据采样

检测噪声的数据采样是指在信号处理和通信领域中,通过对信号进行采样来检测和分析噪声的过程。噪声是指在信号传输过程中出现的任何不需要的干扰信号,这些干扰信号可能会降低信号的质量并影响数据的准确性。

数据采样

数据采样是指从连续信号中提取离散样本的过程。在数字信号处理中,采样是将模拟信号转换为数字信号的第一步,通常通过模数转换器(ADC)完成。采样的目的是为了能够在数字域中处理信号。

噪声检测

噪声检测是指通过分析信号样本来识别和量化噪声的过程。噪声可以来源于多种因素,包括环境干扰、电子元件的热噪声、电源波动等。

如何检测噪声

  1. 采样信号:首先需要对信号进行采样,得到一系列离散的数据点。

  2. 信号分析:接下来对采样的数据进行分析,可以使用傅里叶变换(FFT)等工具来识别噪声的频谱特征。

  3. 噪声过滤:根据分析结果,可以应用滤波器(如低通滤波器、带通滤波器等)来去除或减弱噪声。

  4. 阈值检测:设定阈值来区分信号和噪声。例如,如果某个频率成分的能量超过了一定阈值,则认为是噪声。

  5. 统计分析:还可以使用统计方法来识别噪声的特性,比如均值、方差、峰值等。

五、初始化过程

代码展示

void Serial_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	
	/*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引脚初始化为复用推挽输出
	
	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引脚初始化为上拉输入
	
	/*USART初始化*/
	USART_InitTypeDef USART_InitStructure;					//定义结构体变量
	USART_InitStructure.USART_BaudRate = 9600;				//波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制,不需要
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//模式,发送模式和接收模式均选择
	USART_InitStructure.USART_Parity = USART_Parity_No;		//奇偶校验,不需要
	USART_InitStructure.USART_StopBits = USART_StopBits_1;	//停止位,选择1位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//字长,选择8位
	USART_Init(USART1, &USART_InitStructure);				//将结构体变量交给USART_Init,配置USART1
	
	/*中断输出配置*/
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);			//开启串口接收数据的中断
	
	/*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_Init(&NVIC_InitStructure);							//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*USART使能*/
	USART_Cmd(USART1, ENABLE);								//使能USART1,串口开始运行
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)