这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_53 [2020/03/26 18:21] zgf [三、 实验原理] |
icore4t_53 [2022/04/01 10:56] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-03-26 | gingko | 初次建立 | | | V1.0 | 2020-03-26 | gingko | 初次建立 | | ||
- | \\ | ||
- | \\ | ||
- | \\ | ||
\\ | \\ | ||
\\ | \\ | ||
行 75: | 行 71: | ||
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | - | ||
- 了解STM32的UART结构。 | - 了解STM32的UART结构。 | ||
- 了解STM32的UART特征。 | - 了解STM32的UART特征。 | ||
行 91: | 行 86: | ||
- 装有WIN XP(及更高版本)系统的计算机。 | - 装有WIN XP(及更高版本)系统的计算机。 | ||
==== 三、 实验原理 ==== | ==== 三、 实验原理 ==== | ||
- | === 1.串口通讯协议简介 === | + | === 串口通讯协议简介 === |
* 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 | * 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 | ||
* 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。 | * 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。 | ||
* 下面我们分别对串口通讯协议的物理层及协议层进行讲解。 | * 下面我们分别对串口通讯协议的物理层及协议层进行讲解。 | ||
- | **物理层:** | + | == 1、物理层: == |
+ | |||
* 串口通讯的物理层有很多标准及变种,我们主要讲解 RS-232 标准,RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。 | * 串口通讯的物理层有很多标准及变种,我们主要讲解 RS-232 标准,RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。 | ||
* 使用 RS-232 标准的串口设备间常见的通讯结构见下图。 | * 使用 RS-232 标准的串口设备间常见的通讯结构见下图。 | ||
{{ :icore4t:icore4t_arm_hal_53_1.png?direct&650 |}} | {{ :icore4t:icore4t_arm_hal_53_1.png?direct&650 |}} | ||
* 在上面的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 校准”的电平信号,才能实现通讯。 | * 在上面的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 校准”的电平信号,才能实现通讯。 | ||
- | **电平标准:** | + | * **电平标准:** |
* 根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。 | * 根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。 | ||
{{ :icore4t:icore4t_arm_hal_53_2.png?direct&400 |}} | {{ :icore4t:icore4t_arm_hal_53_2.png?direct&400 |}} | ||
行 106: | 行 103: | ||
{{ :icore4t:icore4t_arm_hal_53_3.png?direct&650 |}} | {{ :icore4t:icore4t_arm_hal_53_3.png?direct&650 |}} | ||
* 因为控制器一般使用 TTL 电平标准,所以常常会使用 SP3232 芯片对 TTL 及 RS-232电平的信号进行互相转换。 | * 因为控制器一般使用 TTL 电平标准,所以常常会使用 SP3232 芯片对 TTL 及 RS-232电平的信号进行互相转换。 | ||
- | **RS-232介绍:** | + | * **RS-232介绍:** |
* RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。DCE可以理解为数据通信端,比如modem设备;DTE可以理解为数据终端,比如电脑。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。 | * RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。DCE可以理解为数据通信端,比如modem设备;DTE可以理解为数据终端,比如电脑。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。 | ||
* RS-232规定的标准传送速率有50b/s、75b/s、110b/s、150b/s、300b/s、600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s,可以灵活地适应不同速率的设备。对于慢速外设,可以选择较低的传送速率:反之,可以选择较高的传送速率。 | * RS-232规定的标准传送速率有50b/s、75b/s、110b/s、150b/s、300b/s、600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s,可以灵活地适应不同速率的设备。对于慢速外设,可以选择较低的传送速率:反之,可以选择较高的传送速率。 | ||
* RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点: | * RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点: | ||
- | * **(1)**接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。 即:逻辑“1”为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 | + | |
- | * **(2)**传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。 | + | (1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1” |
- | * **(3)**接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 | + | 为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信 |
- | * **(4)**传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。 | + | 号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 |
+ | (2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是 | ||
+ | 这个原因。 | ||
+ | (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰 | ||
+ | 性弱。 | ||
+ | (4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。 | ||
+ | |||
* 在旧式的台式计算机中一般会有 RS-232 标准的 COM 口(也称 DB9 接口),见下图。 | * 在旧式的台式计算机中一般会有 RS-232 标准的 COM 口(也称 DB9 接口),见下图。 | ||
{{ :icore4t:icore4t_arm_hal_53_4.png?direct&500 |}} | {{ :icore4t:icore4t_arm_hal_53_4.png?direct&500 |}} | ||
行 123: | 行 126: | ||
{{ :icore4t:icore4t_arm_hal_53_6.png?direct&600 |}} | {{ :icore4t:icore4t_arm_hal_53_6.png?direct&600 |}} | ||
- | **硬件连接:** | + | * **硬件连接:** |
* 9线式连接示意图: | * 9线式连接示意图: | ||
{{ :icore4t:icore4t_arm_hal_53_7.jpg?direct |}} | {{ :icore4t:icore4t_arm_hal_53_7.jpg?direct |}} | ||
行 131: | 行 134: | ||
{{ :icore4t:icore4t_arm_hal_53_9.jpg?direct |}} | {{ :icore4t:icore4t_arm_hal_53_9.jpg?direct |}} | ||
* 在目前的其它工业控制使用的串口通讯中,一般只使用 RXD、 TXD 以及 GND 三条信号线,直接传输数据信号,我们的iCore4T扩展底板也是采用3线连接的。3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。 | * 在目前的其它工业控制使用的串口通讯中,一般只使用 RXD、 TXD 以及 GND 三条信号线,直接传输数据信号,我们的iCore4T扩展底板也是采用3线连接的。3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。 | ||
- | **协议层:** | + | == 2、协议层: == |
* 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。串口数据包的基本组成如下图: | * 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。串口数据包的基本组成如下图: | ||
{{ :icore4t:icore4t_arm_hal_53_10.png?direct |}} | {{ :icore4t:icore4t_arm_hal_53_10.png?direct |}} | ||
行 137: | 行 140: | ||
* 本实验中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面的 DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,上图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、 9600、 115200 等。 | * 本实验中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面的 DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,上图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、 9600、 115200 等。 | ||
* **2. 通讯的起始和停止信号** | * **2. 通讯的起始和停止信号** | ||
- | |||
* 串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。 | * 串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。 | ||
* **3. 有效数据** | * **3. 有效数据** | ||
行 152: | 行 154: | ||
|LED_ON\r\n|LED灯亮| | |LED_ON\r\n|LED灯亮| | ||
|LED_OFF\r\n|LED灯灭| | |LED_OFF\r\n|LED灯灭| | ||
- | * ** 原理图:** | + | * 原理图: |
{{ :icore4t:icore4t_arm_hal_53_11.png?direct |}} | {{ :icore4t:icore4t_arm_hal_53_11.png?direct |}} | ||
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
行 207: | 行 209: | ||
UART_HandleTypeDef huart1; | UART_HandleTypeDef huart1; | ||
</code> | </code> | ||
- | UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的UART串口的别名 | + | * UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的UART串口的别名。 |
<code c> | <code c> | ||
typedef struct __UART_HandleTypeDef | typedef struct __UART_HandleTypeDef | ||
行 244: | 行 246: | ||
=== 3.串口发送/接收函数 === | === 3.串口发送/接收函数 === | ||
- | HAL_UART_Transmit();串口发送数据,使用超时管理机制 | + | * HAL_UART_Transmit();串口发送数据,使用超时管理机制 |
- | HAL_UART_Receive();串口接收数据,使用超时管理机制 | + | * HAL_UART_Receive();串口接收数据,使用超时管理机制 |
- | HAL_UART_Transmit_IT();串口中断模式发送 | + | * HAL_UART_Transmit_IT();串口中断模式发送 |
- | HAL_UART_Receive_IT();串口中断模式接收 | + | * HAL_UART_Receive_IT();串口中断模式接收 |
- | HAL_UART_Transmit_DMA();串口DMA模式发送 | + | * HAL_UART_Transmit_DMA();串口DMA模式发送 |
- | HAL_UART_Transmit_DMA();串口DMA模式接收 | + | * HAL_UART_Transmit_DMA();串口DMA模式接收 |
- | 串口发送数据 | + | |
+ | * 串口发送数据 | ||
<code c> | <code c> | ||
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) | HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) | ||
</code> | </code> | ||
- | 功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。 | + | * 功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。 |
- | 参数: | + | * 参数: |
- | UART_HandleTypeDef*huart UATR的别名 如: UART_HandleTypeDef huart2;别名就是huart2 | + | * UART_HandleTypeDef*huart UATR的别名 如: UART_HandleTypeDef huart2;别名就是huart2 |
- | *pData 需要发送的数据 | + | * *pData 需要发送的数据 |
- | Size 发送的字节数 | + | * Size 发送的字节数 |
- | Timeout 最大发送时间,发送数据超过该时间退出发送 | + | * Timeout 最大发送时间,发送数据超过该时间退出发送 |
- | 中断接收数据: | + | |
+ | * 中断接收数据: | ||
<code c> | <code c> | ||
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) | HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) | ||
</code> | </code> | ||
- | 功能:串口中断接收,以中断方式接收指定长度数据。 | + | * 功能:串口中断接收,以中断方式接收指定长度数据。 |
- | 大致过程:设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。之后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断) | + | * 大致过程:设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。之后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断) |
- | 参数: | + | * 参数: |
- | UART_HandleTypeDef *huart UATR的别名 | + | * UART_HandleTypeDef *huart UATR的别名 |
- | *pData 接收到的数据存放地址 | + | * *pData 接收到的数据存放地址 |
- | Size 接收的字节数 | + | * Size 接收的字节数 |
=== 4.串口中断函数 === | === 4.串口中断函数 === | ||
<code c> | <code c> | ||
行 276: | 行 280: | ||
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); | HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); | ||
//串口发送中断回调函数 | //串口发送中断回调函数 | ||
- | HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少) | + | HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); |
+ | //串口发送一半中断回调函数(用的较少) | ||
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); | HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); | ||
//串口接收中断回调函数 | //串口接收中断回调函数 | ||
行 284: | 行 289: | ||
//串口接收错误函数 | //串口接收错误函数 | ||
</code> | </code> | ||
- | 串口接收中断回调函数 | + | |
+ | * 串口接收中断回调函数 | ||
<code c> | <code c> | ||
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); | HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); | ||
</code> | </code> | ||
- | 功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改。 | + | * 功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改。 |
- | 参数: | + | * 参数: |
- | UART_HandleTypeDef *huart UATR的别名 | + | * UART_HandleTypeDef *huart UATR的别名 |
- | 串口中断处理函数 | + | * 串口中断处理函数 |
<code c> | <code c> | ||
HAL_UART_GetState(); | HAL_UART_GetState(); | ||
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); | HAL_UART_IRQHandler(UART_HandleTypeDef *huart); | ||
</code> | </code> | ||
- | 功能:对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用 | + | * 功能:对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用 |
- | 串口查询函数 | + | * 串口查询函数 |
<code c> | <code c> | ||
HAL_UART_GetState(); | HAL_UART_GetState(); | ||
行 313: | 行 319: | ||
==== 六、 实验现象 ==== | ==== 六、 实验现象 ==== | ||
通过串口输入命令可以控制LED的亮灭。 | 通过串口输入命令可以控制LED的亮灭。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_53_12.png?direct |}} | |