今天我将要向大家介绍如何快速通过STM32单片机实现ST传感器的驱动测试。本次我们使用的传感器是LSM6DSOX,因为SensorTile.box开发板集成了这颗传感器,所以我将用SensorTile.box来演示,如何通过开发板上的STM32L4R9单片机驱动LSM6DSOX,实现加速度的陀螺仪的数据读取。
因为ST传感器提供了非常强大的传感器驱动和演示工程,在STM32单片机里甚至不用写一行代码就可以完成传感器测试。
本帖适合对传感器或者STM32单片机不是特别熟悉的新手,对于有一定的开发经验的网友,本帖所授技术一搬经过自己简单摸索就能完成,看到这里下边内容应该就不需要再看了。
以下内容同样适用于ST的其它传感器和STM32其它单片机,不同之处在于连接传感器的端口要根据传感器的实际连接情况来配置。
首先在ST官网找到LSM6DSOX的产品页面,然后点开Tool&Software选项卡,找到C-Driver-MEMS软件资源,点开。找到Get from Github跳转到Github网站,再选Code->Download ZIP,将STMems_Standard_C_drivers驱动包下载到本地。
将下载好的STMems_Standard_C_drivers解压,找到LSM6DSOX文件夹,在drivers下的2个文件就是lsm6dsox的驱动文件。再打开example文件夹,可以看到很多演示代码,本次使用lsm6dsox_read_data_polling.c文件实现传感器数据的轮询读取,再通过STM32L4R9的USB虚拟串口将数据发送到电脑。
打开STM32CubeMX,创建一个工程,选择对应的单片机型号后点Start Project,在Pinout&Configuration里找到Connectivity下的SPI1,Mode选择Full-Duplex Master,修改Prescaler数值使时钟频率符合要求,将Data Size设置为8 Bit。根据SensorTile.box原理图设置SPI对应的引脚,设置LSM6DSOX的CS引脚,设置CS引脚的标签比如CS_LSM6DSOX。
接着在Pinout&Configuration里找到Connectivity下的USB_OTG_FS,Mode选择Device_Only,其它默认。在Middleware里找到USB_DEVICE,Class For FS IP设置为Communication Device Class(Virtual Port Com)其它默认,这样USB虚拟串口就设置好了。
在Clock Configuration里把时钟改为120MHz,CLK48 Clock Mux选择HSI48,接着在Project Manager的Project里给工程起一个名字,选择对应的工程路径,选择对应的IDE,这里我选择了STM32CubeIDE,它是ST官方推出的基于eclipse开发的免费工具,非常好用。
然后在Code Generator里把Copy all used libraries into the project folder改为Copy only the necessary library files,只复制用到的库,这样生成的工程会小一些。点击右上角的GENERATE CODE按钮生成工程文件和初始化代码。
工程生成好后点Open Project,使用对应的IDE打开工程文件。在STM32CubeIDE里将lsm6dsox_read_data_polling.c和lsm6dsox_reg.c复现到Src文件夹,将lsm6dsox_reg.h复制到Inc文件夹。
打开lsm6dsox_read_data_polling.c引用main.h头文件,添加hspi1的引用,将dev_ctx.handle设置成hspi1,去掉platform_write和platform_read函数里和SPI无关的代码,将CS操作改为CS_LSM6DSOX对应的端口和引脚,去掉tx_com函数里除CDC_Transmit_FS以外的代码。
在main.c文件里引用并在main函数里执行lsm6dsox_read_data_polling函数。工程设置里勾选use float with printf from newlib-nano(-u _printf_float)解除编译器警告,然后编译工程。
连接调试器和开发板,下载固件到STM32单片机,打开串口软件连接后便能看到对应的传感器数据。
下期我会通过视频做一个完整的演示。
熟悉STM32CubeMX工具的网友应该会发现STM32CubeMX里集成的X-CUBE-MEMS1扩展包已经集成了几乎所有的ST传感器驱动,使用STM32CubeMX添加对应的传感器驱动也比较方便,选择哪种方式就看个人习惯了。