Funpack3-3 基于STM32F767的多传感器数据选择设计
硬件介绍
X-NUCLEO-IKS4A1是STMicroelectronics推出的STM32 Nucleo扩展板,专为IoT动作检测和环境监测设计。它由传感器主板IQS4A1和Qvar触摸板MKE001A组成,具有高集成性和兼容性。板载传感器包括3D加速度计、3D陀螺仪、3D磁力计、超低功耗3轴加速度计、气压计、温湿度传感器、温度传感器等,提供多维度测量,适用于紧凑空间。
本次实验通过板卡触摸按键操作,实现了传感器选择、数据发送和功能切换,并在上位机完成可视化控制。
软件介绍
STM32CUBEMX
STM32CubeMX是一个图形化的软件配置工具,由STMicroelectronics(ST公司)开发,用于STM32微控制器系列。它允许开发者通过图形用户界面配置微控制器的参数和外设,生成初始化代码,并集成到项目中。
主要特点包括:
- 图形化配置:提供直观的界面,用于选择和配置微控制器的外设和参数。
- 自动代码生成:根据配置自动生成初始化代码,简化了开发流程。
- 集成开发环境(IDE)支持:生成的代码可以直接在ST公司的STM32CubeIDE或其他IDE中使用。
- 项目管理:支持创建和管理多个项目,方便开发者组织工作。
- 硬件抽象层(HAL):使用ST公司的HAL库,提供统一的API来控制硬件。
- 跨平台:支持Windows、Linux和macOS操作系统。
STM32CubeMX大大简化了STM32微控制器的初始设置和开发过程,特别适合初学者和需要快速原型开发的专业人士。
gcc-arm-none-eabi
GCC ARM Embedded Toolchain,简称gcc-arm-none-eabi,是一个专为ARM架构的嵌入式系统设计的编译器工具链。它包括了预处理器、编译器、汇编器和链接器等工具,支持从ARMv4T到ARMv8-A等广泛的ARM架构。gcc-arm-none-eabi能够生成针对特定ARM处理器的高效代码,支持C、C++以及汇编语言,广泛用于嵌入式系统的开发。它还提供了丰富的库支持,包括新标准C库和实时操作系统(RTOS)库,以满足不同开发需求。此外,它还支持多种调试工具的接口,方便开发者进行代码调试和性能分析。
OpenOCD
OpenOCD是一个开源的、跨平台的工具,用于调试和编程各种微控制器和系统级芯片(SoCs)。它支持多种JTAG、SWD(串行线调试)和其他调试接口,允许开发者对硬件进行编程和调试。OpenOCD可以与多种编程语言编写的应用程序配合使用,如C/C++,并且兼容多种操作系统,包括Linux、Windows和macOS。
OpenOCD的主要功能包括:
- 硬件调试:提供对处理器的硬件调试支持,包括断点、单步执行、寄存器访问等。
- 编程:支持对闪存和其他可编程存储器的编程。
- 脚本:允许用户编写和执行自定义脚本,以自动化复杂的调试和编程任务。
- 多目标支持:能够同时连接多个目标设备,进行并行调试或编程。
- 集成:可以与Eclipse、Visual Studio等集成开发环境(IDE)集成,提供无缝的调试体验。
OpenOCD广泛应用于嵌入式系统的开发中,特别是当需要对硬件进行底层访问和控制时。它的开源特性也意味着用户可以根据自己的需求对其进行定制和扩展。
CMake
CMake是一个跨平台的自动化构建系统,用于生成标准的构建文件,如Unix的Makefile或Windows的Visual Studio工程文件。它使用配置文件(CMakeLists.txt),这些文件包含了构建项目所需的指令和规则。
CMake的主要特点包括:
- 跨平台:支持多种操作系统,包括Linux、Windows、macOS等。
- 语言无关:虽然最初是为C和C++设计的,但CMake也支持其他编程语言,如Fortran、Java和Python。
- 可定制:用户可以通过编写CMake脚本来定制构建过程,包括设置变量、定义目标(可执行文件、库等)、添加编译选项等。
- 依赖管理:能够处理复杂的依赖关系,包括第三方库和项目内模块。
- 生成系统:CMake本身不直接构建软件,而是生成构建系统,然后由其他工具(如make、ninja等)使用这些系统来构建软件。
- 集成开发环境(IDE)支持:可以生成多种IDE的项目文件,如Eclipse CDT、Visual Studio等。
- 命令行工具:提供了丰富的命令行选项,允许用户在命令行环境中控制构建过程。
CMake通过查找和配置项目所需的编译器、库和其他工具,简化了构建过程,并使得项目能够在不同的开发环境中无缝移植。它在开源项目和商业软件的开发中都非常流行,特别是在需要高度可配置构建系统的大型项目中。
LLVM
LLVM是一个开源的编译器基础设施项目,提供了一系列用于构建编译器的工具和库。它支持多种编程语言,包括C、C++、Objective-C、Rust等,并提供了优化器、代码生成器和运行时库。LLVM以其模块化和可扩展性而闻名,允许开发者构建定制的编译器和工具链。它还广泛应用于性能分析、代码优化和安全加固等领域。
Ninja
Ninja是一个专注于速度的小而专注的构建系统,设计用于与CMake等生成工具配合使用。它使用JSON文件来描述构建过程,而不是传统的Makefile,这使得Ninja能够快速地解析和执行构建任务。Ninja特别适合于大型项目和多核心系统,因为它可以并行构建多个目标,从而显著提高构建速度。它还支持增量构建,只重新构建自上次构建以来已经更改的部分,进一步加快了构建过程。Ninja易于集成,并且可以在多种平台上运行。
模块介绍
STM32F767
STM32F767是STMicroelectronics公司推出的一款高性能的32位微控制器,属于STM32F7系列。它基于ARM Cortex-M7内核,主频高达216MHz,并具备高达2MB的闪存和512KB的RAM。这款微控制器以其出色的处理能力、丰富的外设和高级的图形处理能力而受到市场的青睐。
主要特性包括:
- 高性能处理器:基于ARM Cortex-M7内核,提供高处理速度和低功耗。
- 大容量存储:具有高达2MB的闪存和512KB的RAM,适合存储大量数据和复杂应用程序。
- 高级图形处理:集成了高级图形加速器,适合图形密集型应用。
- 丰富的外设:包括多个通信接口(如以太网、USB OTG、SDIO等)、多媒体接口和多种定时器。
- 安全性:提供了安全启动、加密存储等安全特性,保护应用数据。
- 多种电源管理:支持多种低功耗模式,延长电池寿命。
- 开发支持:兼容ST公司的STM32CubeMX和STM32CubeIDE,方便开发和配置。
STM32F767广泛应用于工业控制、消费电子、医疗设备、汽车电子等领域,特别是在需要高性能处理和复杂图形处理能力的应用场景中。
LSM6DSO16IS
LSM6DSO16IS是一款MEMS 3D加速度计和3D陀螺仪的组合传感器,能够提供±2/±4/±8/±16 g的加速度测量范围和±125/±250/±500/±1000/±2000 dps的角速度测量范围。它还具备一个智能处理单元(Intelligent Processing Unit, ISPU),可以进行智能数据处理。
LIS2MDL
LIS2MDL是一款MEMS 3D磁力计,能够测量±50高斯的磁场强度。它常用于确定设备的方向和位置。
LIS2DUXS12
LIS2DUXS12是一款超低功耗的MEMS 3D加速度计,具有±2/±4/±8/±16 g的测量范围。它具备Qvar技术、AI算法和抗混叠功能,适用于需要低功耗和高精度加速度测量的应用。
LPS22DF
LPS22DF是一款低功耗、高精度的MEMS压力传感器,能够提供260-1260 hPa的绝对数字输出,常用于气压测量和高度计功能。
SHT40AD1B
SHT40AD1B是一款由Sensirion公司生产的高精度、超低功耗的相对湿度和温度传感器。它能够提供精确的温湿度测量,适用于环境监测和气候控制。
STTS22H
STTS22H是一款低电压、超低功耗的温度传感器,具有0.5°C的精度范围,测量范围从-40°C到+125°C,适用于需要精确温度测量的应用。
LSM6DSV16X
LSM6DSV16X是一款MEMS 3D加速度计和3D陀螺仪的组合传感器,具有±2/±4/±8/±16 g的加速度测量范围和高达±4000 dps的角速度测量范围。它还具备嵌入式传感器融合、AI算法和Qvar技术,适用于高端应用场景,如动作检测和电子图像稳定。
设计思路
本次设计针对任务一:
使用板卡上的触摸按键,实现点按和左右滑动,实现传感器选择和切换,并将数据发送到上位机,功能选择的可视化也在上位机完成
程序框架图以及程序流程图
首先使用板上的QVAR Swipe electrode 接上LIS2DUXS12传感器芯片的QVAR端用于读取电压数据。单片机上跑FreeRTOS系统,通过读取QVAR的数据,决定发送哪个数据到上位机。上位机用于接收单片机发送的数据,并且显示。
程序流程图如下所示:
主要代码
详细代码请看 Nyquest-unstable/stm32f767zi_funpack3-3 at new_branch (github.com)
RTOS
Task1
用于接收是否按下,来切换发送芯片的ID
/**
* @brief Function implementing the get_LP22DF thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_get_LP22DF_func */
void get_sensor_ID(void *argument)
{
/* USER CODE BEGIN get_LP22DF_func */
/* Infinite loop */
for(;;)
{
int16_t temp_data = 0;
temp_data = get_qavr();
if(temp_data > 1000)/*按下左键*/
{
osDelay(pdMS_TO_TICKS(50));
while (temp_data > 1000) {
temp_data = get_qavr();
}
sensor_ID -= 1;
}
if(temp_data < -1500)/*按下右键*/
{
osDelay(pdMS_TO_TICKS(50));
while (temp_data < -1500) {
temp_data = get_qavr();
}
sensor_ID += 1;
}
// sensor_ID = 5;
// printf("%d\n", temp_data);
osDelay(pdMS_TO_TICKS(1000));;
}
/* USER CODE END get_LP22DF_func */
}
Task2
通过程序中的ID确定哪个芯片需要被采集,将采集的数据发送到队列,用于下一步处理。
/* USER CODE BEGIN Header_get_SHT40_func */
/**
* @brief Function implementing the get_SHT40 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_get_SHT40_func */
void get_data_to_queue(void *argument)
{
/* USER CODE BEGIN get_SHT40_func */
/* Infinite loop */
int temp_i = 0;
for(;;)
{
MEMS_data_struct temp_data = {0};
int value_ID = my_MEMS_process(sensor_ID, &temp_data);
// if(value_ID > 0){
// sensor_ID--;
// }
// if(sensor_ID < 0){
// sensor_ID = 0;
// }
// temp_data.accelerationX = temp_i++;
// MX_IKS4A1_DataLogTerminal_Process();
// MEMS_data_struct.dimension2 = 2;
// MEMS_data_struct.dimension3 = 3;
// MEMS_data_struct.dimension4 = 4;
// MEMS_data_struct.dimension5 = 5;
// MEMS_data_struct.dimension6 = 6;
xQueueSend(Send_queue, &temp_data, portMAX_DELAY);
osDelay(pdMS_TO_TICKS(100));;
}
/* USER CODE END get_SHT40_func */
}
Task3
将队列中的数据发送到上位机
/* USER CODE BEGIN Header_send_data_func */
/**
* @brief Function implementing the send_data_task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_send_data_func */
void send_data_func(void *argument)
{
/* USER CODE BEGIN send_data_func */
/* Infinite loop */
for(;;)
{
// printf("MX_MEMS_Process:\n");
// MX_MEMS_Process();
if (xQueueReceive(Send_queue, &send_data, portMAX_DELAY) == pdTRUE) {
// 处理接收到的数据
printf(" %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d \n",
sensor_ID,
send_data.accelerationX,
send_data.accelerationY,
send_data.accelerationZ,
send_data.angular_velocityX,
send_data.angular_velocityY,
send_data.angular_velocityZ,
send_data.magnetic_fieldX,
send_data.magnetic_fieldY,
send_data.magnetic_fieldZ,
(int)send_data.huminity,
(int)send_data.temp,
(int)send_data.press
);
}
else {
// 队列创建失败,处理错误
printf("nodata\n");
}
}
/* USER CODE END send_data_func */
}
功能展示
实验界面布局:界面左上角明确标注当前传感器的ID编号。右上角的波形图实时绘制三轴姿态数据。紧接其下的左侧波形图展示三轴加速度的动态响应。界面右下角的波形图呈现磁力传感器的实时数据。界面底部整齐排列温度、湿度和气压的数值显示。
通过触摸传感器,界面切换至ID 0的传感器数据视图。界面中仅中间右侧的波形图显示数据更新。当前界面反映的是LIS2MDL 3D磁力计的测量数据。
触摸传感器后,界面更新为ID 3的传感器数据。顶部和中间左侧的波形图联合更新,展示数据动态。当前展示的是LSM6DSV16X传感器的三轴加速度和三轴角速度数据,该传感器同时集成了传感器融合、AI处理和Qvar技术。值得一提的是,本次触摸数据读取也是通过这个传感器芯片读取的。
任务完成总结
成功实现触摸按键控制传感器选择与数据发送,上位机实时图表显示多轴数据,提供直观反馈与操作体验。
未来,可以增强数据分析功能,优化用户界面,扩展传感器种类,集成云服务,提升系统稳定性与数据处理效率。