我假设您将在 Linux 等平台上使用交叉工具链,并且交叉工具链与在目标 CPU 上加载目标代码的某些方法兼容。我还假设您已经拥有一个工作良好的 STM32 开发板,该开发板的文档足够好,可以弄清楚传感器如何连接到开发板或 CPU。
首先,您应该定义您的库应该提供什么。这部分通常非常困难。在不了解硬件传感器能够提供什么的情况下,很难知道它可以提供什么。预计会有一些需求迭代。
您需要访问传感器文档,通常以制造商数据表的形式。使用数据表并了解设备如何连接到目标 CPU/板,您将需要访问构成传感器接口的 STM32 外设。回到数据表,这次是 STM32,看看如何访问它的外设接口。这可能是简单的 GPIO 位和字节,也可能是如何使用 SPI 或 I2C 等内置外设。
传感器的数据表将详细说明一组寄存器,描述每个寄存器的含义,包括某些寄存器中每个位或一组位的含义。您将使用 C 语言编写访问 STM32 外设的代码,这些外设将通过作为 STM32 电路板一部分的电气接口访问传感器。
工作流程通常从写一个或三个寄存器开始,看看是否有一些可识别的效果。例如,如果您正在使用数字 IO 端口,您可以连接一个 LED 以查看是否可以打开或关闭它,或者连接一个开关以查看您是否可以正确读取其状态。这确定您的代码可以使用寄存器级访问来戳或窥视 IO。作为交叉工具链的一部分,可能有现有的辅助函数来完成这项工作。或者您可能必须开发自己的,使用指针间接访问内存映射 IO。或者可能需要一些只能从内联汇编代码访问的特殊指令。这个答案很笼统,因为我不知道 STM32 处理器或其典型生态系统的细节。
然后您继续进行可能涉及操作序列的更复杂的操作,例如循环一两次以实现与设备的某些通信。或者它可能就像找到正确的寄存器序列以访问以操作 SPI 接口一样简单。通常,您会发现一小段代码已经足够完整,可以被您的驱动程序重用;比如如何读取或写入单个字节。然后,您可以将其作为可重用函数来简化其余工作,例如按顺序访问某些寄存器并打印您读取的寄存器内容以查看它们是否有意义。最终,您将获得两条重要信息:了解创建正式驱动程序所需的低级寄存器访问,以及了解硬件构成的组件和功能(即,您知道设备如何工作)。
现在,扔掉你所做的大部分工作,并制定一个正式的规范。使用您现在所知道的内容来包含所有有用的内容。使用您现在所知道的开发规范,其中包含您的应用程序代码可以使用的适当接口 API。重写驱动程序,掌握部件如何工作的知识,并利用重新重写规范为您提供的空白画布。仅重用您完全确信的代码是最佳的并且适合规范规定的格式。为所有模块编写测试代码,并使用测试代码实际测试代码是否工作以及它是否符合规范。每次修改它测试的任何内容时都重复使用测试代码。