• 问题汇总20231110


    前言

    本篇文章为个人日常生活的问题总结,不做权威使用,帮助小白解决问题,部分参考内容会附上原文链接,如有疑问联系本人删除。

    问题汇总

    1.OTG

    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技术的应用范围,使移动设备能够更灵活地进行直接通信和互联,提升了移动设备的功能和互操作性。

    2.旁路时钟源与晶振的区别

    首先,8和32系列的MCU复位后默认的时钟源都是内部HIS,需要使用HSE的话,要用代码配置控制相关寄存器。
    外部时钟源HSE一般分为外部(旁路)时钟源和晶体陶瓷谐振器,个人理解为,旁路时钟源是一个完整的时钟源电路,能够绕开芯片内部的时钟设置,直接使用该电路提供时钟源而晶体振荡器是一个元件,它可以提供时钟源,一般和MCU内部时钟驱动电路共同使用,有一定的启动时间,精度比较高,且一般为了减少时钟输出的失真和缩短启动时长,晶振的负载电容需要尽可能靠近振荡器引脚,负载电容根据所选取的晶振调整。

    3.Cubemx不能设置时钟源的原因

    在sys配置的时候只选择了lse,没有选择hse

    4.Cubemx库文件路径不能修改

    将文件在软件外手动移动路径,再重新打开工程

    5.KEIL编译没问题但是有红叉的原因

    原因:keil的同步查错功能开启,逻辑错误,或者变量和函数未调用,使用位置错误等,编译器不行,芯片不行,比较老之类的,汇编语言识别不出来,keil打开工程反应不过来,中文路径等问题,在编写程序和代码下载时,我们只需要关注总的编译没有错误能够生成hex文件即可。
    解决方法:
    关闭动态语法检查,点击软件edit----点击text completion----在Dynamic syntax checking中取消enable
    工程文件切换英文路径
    头文件路径归置好
    修改代码后重新打开

    6.比较结构体的方式

    有三种方式
    第一种,逐个比较成员变量

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第二种,使用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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第三种,逐字节比较,把结构体的内存看成字节序列

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    12.ROS编程学习:ROS常用指令
    【饭谈】软素质怎么提高?(适合软件测试人的专用办法)
    【可变形注意力(1)】Multi-scale Deformable Attention Transformers 多尺度变形注意力
    云原生主题学习月|共同学习全球领先的亚马逊云科技云原生课程,组团共学拿奖励~
    机器学习8:在病马数据集上进行算法比较(ROC曲线与AUC)
    亲测IDEA 将原多模块项目彻底改成自己要的项目名、模块名
    记录一些使用的工具
    蚂蚁核心架构师内部Java并发编程进阶笔记,白嫖简直太香了!
    代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II
    基于微信小程序的高校宿舍信息管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/whhcsdn233/article/details/134456346