写入设备库C/C++;对于STM32或ARM

写入设备库C/C++;对于STM32或ARM,arm,driver,device,stm32,Arm,Driver,Device,Stm32,我需要开发设备库,如uBlox、IMU、BLE、ecc。。从头开始(几乎)。有什么文件或教程可以帮助我吗? 问题是,在给定数据表和类似STM32或其他ARMs的平台的情况下,如何使用C/C++(如果需要,可以使用Arduino样式)编写设备库 非常感谢 我曾尝试从Arduino库和各种Github中读取设备库,但我希望有一个指南/模板可以遵循(一般规则),以便从给定的数据表中编写适当的设备库 我不是在问一个完整的权威指南,只是从哪里开始,文档,方法 我在下面找到了这个,但它非常基本,对于我的目标

我需要开发设备库,如uBlox、IMU、BLE、ecc。。从头开始(几乎)。有什么文件或教程可以帮助我吗? 问题是,在给定数据表和类似STM32或其他ARMs的平台的情况下,如何使用C/C++(如果需要,可以使用Arduino样式)编写设备库

非常感谢

我曾尝试从Arduino库和各种Github中读取设备库,但我希望有一个指南/模板可以遵循(一般规则),以便从给定的数据表中编写适当的设备库

我不是在问一个完整的权威指南,只是从哪里开始,文档,方法

我在下面找到了这个,但它非常基本,对于我的目标来说非常精简


我假设您将在Linux等平台上使用跨工具链,并且跨工具链与在目标CPU上加载目标代码的方法兼容。我还假设您已经有了一个可以正常工作的STM32板,它的文档记录得足够好,可以确定传感器将如何连接到该板或CPU

首先,您应该定义您的库应该提供什么。这一部分通常非常困难。如果不知道硬件传感器能够提供什么,就很难知道它能提供什么。预期会对需求进行一些迭代

您需要访问传感器的文档,通常以制造商数据表的形式。使用数据表,并了解设备如何连接到目标CPU/板,您将需要访问构成传感器接口的STM32外围设备。回到数据表,这次是STM32,看看如何访问其外围接口。这可能是简单的GPIO位和字节,也可能是如何使用内置外围设备,如SPI或I2C

传感器数据表将详细说明一组寄存器,描述每个寄存器的含义,包括特定寄存器中每一位或一组位的含义。您将用C编写访问STM32外围设备的代码,这些外围设备将通过作为STM32板一部分的电气接口访问传感器

工作流程通常从写入一个或三个寄存器开始,以查看是否存在某种可识别的效果。例如,如果您正在练习一个数字IO端口,您可以连接一个LED以查看是否可以打开或关闭,或者连接一个开关以查看是否可以正确读取其状态。这建立了您的代码可以使用寄存器级访问戳或窥视IO。作为交叉工具链的一部分,可能有现有的辅助函数来完成这项工作。或者您可能需要开发自己的,使用指针间接寻址来访问内存映射IO。或者可能需要一些特殊的指令,这些指令只能从内联汇编代码中访问。这个答案是通用的,因为我不知道STM32处理器或其典型生态系统的细节

然后,您将继续进行更复杂的操作,这些操作可能涉及操作序列,例如循环一两次以影响与设备的通信。或者,它可能很简单,只需找到合适的寄存器序列即可访问SPI接口的操作。通常,您会发现一小段代码足够完整,可以被驱动程序重用;比如如何读取或写入单个字节。然后,您可以将其作为一个可重用的函数来简化其余的工作,比如按顺序访问某些寄存器,并打印您读取的寄存器内容,以查看它们是否有意义。最终,您将获得两条重要信息:了解创建正式驱动程序所需的低级寄存器访问,以及了解构成硬件的组件和功能(即,您知道设备如何工作)


现在,扔掉你所做的大部分工作,制定一个正式的规范。使用你现在知道的,包括所有有用的东西。使用您现在知道的内容来开发一个规范,该规范包括您的应用程序代码可以使用的适当接口API。重写驱动程序,带着如何工作的知识,并利用空白画布为您提供了新的改写的规格。只有重用代码,你完全自信是最佳的,适合的格式指定的规格写测试代码为所有的模块,并使用测试代码来实际测试代码是否有效以及是否符合规范。每次修改它测试的任何内容时,都要重新使用测试代码。

我认为您无法以Arduino风格为STM32编写库。您可以在野外找到的大多数Arduino库都促进了易用性,而不是性能。例如,如果固件必须做的唯一事情是读取传感器并通过串行端口报告结果,那么为特定传感器设计的简单库工作良好。当你在更复杂的项目中工作,uC有很多事情要做,并且满足一些实时限制时,一般的Arduino方法无法解决你的问题

STM32库开发的问题是外围设备、DMA和中断之间的复杂连接。我没有使用多维数据集框架,而是在寄存器级别对它们进行编码,我经常会在参考手册中查找显示DMA通道之间连接的表或计时器主从关系之类的内容。一些外围设备(大部分是计时器)的工作原理相似,但每一个都有微小的差异。这使得开发适合所有场景的硬件库几乎不可能

在STM32项目中,您需要完成的任务也更加复杂。例如,在我的一个项目中,我用定时器触发的伪/假DMA传输愚弄SPI,以便它可以从时钟引脚(数据引脚未使用)生成周期性的8脉冲序列。没有一个库可以为您提供这种灵活性