【总结(二)】单片机重点知识总结记录(Keil相对路径+条件编译+CMSIS)

目录

一.关于keil配置项和程序源文件引用的相对路径问题

二.C语言中多条件编译的灵活使用

三.个人对于CMSIS的理解


一.关于keil配置项和程序源文件引用的相对路径问题

在学习MSP系列单片机的时候,碰上最多的问题就是路径的问题。于是找了一些资料,现在写下来备忘。

其实keil用户图形配置项中的相对路径和程序中头文件引用的相对路径是不同的,由于基准文件不一样,所以这两个的相对路径理解起来就完全不一样。

对于keil的图形配置项来说,里面的相对路径都是基于keil的工程文件,也就是后缀为.uvprojx的工程文件来说的。

如图,这里的"../"是.uvprojx的上一级目录里找。

对于程序的头文件引用来说,这个基准则变成了当前程序源文件。

对于这个头文件,则是对当前.c文件同一目录下的ti/文件夹下的文件的引用。


2024.5.26

二.C语言中多条件编译的灵活使用

在调试23年电赛E题时为了灵活的变动代码,于是使用了以下条件编译,发现条件编译对于调试来说是极其灵活多变而且很方便的,故写下此文章一备忘。

最开始的是普通的条件编译,如下:

这里通过定义不同宏来编译不同代码,使得整个系统调试起来更加地灵活。

但是由于我下面写了三种方法去调试,每个方法代码有将近一两百行,每次都要注释其他两个再去调试另一个太麻烦了,于是我选择了多条件编译,如下:

大概写法类似于:

cpp 复制代码
#ifdef MACRO_A
    // 编译针对 MACRO_A 的代码
    printf("MACRO_A is defined.\n");
#elif defined(MACRO_B)
    // 编译针对 MACRO_B 的代码
    printf("MACRO_B is defined.\n");
#else
    // 如果两者都没有定义,就不编译任何代码
    // 或者可以在这里编译默认情况下的代码
#endif

下面同时保留其条件编译的写法,供以后使用:

cpp 复制代码
#if 常量表达式1
// ... some codes
#elif 常量表达式2
// ... other codes
#elif 常量表达式3
// ...
...
#else
// ... statement
#endif
cpp 复制代码
#if constant a
    ...code1...
#else
        #if constant b
          ...code 2...
        #else
          ...code 3...
      #endif
#endif

由于需要使用逻辑条件编译,于是学习了一下:

实现如果A和B均未被定义,则执行C:

cpp 复制代码
#if !defined(A) && defined(B)
//C代码
#endif
cpp 复制代码
#ifndef A
#ifndef B
    //C代码
#endif
#endif

三.个人对于CMSIS的理解

我们在进行开发ARM的Cortex-M系芯片开发时经常看见CMSIS这一个名词,但是这个到底是什么呢?

CMSIS(Cortex Microcontroller Software Interface Standard),顾名思义,是Cortex-M系处理器的标准软件接口。它是由ARM提供的一组硬件抽象层接口API,以便软件开发者能够更容易地编写可移植的、高效的和可重用的代码。

CMSIS的主要结构:

  1. 设备访问层(CMSIS-DAP) :提供了一套标准的API来访问微控制器的内部外设,如GPIO、中断控制器、定时器等。

    1. ++​​DAP.hDAP.c:用于调试访问端口的文件。++
  2. 内核访问层(CMSIS-CORE):定义了访问Cortex-M处理器内核的接口,包括寄存器映射、中断处理和内核服务的API。

    1. core_cm*.h:这是针对特定Cortex-M系列处理器的核心头文件,例如core_cm3.h是针对Cortex-M3处理器的。

    2. core_sc*.h:针对Cortex-M0和Cortex-M0+处理器的核心头文,cmsis_version.h:包含CMSIS版本信息的头文件。

    3. irq_ctrl.h:中断控制相关的头文件。

    4. mpu_armv*.h:内存保护单元(MPU)相关的头文件,针对不同的ARM版本。

  3. 中间件访问层(CMSIS-Middleware):为中间件组件(如实时操作系统、网络协议栈、电机控制算法等)提供标准化的接口。

    1. ++这些文件包含了中间件组件,如RTOS、网络协议栈、图形库等的接口定义。++
  4. CMSIS-Driver

    1. 提供硬件抽象层,用于与微控制器的外设进行通信。
    2. 包括各种外设的驱动模型和接口定义,例如SPI、I2C、USB等。
  5. CMSIS-RTOS

    1. 为实时操作系统提供标准的API。
    2. 使得不同的RTOS可以在CMSIS层上进行抽象,从而实现软件的可移植性。

架构如下:

相关推荐
greatriver00725 分钟前
e2studio R7FA6M5 卡死 rtc 需要如何配置时钟
单片机·瑞萨单片机
恒锐丰小瑞1 小时前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
深念Y2 小时前
JMS583 USB-NVMe 桥接芯片 LED 控制探索
嵌入式硬件·嵌入式·led·usb·电子·维修·硬盘盒
嵌入式阿蔡2 小时前
传感器_02:MPU6050 六轴 IMU 姿态入门——从一串看不懂的数,到一个不漂的角度
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
恒锐丰科技韩生3 小时前
SS6951A|8.2‑36V 双通道 4A H 桥电机驱动 ETSSOP28 带散热焊盘 工业缝纫机打印机机器人专用
嵌入式硬件·硬件工程
恒锐丰小瑞3 小时前
率能SS6811H 38V/1.6A/双通道H桥驱动芯片,PWM控制接口与低功耗睡眠模式,用于舞台灯光/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
怀民民民3 小时前
开篇:基于 Cortex-M7、OpenMV 与双频 GNSS 的智能派件 AGV 设计与实现
单片机·嵌入式硬件·gnss·openmv·智能车
爱吃米粥3 小时前
过流、过压、防反接、防浪涌于一体的输入电路
单片机·嵌入式硬件
江屿风4 小时前
【STM32基础篇】【嵌入式生态问题及历史追溯】流食般投喂
大数据·开发语言·人工智能·笔记·stm32·嵌入式硬件
橘色的喵4 小时前
USB MCU的固件烧写工具:从 vendor 命令到逐字节校验
单片机·嵌入式硬件·嵌入式