这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_53 [2020/03/26 18:29] 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 标准的串口设备间常见的通讯结构见下图。 | ||
行 113: | 行 110: | ||
(1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1” | (1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1” | ||
为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信 | 为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信 | ||
- | 号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路 | + | 号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 |
- | 连接。 | + | |
(2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是 | (2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是 | ||
这个原因。 | 这个原因。 | ||
行 138: | 行 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 |}} | ||
行 144: | 行 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. 有效数据** | ||
行 159: | 行 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 |}} | ||
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
行 214: | 行 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 | ||
行 251: | 行 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> | ||
行 283: | 行 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); | ||
//串口接收中断回调函数 | //串口接收中断回调函数 | ||
行 291: | 行 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(); | ||
行 320: | 行 319: | ||
==== 六、 实验现象 ==== | ==== 六、 实验现象 ==== | ||
通过串口输入命令可以控制LED的亮灭。 | 通过串口输入命令可以控制LED的亮灭。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_53_12.png?direct |}} | |