arduino - NUCLEO-H723ZG - test

文章目录

    • 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 0x3ESerial.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 0x3ESerial.begin(115200, SERIAL_8N1);  // advance usageSerial.println("v1.0.0.10 begin...\r\n");// Start each software serial portUartDebug1.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 speedwhile (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 bitsetSpeed(_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.hqwc.cn/news/161664.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Canvas 梦幻树生长动画

canvas可以制作出非常炫酷的动画&#xff0c;以下是一个梦幻树的示例。 效果图 源代码 <!DOCTYPE> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>梦幻数生长动画</title&…

【51单片机】蜂鸣器(学习笔记)

一、蜂鸣器 1、蜂鸣器介绍 鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定无源蜂鸣器&#xff1a;内部不带振荡源&…

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…

【MySQL】用户管理权限控制

文章目录 前言一. 用户管理1. 创建用户2. 删除用户3. 修改用户密码 二. 权限控制1. 用户授权2. 查看权限3. 回收权限 结束语 前言 MySQL的数据其实也以文件形式保存&#xff0c;而登录信息同样保存在文件中 MySQL的数据在Linux下默认路径是/var/lib/mysql 登录MySQL同样也可以…

HDFS 读写架构

一、组成架构 1、NameNode(NN) : 集群的Master&#xff0c;它是一个主管&#xff0c;管理者 (1) 管理HDFS的命名空间 (2) 配置副本策略 (3) 管理数据块(Block)映射信息 (4) 处理客户端读写请求 2、DataNode(DN) : 集群的Slave。NN下达命令&#xff0c;DataNode执行实际操作。…

vue基于ElementUI/Plus自定义的一些组件

vue3-my-ElementPlus 源码请到GitHub下载使用MyTable、MySelect、MyPagination 置顶|Top | 使用案例&#xff1a; 1.0 定义表格数据&#xff08;测试使用&#xff09; data() {return {tableData: [],value:[],valueList: [],}; },// 构造表格测试数据// 1 第一行&#xf…

如何去除视频水印?三种简便有效的方法解决视频水印问题

在当今社交媒体时代&#xff0c;视频分享已成为一种流行趋势。然而&#xff0c;很多人在分享自己的作品时却苦于视频上存在的水印&#xff0c;水印通常是出于版权保护或品牌推广的目的而添加到视频中的&#xff0c;但有时它们可能会对用户体验造成负面影响。 如果您正在寻找如何…

基础课18——智能客服系统架构

1.基础设施层 基础设施主要包括以下几点&#xff1a; 1. 硬件设施&#xff1a;包括服务器、存储设备、网络设备等&#xff0c;这是整个系统运行的物理基础。 2. 软件设施&#xff1a;包括操作系统、数据库管理系统、自然语言处理(NLP)工具和机器学习算法等&#xff0c;这些是…

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否是完全二叉树的算法

完全二叉树&#xff1a;就是每层横着划过去是连起来的&#xff0c;中间不会断开 比如下面的左图就是完全二叉树 再比如下面的右图就是非完全二叉树 那我们可以采用层序遍历的方法&#xff0c;借助一个辅助队列 当辅助队列不空的时候&#xff0c;出队头元素&#xff0c;入队头…

【C语言基础】第01章_C语言入门

讲师&#xff1a;康师傅 视频&#xff1a;https://www.bilibili.com/video/BV1Bh4y1q7Nt?p1&vd_source3eaa9d17f2454e1ae80abc50d16e66b5 文章目录 本章专题脉络1初识计算机语言1.1 计算机语言是什么1.2 计算机语言简史 2初识C语言2.1 C语言的由来2.2 为什么要学习C语言2.…

Go Gin中间件

Gin是一个用Go语言编写的Web框架&#xff0c;它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念&#xff0c;它可以用来处理HTTP请求和响应&#xff0c;或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息&am…

抖音极速版app拉新一手申请渠道 附快手极速版app拉新申请资料

抖音极速版app拉新一手申请渠道 附快手极速版app拉新申请资料 通过“聚量推客”申请&#xff0c;价格更高 抖音极速版app拉新是地推百搭项目&#xff0c;部分团队作为主打项目推广&#xff0c;流程简单只需要新设备即可&#xff0c;如果你能做次留或者7日留存价格还是很可观的…