arduino - NUCLEO-H723ZG - test

news2025/1/18 18:58:10

文章目录

    • arduino - NUCLEO-H723ZG - test
    • 概述
    • 笔记
    • 物理串口
    • 软串口
    • 备注
    • END

arduino - NUCLEO-H723ZG - test

概述

准备向NUCLEO-H723ZG上移植西门子飞达控制的Arduino程序.
先确认一下知识点和效果.

笔记

物理串口

NUCLEO-H723ZG在STM32 Arduino 库中, 只提供了一个串口 Serail.
先看看这个串口在板子上哪个位置?
官方板子的左右, 各有一个USB接口.

物理连接
在这里插入图片描述
左边USB端口是Arduino用的SWD端口, 用来上传程序和单步调试. 插入电脑后, 电脑上会出现一个虚拟串口.
右边USB端口插入后, 电脑上没有虚拟串口出现.

测试程序

void setup() {
  // put your setup code here, to run once:

  // Serial.begin(9600); // basic usage

  // HardwareSerial.h
//   #ifdef UART_WORDLENGTH_7B
//   #define SERIAL_7N1 0x04
//   #define SERIAL_7N2 0x0C
//   #define SERIAL_6E1 0x22
//   #define SERIAL_6E2 0x2A
//   #define SERIAL_6O1 0x32
//   #define SERIAL_6O2 0x3A
// #endif
// #define SERIAL_8N1 0x06
// #define SERIAL_8N2 0x0E
// #define SERIAL_7E1 0x24
// #define SERIAL_8E1 0x26
// #define SERIAL_7E2 0x2C
// #define SERIAL_8E2 0x2E
// #define SERIAL_7O1 0x34
// #define SERIAL_8O1 0x36
// #define SERIAL_7O2 0x3C
// #define SERIAL_8O2 0x3E

  Serial.begin(9600, SERIAL_8N1); // advance usage


}

void loop() {
  // put your main code here, to run repeatedly:
  do {
    Serial.println("hello");
    delay(1000);
  } while (true);
}

上传程序后, 用串口助手打开电脑上的虚拟串口(由开发板左边USB插入虚拟出的串口). 可以看到开发板程序通过串口Serial发来的信息.
在这里插入图片描述
通过实验可知, Arduino程序可用的串口只能是和左边USB-SWD端口重合的虚拟串口. 右边的USB端口在Arduino程序中没有作用.
在这里插入图片描述
虽然只有一个USB端口来调试和通讯, 但是开发板虚拟出来的串口和单步用的SWD端口并不冲突, 可以同时进行.

软串口

对于飞达控制板, 因为都是用串口来操作, 没有那么多物理串口, 只能是用软串口.
对软串口的使用细节做了测试.
硬件连接如下:
在这里插入图片描述
在这里插入图片描述
这2个软串口是直接从NUCLEO-H723ZG的GPIO引出来的, 只要对这2个软串口的使用清楚了就行了.
其他软串口经过了30V到飞达, 不好写测试程序. 用法和这2个软串口相同.

测试程序如下:


#include <SoftwareSerial.h>

// SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic = false);

// UART_DEBUG1_TX D16_CN7_1, UART_DEBUG1_RX D15_CN7_2
SoftwareSerial UartDebug1(15, 16);

// UART_DEBUG2_TX D17_CN7_3, UART_DEBUG2_RX D14_CN7_4
SoftwareSerial UartDebug2(14, 17);

void setup() {
  // put your setup code here, to run once:

  // Serial.begin(9600); // basic usage

  // HardwareSerial.h
  //   #ifdef UART_WORDLENGTH_7B
  //   #define SERIAL_7N1 0x04
  //   #define SERIAL_7N2 0x0C
  //   #define SERIAL_6E1 0x22
  //   #define SERIAL_6E2 0x2A
  //   #define SERIAL_6O1 0x32
  //   #define SERIAL_6O2 0x3A
  // #endif
  // #define SERIAL_8N1 0x06
  // #define SERIAL_8N2 0x0E
  // #define SERIAL_7E1 0x24
  // #define SERIAL_8E1 0x26
  // #define SERIAL_7E2 0x2C
  // #define SERIAL_8E2 0x2E
  // #define SERIAL_7O1 0x34
  // #define SERIAL_8O1 0x36
  // #define SERIAL_7O2 0x3C
  // #define SERIAL_8O2 0x3E

  Serial.begin(115200, SERIAL_8N1);  // advance usage
  Serial.println("v1.0.0.10 begin...\r\n");

  // Start each software serial port
  UartDebug1.begin(115200);  // 软串口只能简单的设置波特率, 其他通讯参数是默认的(N81)
  UartDebug1.listen();

  UartDebug1.write('U');
  UartDebug1.write('a');
  UartDebug1.write('r');
  UartDebug1.write('t');
  UartDebug1.write('1');
  UartDebug1.write('\r');
  UartDebug1.write('\n');

  UartDebug2.begin(115200);
  UartDebug2.listen();

  UartDebug2.write('U');
  UartDebug2.write('a');
  UartDebug2.write('r');
  UartDebug2.write('t');
  UartDebug2.write('2');
  UartDebug2.write('\r');
  UartDebug2.write('\n');
}

void loop() {
  // put your main code here, to run repeatedly:
  char inByte = '\0';
  int i = 0;
  char szBuf[256];

  do {
    memset(szBuf, 0, sizeof(szBuf));
    // sprintf(szBuf, "loop cnt : %d", ++i);
    // Serial.println(szBuf);


    // while (UartDebug1.available() > 0) {
    //   inByte = UartDebug1.read();
    //   UartDebug1.write(inByte);
    // }

    // 如果前面有UartDebug1的接收, UartDebug2的接收就不好使, 收不到东西
    // while (UartDebug2.available() > 0) {
    //   inByte = UartDebug2.read();
    //   UartDebug1.write(inByte);
    // }

    // UartDebug1.write('1');
    // UartDebug2.write('2');

    // 确实, 如果前面有其他软串口在接收东西, 后面的软串口就收不到发来的东西
    // 但是发送不受影响
    // 这种情况也就正好适合飞达控制原理图这种(多个飞达都是分别发送, 但是多个飞达的接收都是汇到了一根接收线的情况)
    // 如果将软串口作为调试串口, 也只适合上报信息, 用于接受信息进行处理就不合适了.
    // while (UartDebug1.available() > 0) {
    //   inByte = UartDebug1.read();
    //   UartDebug2.write(inByte);
    // }

    // Serial.println("sleep 1000\r\n");

    // 这种软串口只适合做纯发送或者纯接收.
    // 感觉多个软串口用的都是一个定时器做的
    UartDebug1.listen();
    while (UartDebug1.available() > 0) {
      inByte = UartDebug1.read();
      sprintf(szBuf, "UartDebug1 send me : %c", inByte);
      Serial.println(szBuf);
    }

    UartDebug2.listen();
    while (UartDebug2.available() > 0) {
      inByte = UartDebug2.read();
      sprintf(szBuf, "UartDebug2 send me : %c", inByte);  // 只有给串口2发送东西, 才能收到
      Serial.println(szBuf);
    }

    // 从软串口实现看, 监听接收的软串口只能是当前激活的一个, 所以无法做到用多个软串口来接收. 软串口性能有限啊
    /*
          bool SoftwareSerial::listen()
      {
        if (active_listener != this) {
          // wait for any transmit to complete as we may change speed
          while (active_out);
          if (active_listener != nullptr) {
            active_listener->stopListening();
          }
          rx_tick_cnt = 1; // 1 : next interrupt will decrease rx_tick_cnt to 0 which means RX pin level will be considered.
          rx_bit_cnt = -1; // rx_bit_cnt = -1 :  waiting for start bit
          setSpeed(_speed);
          active_listener = this;
          if (!_half_duplex) {
            active_in = this;
          } else if (!active_out) {
            setRXTX(true);
          }
          return true;
        }
        return false;
      }
    */

    // delay(1000);
    delay(1);
  } while (true);
}

通过测试, 发现软串口只能用于发送, 或者只能用于接收. 否则收不到软串口发来的内容.
原因: 软串口的实现使用定时器做的, 做接收的只能是一个软串口.

根据软串口的实现原理, 使用软串口的原理图, 也就像官方飞达控制板那样最理想.
每个飞达用一个GPIO模拟串口发送, 所有飞达的接收端都汇总到一个GPIO上, 用模拟串口接收来取回飞达的回答.
因为所有飞达的接收都接在一起了, 所以无法知道收到的内容是哪个飞达回答的.
所以要保证飞达硬件是好的, 不会没有问他, 自己主动上报.

备注

经过这个实验, 对NUCLEO-H723ZG上移植飞达控制板的官方工程, 没啥疑问了, 可以开始动手搞了.
这个飞达控制板的控制主要用到物理串口收发, 软串口收发, 没其他了. 剩下的都是逻辑操作.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速了解推荐引擎检索技术

目录 一、推荐引擎和其检索技术 二、推荐引擎的整体架构和工作过程 &#xff08;一&#xff09;用户画像 &#xff08;二&#xff09;文章画像 &#xff08;三&#xff09;推荐算法召回 三、基于内容的召回 &#xff08;一&#xff09;召回算法 &#xff08;二&#xf…

uni-app---- 点击按钮拨打电话功能点击按钮调用高德地图进行导航的功能【安卓app端】

uniapp---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】 先上效果图&#xff1a; 1. 在封装方法的文件夹下新建一个js文件&#xff0c;然后把这些功能进行封装 // 点击按钮拨打电话 export function getActionSheet(phone) {uni.showAct…

【雷达原理】雷达杂波抑制方法

目录 一、杂波及其特点 1.1 什么是杂波&#xff1f; 1.2 杂波的频谱特性 二、动目标显示(MTI)技术 2.1 对消原理 2.2 数字对消器设计 三、MATLAB仿真 3.1 对消效果验证 3.2 代码 一、杂波及其特点 1.1 什么是杂波&#xff1f; 杂波是相对目标回波而言的&#xff0c;…

【Python工具】Panoply介绍及安装步骤

Panoply介绍及安装步骤 1 Panoply介绍2 Panoply安装步骤&#xff08;Windows&#xff09;2.1 下载并安装JAVA环境2.2 下载Panoply报错&#xff1a;Error: A JNI error has occurred, please check your installation and try again. 参考 1 Panoply介绍 Panoply是一款由美国国…

【大数据】Apache NiFi 数据同步流程实践

Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手&#xff0c;跟我走&#xff01;3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…

selenium自动化测试入门 —— 设置等待时间

time.sleep(3) 固定等待3秒 driver.implicitly_wait(10) 隐性的等待&#xff0c;对应全局 WebDriverWait( driver, timeout).until(‘有返回值的__call__()方法或函数’) 显性的等待&#xff0c;对应到元素 一、time.sleep(seconds) 固定等待 import time time.sleep(3) #…

【C++那些事儿】类与对象(1)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我之前看过一套书叫做《明朝那些事儿》&#xff0c;把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言&#xff0c;无疑是抽象且难度颇…

10.16nginx负载均衡

nginx正向代理 反向代理 负载均衡 nginx当中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;基于tcp或udp的流量转发&#xff09; *七层代理&#xff1a;代理的是http的请求和响应 客户端请求代理服务器&#xff0c;由代理服务…

curl(五)与shell结合的细节

一 curl与shell结合的细节 ① 问题引入 需求&#xff1a; 传递变量以json数据给curl ② 方式1 反斜杠\转义 1、转义内层双引号 --> 了解即可 特点&#xff1a; 可读性低,并且很复杂 2、转义外层单引号 --> 推荐另一种方式&#xff1a; 只转义外层单引号 实质&am…

【马蹄集】—— 百度之星 2023

百度之星 2023 目录 BD202301 公园⭐BD202302 蛋糕划分⭐⭐⭐BD202303 第五维度⭐⭐ BD202301 公园⭐ 难度&#xff1a;钻石    时间限制&#xff1a;1秒    占用内存&#xff1a;64M 题目描述 今天是六一节&#xff0c;小度去公园玩&#xff0c;公园一共 N N N 个景点&am…

使用Gorm进行高级查询

深入探讨GORM的高级查询功能&#xff0c;轻松实现Go中的数据检索 高效的数据检索是每个应用程序性能的核心。GORM&#xff0c;强大的Go对象关系映射库&#xff0c;不仅扩展到基本的CRUD操作&#xff0c;还提供了高级的查询功能。本文是您掌握使用GORM进行高级查询的综合指南。…

计算虚拟化3——I/O设备虚拟化

目录 I/O基本概念 I/O设备与CPU连接图 CPU与I/O设备的交互 访问I/O设备&#xff08;IO Access&#xff09; 数据传输&#xff08;Data Tronhsfer&#xff09; I/O设备虚拟化技术 软件辅助全虚拟化 半虚拟化 Virtio协议基本概念 Virtqueue讲解 硬件辅助全虚拟化 I/O…

美国航空公司飞行员工会遭受勒索软件攻击

导语&#xff1a;近日&#xff0c;美国航空公司的飞行员工会遭受了一次勒索软件攻击。这次攻击对于全球最大的独立飞行员工会——美国航空公司飞行员协会&#xff08;APA&#xff09;造成了一定影响。让我们一起来了解详情。 背景介绍 美国航空公司飞行员协会成立于1963年&…

Bytedance揭秘OpenAI大模型: GPT-3到GPT-4进化路径

文章目录 探秘GPT-3到GPT-4进化之路1、SFT&#xff1a;早期GPT进化的推动者2、RLHF和SFT&#xff1a;编码能力提升的功臣3、代码加入预训练&#xff0c;对推理帮助最大4、“跷跷板”现象 论文地址项目链接Reference GPT-Fathom: Benchmarking Large Language Models to Deciphe…

Python入门:6个好用的Python代码,快来收藏!

文章目录 1.类有两个方法&#xff0c;一个是 new,一个是 init,有什么区别&#xff0c;哪个会先执行呢&#xff1f;2.map 函数返回的对象3.正则表达式中 compile 是否多此一举&#xff1f;4.[[1,2],[3,4],[5,6]]一行代码展开该列表&#xff0c;得出[1,2,3,4,5,6]5.一行代码将字符…

物理内存的关系及分配模式

在分配缓存块的时候&#xff0c;要分两种路径&#xff0c;fast path 和 slow path&#xff0c;也就是快速通道和普通通道。其中 kmem_cache_cpu 就是快速通道&#xff0c;kmem_cache_node 是普通通道。每次分配的时候&#xff0c;要先从 kmem_cache_cpu 进行分配。如果 kmem_ca…

shell脚本代码混淆

文章目录 起因安装 Bashfuscator安装BashfuscatorBashfuscator的使用 起因 很多时候我并不希望自己的shell脚本被别人看到&#xff0c;于是我在想有没有什么玩意可以把代码加密而又正常执行&#xff0c;于是我想到了代码混淆&#xff0c;简单来看一下&#xff1a; 现在我的目…

WSL 下载

可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符&#xff0c;方法是右键单击并选择“以管理员身份运行”&#xff0c;输入 wsl --install 命令&#xff0c;然后重启计算机。 首先查看可以下载的版本 最后再运行wsl --ins…

新手入门Python一定要看的八个超实用建议!

文章目录 前言一、项目文件事先做好归档二、永远不要手动修改源数据并且做好备份三、做好路径的正确配置四、代码必要的地方做好备注与说明五、加速你的Python循环代码六、可视化你的循环代码进度七、使用高效的异常捕获工具八、要多考虑代码健壮性关于Python技术储备一、Pytho…

代理模式(静态代理、JDK代理、CGLIB代理)

简介 代理模式有三种不同的形式&#xff1a;静态代理、动态代理&#xff08;JDK代理、接口代理&#xff09;、CGLIB代理 目标&#xff1a;在不修改目标对象的前提下&#xff0c;对目标对象进行扩展。 静态代理 需要定义接口或父类对象&#xff0c;被代理对象和代理对象通过实…