#【软件STM32cubeIDE下F103配置uart3+DMA收发+简单数据解析-基础样例】

  • 前言
  • 实验器件
  • 第一步:代码调试-基本配置
  • (1)基本配置
  • (2)uart3以及DMA相关配置
  • (3)时钟配置
  • (4)保存后,就可以生成代码
  • 第二步:加入prinf打印
  • (1)不重复造轮子:打印相关连接
  • (2)加入代码片段,注意第四步要放到main里运行
  • (3)代码测试
  • 第三步:加入接收代码
  • (1)加入初始化配置
  • (2)加入回调函数部分
  • (3)加入到中断内
  • 第四步:简单数据解析功能
  • (1)加入接收部分代码
  • (2)加入处理部分代码
  • (3)测试代码
  • 代码连接
  • 注意细节
  • (1)总是多个字符,或者多个其它字符。
  • (2)复制函数的使用。
  • (3)逻辑调试与测试。
  • (4)十进制的1与十六进制0x31。
  • (5)不同串口工具,有些信息不显示。
  • 总结


前言

最近再使用STM32F103调试串口3,也遇到了问题,即使最简单的功能,一些细节也是非常重要的,保持初学者之心,是非常重要的,同时也算做记录,对于初学者会帮助,另外因为之前做过相关实验,虽然当时用的F4,但相关代码功能有很大帮助,算是体现记录的好处。

实验器件

软件环境:STM32cubeIDE 1.8.0
硬件环境:STM32F103xx(相关系列都可以)
下载模块:ST-link下载器 (下载器)
串口模块:串口转换器 (可用232模块代替)

第一步:代码调试-基本配置

(1)基本配置

新建stm32项目,先配置下载口和时钟口,如下图。

stm32cubemx生成配置_stm32cubemx生成配置


stm32cubemx生成配置_stm32_02

(2)uart3以及DMA相关配置

uart3配置稍微复杂点,但是配置串口多了,熟悉了,其实也就知道了,分为几个步骤。
(1)配置异步通信与开启中断使能,这个时候uart3默认IO就会出来。

stm32cubemx生成配置_stm32cubemx生成配置_03


(2)配置DMA,这部分直接添加就好,都是默认的也不需要改什么。

stm32cubemx生成配置_arm_04

(3)配置串口的波特率相关设置,改成你需要的波特率,一般也只改波特率,其它不用动。

stm32cubemx生成配置_单片机_05

(3)时钟配置

也就是外部时钟配置,之前F4用的是168M,现在换F1了,是72M,配置如下。

stm32cubemx生成配置_arm_06

(4)保存后,就可以生成代码

建议先保存,然后生成代码,否则直接生成代码,可能导致软件崩掉。

stm32cubemx生成配置_stm32_07

第二步:加入prinf打印

(1)不重复造轮子:打印相关连接

具体打印方式,之前就写过,所以不要重复造轮子,之前看文章,将代码复制过来。
文章连接:# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一

(2)加入代码片段,注意第四步要放到main里运行

//>>第一步:添加库
#include "string.h"
#include "stdint.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */
//>>第二步:定义数组
uint8_t u_buf[64];

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//>>第三步:定义输出函数printf
#define printf(...)  HAL_UART_Transmit_DMA((UART_HandleTypeDef * )&huart3, (uint8_t *)u_buf,\
											sprintf((char *)u_buf,__VA_ARGS__));
/* USER CODE END PTD */

//>>第四步:打印输出
	  	  printf("abscdasdf");
		  HAL_Delay(1000);

(3)代码测试

随便输出些什么,进行打印测试,在网上找个串口上位机工具,然后连接后串口转USB工具,对应引脚,就可以进行测了。

第四步代码放在主函数,这里没有截图上位机串口数据,打印可以放置的位置指示下。

stm32cubemx生成配置_arm_08

第三步:加入接收代码

(1)加入初始化配置

具体代码见下边连接,这里放置图片展示代码内容。

stm32cubemx生成配置_stm32cubemx生成配置_09

(2)加入回调函数部分

触发发送与接收,都会回调函数,完成函数接收时,数据会被存在数组“UART3_ReceBuf”,我们需要复制出来。这里展示回调函数部分内容。

stm32cubemx生成配置_数据_10

(3)加入到中断内

这点还是挺重要,在中断函数内加入回调函数,不加入相应功能无法实现。

stm32cubemx生成配置_数据_11

第四步:简单数据解析功能

(1)加入接收部分代码

我们收到什么数据,就发出什么数据,因为在回调函数里,不能再用DMA发送了,但可以堵塞发出。

stm32cubemx生成配置_arm_12

(2)加入处理部分代码

我们将数据收到后,如果数据对了,我们只是将数据复制一份,处理不在回调内做,以免拖慢回调。

stm32cubemx生成配置_stm32_13

(3)测试代码

这里这里发放出成功接收并解析代码,处理后发送出来,就是如果接收到数据“123”,那么返回数据“456”。

stm32cubemx生成配置_stm32cubemx生成配置_14

代码连接

代码连接:

注意细节

(1)总是多个字符,或者多个其它字符。

实际测试中发现,总会多个0x0D数字,不知道哪里来的,多次检查后,发现其实之前有发送,因为进入空闲中断后,停止了造成这种奇特现象。

stm32cubemx生成配置_单片机_15


原因点如下:发现有奇怪数据时候,一定看看有没其它地方输出。

stm32cubemx生成配置_数据_16

(2)复制函数的使用。

调试解析时候,我甚至将收到数据打印出来了,但是就是无法触发发送,才发现复制函数数组赋值那块弄错了,还是需要注意的。

stm32cubemx生成配置_arm_17

(3)逻辑调试与测试。

在我们不清楚的情况,或者要测试逻辑时候,可以让其将数据打印出来了,帮助我们定位错的原因。如下图,我们不知道收到什么是数据时候,可以让其直接发回来,帮助我们判断,甚至,复制完数据后,成没成功,也可以打印出来。

stm32cubemx生成配置_arm_18

(4)十进制的1与十六进制0x31。

我这里代码有时候说“123”,有时候又说0x31,0x32,0x33,其实这是他们进制表示不同,一个是十进制,一个是十六进制,比如,十进制的1等同于十六进制0x31,跟ascii码对照表有关系。

(5)不同串口工具,有些信息不显示。

不同上位机串口工具,在使用的时候有差异的,如果不切换到16进制进行显示,我也不会发现十六进制的0x0D,后来发现这个其实是换行符‘\n’。

stm32cubemx生成配置_stm32_19

总结

在简单东西,也有细节值得记录吧~~~。