码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • #【软件STM32cubeIDE下F103配置uart3+DMA收发+简单数据解析-基础样例】


    #【软件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项目,先配置下载口和时钟口,如下图。
    在这里插入图片描述
    在这里插入图片描述

    (2)uart3以及DMA相关配置

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

    在这里插入图片描述
    (2)配置DMA,这部分直接添加就好,都是默认的也不需要改什么。
    在这里插入图片描述

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

    在这里插入图片描述

    (3)时钟配置

    也就是外部时钟配置,之前F4用的是168M,现在换F1了,是72M,配置如下。
    在这里插入图片描述

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

    建议先保存,然后生成代码,否则直接生成代码,可能导致软件崩掉。
    在这里插入图片描述

    第二步:加入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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    (3)代码测试

    随便输出些什么,进行打印测试,在网上找个串口上位机工具,然后连接后串口转USB工具,对应引脚,就可以进行测了。
    第四步代码放在主函数,这里没有截图上位机串口数据,打印可以放置的位置指示下。
    在这里插入图片描述

    第三步:加入接收代码

    (1)加入初始化配置

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

    (2)加入回调函数部分

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

    (3)加入到中断内

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

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

    (1)加入接收部分代码

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

    (2)加入处理部分代码

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

    (3)测试代码

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

    代码连接

    代码连接:https://download.csdn.net/download/qq_22146161/86394451

    注意细节

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

    实际测试中发现,总会多个0x0D数字,不知道哪里来的,多次检查后,发现其实之前有发送,因为进入空闲中断后,停止了造成这种奇特现象。
    在这里插入图片描述
    原因点如下:发现有奇怪数据时候,一定看看有没其它地方输出。
    在这里插入图片描述

    (2)复制函数的使用。

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

    (3)逻辑调试与测试。

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

    在这里插入图片描述

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

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

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

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

    总结

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

  • 相关阅读:
    【TypeScript】深入学习TypeScript类型操作
    【Python】进阶学习:一文了解NotImplementedError的作用
    Python deepFM推荐系统,推荐算法,deepFM源码实战,deepFM代码模板
    typescript新规范及vue3常用的属性解析【2024】
    【JAVA后端开发】Part1--瑞吉外卖项目
    从无到有的基于QT软件的DIY桌面番茄钟(上)
    正火热的人机协作,优势揭晓!
    VBA技术资料MF68:更改所选区域边框颜色
    分析 20 个 veToken 生态系统协议 这种代币模型为何受欢迎?
    快慢指针技巧
  • 原文地址:https://blog.csdn.net/qq_22146161/article/details/126251580
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号