银杏科技有限公司旗下技术文档发布平台 |
技术支持电话 | 0379-69926675-801 |
技术支持邮件 | Gingko@vip.163.com |
版本 | 日期 | 作者 | 修改内容 |
V1.0 | 2020-07-29 | gingko | 初次建立 |
STM32CubeMX教程五十五——RS_422通信实验
1.在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR
2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置
在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。
3.配置RCC,使用外部时钟源
4.时基源选择SysTick
5.将PA10,PB7,PB8设置为GPIO_Output
6.引脚模式配置
7.配置串口
在NVIC Settings一栏使能接收中断
引脚配置
8.时钟源设置,选择外部高速时钟源,配置为最大主频
9.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27
10.点击Code Generator,进行进一步配置
Copy all used libraries into the project folder
将HAL库的所有.C和.H都复制到所建工程中
Copy only the necessary library files
只复制所需要的.C和.H(推荐)
Add necessary library files as reference in the toolchain project configuration file
不复制文件,直接从软件包存放位置导入.C和.H
自行选择方式即可
Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral
Backup previously genareated files when re-generating
Keep User Code when re-generating
Delete previously generated files when not re-generated
Set all free pins as analog (to optimize the power consumption)
11.然后点击GENERATE CODE 创建工程
创建成功,打开工程。
实验五十五:RS_422通信实验——收发测试
一、 实验目的与意义
了解STM32的UART结构。
了解STM32的UART特征。
掌握STM32的UART的使用方法。
掌握RS-422的使用方法。
掌握KEIL MDK 集成开发环境使用方法。
二、 实验设备及平台
-
iCore4TX 扩展底板。
-
Micro USB线缆。
Keil MDK 开发平台。
STM32CubeMX开发平台。
装有WIN XP(及更高版本)系统的计算机。
三、 实验原理
1.串口通讯协议简介
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。实际上还有一根信号地线,共5根线。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。
RS422 的特点:
RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在短距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。
RS422接口:
RS422设备为全双工设备,相当于两路RS485。RS422收发器有两个控制引脚、4各信号引脚(TX+、TX-、RX+、RX-),其中TX+等价RS485的485A引脚,TX-等价RS485的485B引脚。如果RS422接口标识为A、B、Y、X四个名称,则Y对应RS422的RX+,Z对应RS422的RX-。
RS422收发器的两个控制引脚需要配合使用操作RS422的工作模式。
RS422设备也支持点对点连接和点对多点连接,接线方式与RS485接口连接有所不同。示意图如下,第一张图为点对点连接,第二张图为点对多点连接:
RS232、RS422和RS485的区别:
RS-232是最常见的串口,是大部分兼容Windows的桌面计算机的一个标准组件。如今通过USB到RS-232转换器使用RS-232更为常见。RS-232只允许每根线使用一个发送器和接收器。RS-232也使用全双工双数方式。
RS-422(EIARS-422-AStandard)是传统Apple计算机的串口连接标准。该标准机制下的最高数据传输速度可达10Mb/s。RS-422使用两根线发送每个信号,以增加最大波特率和线缆长度。RS-422还指定用于多点通讯应用,一个发送器连接到最多10个接收器的总线并发送数据。
RS-485是RS-422的扩展集,对这些能力进行了扩展。RS-485解决了RS-422处理多点通讯的限制,通过同一数据线通信时最多允许32个设备。RS-485总线上的任意从设备都可以与任意其他32个从设备进行通信,无需经由主设备。由于RS-422是RS-485的子集,因而所有RS-422设备可能受RS-485控制。
RS-485和RS-422都支持多点通讯能力,但RS-485可允许最多32个设备,而RS-422的限制为10个。对于这两种串行通讯协议,您都需要自己添加终端匹配电路。
2.协议层
4. 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无校验(noparity),它们介绍如下:
奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为: 01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。
偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧: 11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。
0 校验是不管有效数据中的内容是什么,校验位总为“0”, 1 校验是校验位总为“1”。
在无校验的情况下,数据包中不包含校验位。
在本实验中,我们的计算机通过转接模块连接iCore4T的RS-422,通过串口工具向RS-422发送数据并接收RS-422发来的数据。
原理图:
四、 实验程序
1.主函数
int main(void)
{
char buffer[UART_BUFFER_SIZE];
HAL_Init();
SystemClock_Config();
i2c.initialize();
axp152.initialize();
axp152.set_dcdc1(3500);//[ARM & FPGA]
axp152.set_dcdc2(1200);//[FPGA INT]
axp152.set_dcdc3(3300);//[DCOUT3]
axp152.set_dcdc4(3300);//[DCOUT4]
axp152.set_aldo1(3300);//[BK3]
axp152.set_aldo2(3300);//[ALDOOUT2]
axp152.set_dldo1(3300);//[BK0]
axp152.set_dldo2(3300);//[BK1]
HAL_Delay(200);
MX_GPIO_Init();
MX_USART1_UART_Init();
usart1.initialize(115200);
usart1.printf("Hello, I am iCore4TX\r\n");
while (1)
{
if(usart1.receive_ok_flag){ //接收完成
usart1.receive_ok_flag = 0;
memcpy(buffer,usart1.receive_buffer,UART_BUFFER_SIZE);
memset(usart1.receive_buffer,0,UART_BUFFER_SIZE);
usart1.printf(buffer);//将接收数据发送出去
}
}
}
2.UART结构体定义
UART_HandleTypeDef huart1;
typedef struct __UART_HandleTypeDef
{
USART_TypeDef *Instance;
//UART寄存器基地址
UART_InitTypeDef Init;
//UART通信参数
uint8_t * pTxBuffPtr;
//指向UART Tx传输缓冲区的指针
uint16_t TxXferSize;
//UART Tx传输大小
__IO uint16_t TxXferCount;
//UART Tx传输计数器
uint8_t * pRxBuffPtr;
//指向UART Rx传输缓冲区的指针
uint16_t RxXferSize;
//UART Rx传输大小
__IO uint16_t RxXferCount;
//UART Rx传输计数器
DMA_HandleTypeDef * hdmatx;
//UART Tx DMA句柄参数
DMA_HandleTypeDef * hdmarx;
//UART Rx DMA句柄参数
HAL_LockTypeDef Lock;
//锁定对象
__IO HAL_UART_StateTypeDef gState;
//与全局句柄管理有关的UART状态信息并且与Tx操作有关。
__IO HAL_UART_StateTypeDef RxState;
//与Rx操作有关的UART状态信息
__IO uint32_t ErrorCode;
//UART错误代码
} UART_HandleTypeDef;
3.串口发送/接收函数
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
串口发送数据
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
4.串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
//串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
//串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
//串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();
//串口接收错误函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
HAL_UART_GetState();
//判断UART的接收是否结束,或者发送数据是否忙碌
五、 实验步骤
把仿真器与iCore4TX的SWD调试口相连(直接相连或者通过转接器相连);
把iCore4TX通过Micro USB线与计算机相连,为iCore4TX供电;
打开 Keil MDK 开发环境,并打开本实验工程;
烧写程序到 iCore4TX 上;
也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。
六、 实验现象
通过串口工具向RS-422发送自定义数据,接收到来自RS-422的相同自定义数据。