本篇文章为个人日常生活的问题总结,不做权威使用,帮助小白解决问题,部分参考内容会附上原文链接,如有疑问联系本人删除。
OTG是USB On-The-Go(USB即插即用)的缩写,是一种USB标准,用于在移动设备之间直接进行通信和数据交换,而无需通过计算机或主机设备。
USB On-The-Go允许移动设备(如智能手机、平板电脑、数字相机等)在两个设备之间以对等的方式进行通信,实现文件传输、音频/视频传输、打印、键盘/鼠标控制等功能。它通过在移动设备上添加OTG功能,使设备既可以作为USB主机(Host),又可以作为USB从设备(Peripheral)。
OTG设备具有一对特殊的USB插口,一端是标准的USB Type-A插口(通常用于连接计算机主机),另一端是Micro-USB或USB Type-C插口(用于连接移动设备)。当两个OTG设备通过OTG线(Micro-USB到USB Type-A线或USB Type-C到USB Type-A线)相连时,它们可以在没有其他主机的情况下直接进行通信。
OTG设备在连接时,会自动进行协商和判别,以确定哪个设备充当主机,哪个设备充当从设备。主机设备负责控制通信的发起和管理,而从设备则被动地响应主机的请求。
USB On-The-Go扩展了USB技术的应用范围,使移动设备能够更灵活地进行直接通信和互联,提升了移动设备的功能和互操作性。
首先,8和32系列的MCU复位后默认的时钟源都是内部HIS,需要使用HSE的话,要用代码配置控制相关寄存器。
外部时钟源HSE一般分为外部(旁路)时钟源和晶体陶瓷谐振器,个人理解为,旁路时钟源是一个完整的时钟源电路,能够绕开芯片内部的时钟设置,直接使用该电路提供时钟源。而晶体振荡器是一个元件,它可以提供时钟源,一般和MCU内部时钟驱动电路共同使用,有一定的启动时间,精度比较高,且一般为了减少时钟输出的失真和缩短启动时长,晶振的负载电容需要尽可能靠近振荡器引脚,负载电容根据所选取的晶振调整。
在sys配置的时候只选择了lse,没有选择hse
将文件在软件外手动移动路径,再重新打开工程
原因:keil的同步查错功能开启,逻辑错误,或者变量和函数未调用,使用位置错误等,编译器不行,芯片不行,比较老之类的,汇编语言识别不出来,keil打开工程反应不过来,中文路径等问题,在编写程序和代码下载时,我们只需要关注总的编译没有错误能够生成hex文件即可。
解决方法:
关闭动态语法检查,点击软件edit----点击text completion----在Dynamic syntax checking中取消enable
工程文件切换英文路径
头文件路径归置好
修改代码后重新打开
有三种方式
第一种,逐个比较成员变量
#include
struct MyStruct {
int a;
float b;
char c;
};
bool compareStructs(struct MyStruct s1, struct MyStruct s2) {
if (s1.a != s2.a || s1.b != s2.b || s1.c != s2.c) {
return false;
}
return true;
}
第二种,使用memcmp()函数
#include
#include
struct MyStruct {
int a;
float b;
char c;
};
bool compareStructs(struct MyStruct s1, struct MyStruct s2) {
if (memcmp(&s1, &s2, sizeof(struct MyStruct)) != 0) {
return false;
}
return true;
}
第三种,逐字节比较,把结构体的内存看成字节序列
#include
struct MyStruct {
int a;
float b;
char c;
};
bool compareStructs(struct MyStruct s1, struct MyStruct s2) {
unsigned char* p1 = (unsigned char*)&s1;
unsigned char* p2 = (unsigned char*)&s2;
size_t size = sizeof(struct MyStruct);
for (size_t i = 0; i < size; ++i) {
if (p1[i] != p2[i]) {
return false;
}
}
return true;
}