[其他ST产品] STM32CubeMX串口通讯

[复制链接]
 楼主| t61000 发表于 2023-1-26 14:07 | 显示全部楼层 |阅读模式
串口的简单介绍
RS-232与TTL

根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。
单工通信、半双工通信和全双工通信

讲到串口,我们还需要具备这些基础概念。
单工通讯

    (1)单工通讯特点很简单,就是只有一个发送端,一个接收端。从一开始发射端和接收端就已经确立,无法改变,数据传输只能从发送端向接收端发送。

    (2)举个生活中的例子,你可以理解为某些霸道的家长,从一开始就已经确定了他是发射端,小孩只能被动接收。只能是家长教育孩子,不能孩子指正家长。
9685263d218829c643.png


评论

———————————————— 版权声明:本文为CSDN博主「风正豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_63922192/article/details/128119933  发表于 2023-1-26 15:50
———————————————— 版权声明:本文为CSDN博主「风正豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_63922192/article/details/128119933  发表于 2023-1-26 15:44
———————————————— 版权声明:本文为CSDN博主「风正豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_63922192/article/details/128119933  发表于 2023-1-26 14:17
———————————————— 版权声明:本文为CSDN博主「风正豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_63922192/article/details/128119933  发表于 2023-1-26 14:07
 楼主| t61000 发表于 2023-1-26 14:14 | 显示全部楼层
半双工通信

    (1)半双工通信的特点就是,双方既可以是发送端又可以是接收端。不过问题在于,每一次数据传输过程中,任何一方只能为一种状态。如果你是接收端,就只能是接收端。如果你是发送端,那么就只能是发送端。

    (2)以生活中能够见到的对讲机为例,当A在对讲机中说话的时候。B只能听,不能说话。如果B要说话了,那么需要等待A说话完成之后,B才能说话。 9091263d21a5fc135a.png
 楼主| t61000 发表于 2023-1-26 14:15 | 显示全部楼层
串口作用以及需要配置的东西

    (1)串口通讯作为最常用的通讯手段之一,作用许多。最常见的就是使用蓝牙模块或者是WIFI模块进行通讯,也可以实现与OpenMV实现通讯。

    (2)串口一般都有波特率,数据位,校验位,停止位,流控需要配置。为什么需要配置这些东西呢?因为两个不同的设备进行交流的时候,需要在同一个频道上。就好比,一个只会说中文的人与一个只会说英文的人是无法进行沟通的。
6982963d21a8d71d8c.png 既然两个人要需要共同,那么只要说一种语言就行了,为什么还有这么多配置呢?接下来我一一介绍。
 楼主| t61000 发表于 2023-1-26 14:17 | 显示全部楼层
波特率

(1)串口其实分为两种UART(异步通信)和USART(同步通讯)。这两者的区别是什么呢?

(2)同步通讯你可以理解为你打电话给别人,电话双方都是同时沟通交流的。

(3)而异步通讯,你可以理解为电话留言。我发一段话给你,你不在没关系,有时间的时候听就可以了。我们一般使用异步通讯。
 楼主| t61000 发表于 2023-1-26 14:19 | 显示全部楼层
数据位

数据位,决定了通信过程中传输的有效数据位数,数据位通常有5、6、7 、8 bit,根据需要进行相应的配置,一般配置为8bit,因为一个字节就是8bit。
 楼主| t61000 发表于 2023-1-26 15:31 | 显示全部楼层
校验位

有时候,我们需要对接收到的数据进行判断是否正确。因为有时候进行数据交互过程中,可能受到一些外接干扰。一般来说会有4中校验方式。偶校验、奇校验、1校验和0校验。
 楼主| t61000 发表于 2023-1-26 15:33 | 显示全部楼层
偶校验:有效数据和校验位中“1”的个数为偶数。比如有效数据:11001010, 此时有效数据“1”的个数为 4 个,所以偶校验位为“0”。如果我们接收到的数据,查看偶校验位为1,表示数据受到干扰。
 楼主| t61000 发表于 2023-1-26 15:43 | 显示全部楼层
奇校验:有效数据和校验位中“1”的个数为奇数。比如有效数据:01101001, 此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”。如果我们接收到的数据,查看奇校验位为0,表示数据受到干扰。
 楼主| t61000 发表于 2023-1-26 15:45 | 显示全部楼层
停止位

(1)停止位一般有1,1.5,2。因为不同设备的时钟可能有偏差,就好像即使是双胞胎也有不同一样。

(2)而微小的时钟偏差,会出现微弱的不同步现象。只进行一次数据传输还好,当我们进行多次数据传输之后,这个不同步会逐渐放大,最后导致数据传输有问题。所以停止位还提供了一次校正时钟同步的机会。

(3)这个过程就好像是一条笔直的路线,汽车一直往前开。假如司机不小心动了一点点方向盘,只走几十米可能看不出来偏差。但是假如再走个几百米,就能够看到明显偏移了路线。所以司机需要不断修正方向盘保持直行。
 楼主| t61000 发表于 2023-1-26 15:46 | 显示全部楼层
流控

(1)这个对于很多刚入门的人不会关注,都是直接设置无流控的,我也没用过。还是简单介绍一下。

(2)因为两个不同的设备对数据的处理速度不同,可能导致丢失数据的情况。比如A向B发送数据,A的处理速度极快,不断给B发送数据。但是B处理速度可能慢一点,会接收不过来,导致数据丢失。

(3)举个例子。就像我们上模电课,老师思路敏捷,滔滔不绝。但是我们对这些知识的处理速度可能会慢一点。这样就会导致,做作业的时候,很奇怪,这个东西讲过吗?

(4)流控又分为硬件流控与软件流控。硬件流控就是 RTS (Require ToSend,发送请求)和CTS (Clear ToSend,发送允许)这两个引脚。这个时候串口通讯就不再是只有GND,TX,RX这三个了,将会增加RTS 和CTS 这两个引脚。

(5)一般不用流控。需要更深了解的,自行学习。
 楼主| t61000 发表于 2023-1-26 15:51 | 显示全部楼层
最后强调一点!

TX(Transmit )发送数据,需要与另外一个MCU的RX连接(Receive )。两边的GND要连接,因为都需要知道对方的基准电压是多少!
498263d23107912a2.png
 楼主| t61000 发表于 2023-1-26 15:52 | 显示全部楼层
STM32CubeMX配置
时钟配置

还是和之前的一样步骤
6109563d231350fc8a.png
 楼主| t61000 发表于 2023-1-26 15:53 | 显示全部楼层
 楼主| t61000 发表于 2023-1-26 15:54 | 显示全部楼层
UART配置
9338063d231c5cdb87.png
 楼主| t61000 发表于 2023-1-26 16:04 | 显示全部楼层
 楼主| t61000 发表于 2023-1-26 16:04 | 显示全部楼层
生成文件
2054163d2340d907fb.png
7018063d23419bffbf.png
 楼主| t61000 发表于 2023-1-26 16:05 | 显示全部楼层
Keil编程
查看 MX_USART1_UART_Init();

我发现我生成的串口文件里面没用进行串口使能,即使我再CubeMX里面设置了。

所以你们要看看__HAL_UART_ENABLE_IT()这个函数。
 楼主| t61000 发表于 2023-1-26 16:11 | 显示全部楼层
 楼主| t61000 发表于 2023-1-26 16:13 | 显示全部楼层
  1. void MX_USART1_UART_Init(void)
  2. {

  3.   /* USER CODE BEGIN USART1_Init 0 */

  4.   /* USER CODE END USART1_Init 0 */

  5.   /* USER CODE BEGIN USART1_Init 1 */

  6.   /* USER CODE END USART1_Init 1 */
  7.   huart1.Instance = USART1;
  8.   huart1.Init.BaudRate = 9600;
  9.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart1.Init.StopBits = UART_STOPBITS_1;
  11.   huart1.Init.Parity = UART_PARITY_NONE;
  12.   huart1.Init.Mode = UART_MODE_TX_RX;
  13.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   if (HAL_UART_Init(&huart1) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
  19. /*使能串口接收断 */
  20.   __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);  

  21. }
 楼主| t61000 发表于 2023-1-26 16:13 | 显示全部楼层
编写中断服务程序

在stm32f1xx_it.c中找到void USART1_IRQHandler(void)。
3736163d2362ed7982.png
  1. void USART1_IRQHandler(void)
  2. {
  3.   uint8_t ch=0;
  4.   
  5.         if(__HAL_UART_GET_FLAG( &UartHandle, UART_FLAG_RXNE ) != RESET)
  6.         {               
  7.     ch=( uint16_t)READ_REG(UartHandle.Instance->DR);
  8.     WRITE_REG(UartHandle.Instance->DR,ch);

  9.         }
  10. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

124

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

19

主题

124

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部