用户工具

站点工具


icore4t_53

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore4t_53 [2020/03/26 18:25]
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 标准的串口设备间常见的通讯结构见下图。
行 111: 行 108:
   * RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:   * RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
  
-  (1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 +  (1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1” 
-  (2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。 +       为-3—-15V;逻辑“0”:+3—+15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信 
-  (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。+       号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 
 +  (2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是 
 +       这个原因。 
 +  (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰 
 +       性弱。
   (4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。   (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 |}}
行 132: 行 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 |}}
行 138: 行 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. 有效数据**
行 153: 行 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 |}}
 ==== 四、 实验程序 ==== ==== 四、 实验程序 ====
行 208: 行 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 ​  
行 245: 行 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>
行 277: 行 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);  ​
 //​串口接收中断回调函数 //​串口接收中断回调函数
行 285: 行 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(); ​
行 314: 行 319:
 ==== 六、 实验现象 ==== ==== 六、 实验现象 ====
 通过串口输入命令可以控制LED的亮灭。 通过串口输入命令可以控制LED的亮灭。
- +{{ :​icore4t:​icore4t_arm_hal_53_12.png?​direct |}} 
  
icore4t_53.1585218359.txt.gz · 最后更改: 2020/03/26 18:25 由 zgf