STM32之UART、RS232、RS485通讯

一、USART解释

  USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备,相互独立的接收数据和发送数据;任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。为什么三种通讯方式一起学习呢?因为单片机最后都是要用到UASRT这个功能与外界通讯的。由于UART规定只是规定了数据(信号的时序)的格式,并没有规定接口的电气特性,这样导致了他们在物理层无法实现互联。

   UART通讯时一般直接用处理器自己的TTL电平,(高电平表示1,低电平代表0)STM32自己的TTL电平是3.3V  51单片机的TTL电平是5V的 所以不能互连。RS232电平规定:逻辑“1”的电平是-5V~ -15V之间,逻辑“0”的电平是+5v~+15V之间,这么高的电压当然需要芯片转换后才能通讯了。232通讯程序和UART通讯程序都是一样的。

STM32F103LQFP48集成有3个UASRT控制器:编号及引脚定义如下:

名称引脚
USART1

PA9(30脚_TX)  PA10(31脚_RX)可复用给42 43脚

USART2PA1(11脚_RTS)  PA2(12脚_TX)
USART3PA1(21脚_TX)  PA2(22脚_RX)

数据线端口是高电平状态①(红色线表示),如果开始发送数据了,那么总线将高电平拉低成低电平,然后开始发送数据,发送数据的顺序是先发数据的低位,然后发送到高位。一般是8位数据位(也可以是7位),然后是校验位(校验位可有可无),最后一位是停止位(停止位是必须有的)停止位可以是1位,1.5位,2位。

 发送方这样不停的发送数据,接收方怎么知道发送的的0还是1呢?如果要发送0x00,和0xFF数据,这样总线是不是一直在高电平或者低电平,我们约定一个节拍(如:波特率9600指的是每秒可以传输9600个二进制位,传送一个位需要1/9600秒)双方共同遵守,这个节拍持续的时间长短,来换算成发送了多少个0或者多少个1了。尽管设置了相同的波特率,设备双方的时钟基准可能不太一样,为了防止累计误差出现,每次发完一个字节后又重新开始发送下一个字节,时间重新开始计时。

控制器内部结构图如下

 初始化端口库函数

void USART1_Init(u32 bound){ //串口1初始化并启动
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
    //USART1_RX	  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
   //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器 
   //USART 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启ENABLE/关闭DISABLE中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 
}
/*
USART1专用的printf函数
当同时开启2个以上串口时,printf函数只能用于其中之一,其他串口要自创独立的printf函数
调用方法:USART1_printf("123"); //向USART2发送字符123
*/
void USART1_printf (char *fmt, ...){ 
	char buffer[USART1_REC_LEN+1];  // 数据长度
	u8 i = 0;	
	va_list arg_ptr;
	va_start(arg_ptr, fmt);  
	vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);
	while ((i < USART1_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART1, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 
	}
	va_end(arg_ptr);
}

RS485总线标准规定采用差分信号进行数据传输,两根线电压差+2V~+6V 表示逻辑1;两根线电压差-2V~-6V 表示逻辑0;使用差分信号能有效的减少工模干扰,2根线之间没有地。RS485的通讯距离可以达到1500m。电压低了也不会损坏电路接口。485采用总线式拓扑结构,数据的发送和接收要占用2根线,所以发送时候就不能接收,接收时候不能发,所以只能采用半双工的发送和接收数据,在软件编程时候注意区分。

虽然处理器集成了UART控制器,产生的一般是TTL电平,该电平并不符合RS485标准,所以一般我们还要外加电路将TTL信号转换为差分的485信号。常用的芯片有(MAX485、SN75LBC184、SP3485) 磁隔离的高速芯片有AD公司的 ADM2582E/ADM2587E,光隔离的芯片有国产的金升阳公司的TD301D485H 不同的芯片要看厂家的推荐参考电路和最大速度以及使用环境。

典型电路如下

一起学习交流群:QQ群号码:255864236

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32CubeIDE 是针对STMicroelectronics公司的STM32微控制器系列而设计的集成开发环境。RS485则是一种串行通信协议,常用于远距离数据传输。 STM32CubeIDE提供了丰富的功能和工具,方便开发者进行基于STM32微控制器的应用程序开发。它集成了编译器、调试器以及一系列适用于STM32的软件库和驱动程序。使用STM32CubeIDE可以方便地进行项目管理、代码编写、调试和固件更新等操作。 RS485是一种标准化的串行通信协议,它使用差分传输技术,并具备抗干扰能力较强的特点,可实现长距离、高速率和多点通信。RS485通信可以连接多个设备,具备一对多的通信能力。 在使用STM32CubeIDE开发应用程序时,我们可以利用STM32微控制器的UART功能来实现RS485通信。首先,需要将RS485总线的收发线连接到STM32微控制器的UART引脚上。然后,通过STM32CubeIDE进行配置,设置UART的相关参数,如波特率、数据位数、停止位等。接下来,可以通过编写代码来实现RS485通信的发送和接收功能。 在项目中,使用STM32CubeIDE和RS485可以实现STM32微控制器与其他设备之间的数据传输。通过RS485总线,可以连接多个设备,实现数据的收发和控制命令的传递。这在工业自动化、仪器仪表和通信领域等应用中经常使用。 总之,STM32CubeIDE是一个方便强大的集成开发环境,可用于开发基于STM32微控制器的应用程序,并可通过RS485通信实现设备间的数据传输和通信。 ### 回答2: STM32 Cube IDE是一种用于开发STM32微控制器的综合开发环境。而RS485是一种常见的串行通信协议,广泛应用于工业自动化等领域。 在STM32 Cube IDE中,开发者可以使用HAL库和CubeMX配置工具来轻松地编写程序,并通过内置的调试工具进行调试。同时,STM32 Cube IDE还提供了丰富的示例代码和库函数,方便开发者快速上手以及快速开发应用程序。 当涉及到使用RS485通信时,STM32 Cube IDE提供了相应的库函数和示例代码,以支持开发者使用STM32微控制器实现RS485通信功能。开发者可以根据自己的需求选择适合的函数库,并使用CubeMX配置工具来配置串口功能。 在使用RS485通信时,开发者需要了解RS485通信的特点。与RS232不同,RS485支持多点通信,可以连接多个设备。为了实现RS485通信,开发者需要配置STM32微控制器的串口为RS485模式,并设置通信参数,如波特率、校验位等。 在程序编写方面,开发者可以使用STM32的串口发送和接收函数来实现RS485通信。开发者可以根据不同的通信需求,选择适合的发送和接收函数,进行数据的发送和接收,并进行相应的数据处理。 总之,使用STM32 Cube IDE和RS485通信协议可以方便快捷地开发STM32微控制器应用程序,并实现稳定可靠的串行通信功能。 ### 回答3: STM32 Cube IDE是一个集成开发环境(IDE),用于开发STM32微控制器。它是STMicroelectronics为了提供一个综合的开发平台而开发的。RS485是一种通信协议,用于在多个设备之间进行点对点或多点通信。以下是关于STM32 Cube IDE和RS485的更多详细信息: STM32 Cube IDE是一个基于Eclipse的集成开发环境,用于开发STM32微控制器。它提供了一套工具和功能,用于编写、编译、调试和烧录STM32微控制器的代码。STM32 Cube IDE还提供了各种代码库和驱动程序,以支持不同的STM32微控制器系列和外设设备。 RS485是一种串行通信协议,用于在多个设备之间进行点对点或多点通信。它使用差分信号线路来传输数据,具有较高的抗干扰能力和远距离传输能力。RS485支持全双工通信,可以同时传输和接收数据。 在STM32 Cube IDE中使用RS485通信时,需要通过STM32UART(通用异步收发器)接口来实现RS485协议。这涉及到配置STM32UART外设进行RS485通信,并使用适当的电平转换电路和电源管理来实现RS485信号的传递和转换。 使用STM32 Cube IDE和RS485进行通信时,可以通过发送和接收数据来实现设备之间的通信。通信的具体协议和数据格式可以根据应用需求来定义和实现。 总结来说,STM32 Cube IDE是用于开发STM32微控制器的集成开发环境,而RS485是一种通信协议,用于在多个设备之间进行点对点或多点通信。在STM32 Cube IDE中,可以通过配置STM32UART外设和RS485电平转换电路来实现RS485通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值