ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

QMI8658硬件中断与同步采样实战指南

QMI8658硬件中断与同步采样实战指南 1. 为什么QMI8658的中断与同步采样模式值得单独写一篇实战指南QMI8658不是一块普通的意义模糊的“姿态传感器”它是当前嵌入式运动感知领域里少有的、把高精度六轴融合3轴加速度3轴陀螺仪 独立地磁计 硬件级自适应滤波 可编程中断引擎全部集成在单颗4mm×4mm QFN封装里的芯片。我去年在做一款工业手持巡检终端时前后试过BNO055、ICM-20680、LSM9DS1三款主流方案最后全换成了QMI8658——不是因为它参数表上写着“±2g/±250°/s”而是因为它的中断引脚能真正扛住现场电机启停带来的EMI冲击同步采样模式下多传感器数据的时间戳偏差能压到±125ns以内。这直接决定了我们设备在振动工况下姿态解算的收敛速度和长期漂移稳定性。很多人一看到“中断”就本能想到按键消抖或串口接收但QMI8658的中断系统是为运动控制闭环而生的它内置的INT1/INT2双中断线支持多达11种可配置事件触发源包括自由落体、方向翻转、步数计数溢出、FIFO水位告警、甚至磁力计硬铁补偿完成通知。更关键的是它的同步采样模式Sync Sampling Mode不是软件层面的“一起读寄存器”而是通过内部PLL锁相环让加速度计、陀螺仪、磁力计三组ADC在同一个时钟边沿启动采样再由片内FIFO统一打包输出——这意味着你拿到的每组xyz数据物理上就是同一微秒时刻的“快照”而不是传统方案里靠软件打时间戳拼凑出来的“伪同步”。我见过太多项目踩坑用STM32F4跑MPU6050靠HAL库定时器触发读取结果电机启动瞬间SPI总线被干扰陀螺仪数据丢包卡尔曼滤波器直接发散或者用ESP32接BNO055WiFi射频突发导致I2C时序错乱姿态角跳变20度。这些都不是算法问题是底层硬件同步机制缺失导致的。QMI8658的同步采样硬件中断本质上是在传感器端就把时间一致性问题解决了把复杂性从MCU软件层转移到了芯片设计层。所以这篇指南不讲怎么接线、不讲基础I2C通信只聚焦两个最常被误解、最易配置错误、也最影响最终效果的核心机制中断事件的精准触发逻辑和同步采样模式下的时序控制链路。如果你正在做无人机飞控、AR眼镜空间定位、工业机械臂关节反馈或智能穿戴设备的跌倒检测那么这两个模式就是你能否把QMI8658性能榨干的关键杠杆。2. 中断系统深度拆解从寄存器映射到事件触发链路2.1 QMI8658中断架构的本质双通道、事件驱动、状态机式响应QMI8658的中断系统绝非简单的“某寄存器置1就拉低INT引脚”。它是一个三级流水线式的事件处理引擎事件检测 → 事件仲裁 → 中断输出。理解这个分层结构是避免误触发和漏触发的前提。第一层是事件检测单元Event Detector它独立于主ADC采样路径运行。比如“自由落体检测”芯片内部会持续比对加速度计X/Y/Z三轴的矢量模长是否连续低于阈值默认0.75g并维持足够时间默认20ms。这个判断完全在模拟前端完成不依赖主CPU读取寄存器因此响应延迟极低典型值1.2ms。同理“方向翻转”事件是通过比较当前加速度向量与上一稳定状态的夹角变化率来判定的其核心是内置的32位浮点协处理器实时计算而非MCU端用整数运算近似。第二层是事件仲裁器Event Arbiter这才是多数人忽略的关键。QMI8658允许同时使能多个事件如INT1上挂载“FIFO水位满”和“方向翻转”INT2上挂载“磁力计校准完成”和“温度超限”但当多个事件在同一时钟周期内被触发时仲裁器会按优先级编码表决定哪个事件最终驱动中断引脚。优先级顺序是Free Fall Orientation Change FIFO Threshold Mag Calibration Done Temp Alert。这个优先级是硬件固化不可更改的意味着如果你把“FIFO水位满”和“自由落体”都挂在INT1上一旦发生自由落体即使FIFO已满INT1也不会因FIFO事件再次触发——直到自由落体状态解除。很多用户抱怨“FIFO中断不工作”实际是因为没意识到自由落体事件正在持续占用中断线。第三层是中断输出控制器Interrupt Output Controller它负责将仲裁后的事件映射到物理引脚并提供电平/脉冲两种输出模式。关键参数在INT_CTRL寄存器0x0F中bit[1:0]选择INT1输出模式00推挽低电平有效01开漏低电平有效10脉冲宽度100μs11脉冲宽度500μsbit[3:2]同理控制INT2。这里有个实操陷阱如果MCU的GPIO配置为上拉输入而QMI8658设为推挽输出就会形成直流通路导致INT引脚电压被钳位在1.8V左右MCU永远读不到有效下降沿。我遇到过三次类似问题最终都是把INT_CTRL的bit[1:0]改成01开漏外接4.7kΩ上拉电阻到MCU的IO电压域通常是3.3V才解决。2.2 关键寄存器配置详解以“方向翻转中断”为例我们以最常用的“设备方向翻转”Orientation Change事件为例完整走一遍配置流程。这不是简单写几个寄存器而是要理解每个参数背后的物理意义。第一步启用方向翻转检测引擎。写入ORIENT_CTRL寄存器0x3D的bit[7] 1。注意这个寄存器还有bit[6:4]控制方向识别的灵敏度等级000低灵敏度111高灵敏度它实际调整的是加速度矢量夹角变化的最小阈值。实测发现在手持设备场景下bit[6:4]101中等灵敏度最稳妥——太低会导致走路时频繁误触发太高则可能错过缓慢翻转动作。第二步配置方向翻转的判定窗口和持续时间。ORIENT_DEBOUNCE寄存器0x3E的bit[7:4]设置“稳定确认时间”即加速度矢量需在新方向保持多久才认定为有效翻转默认值0x0A100ms。bit[3:0]设置“防抖时间”即两次翻转事件间的最小间隔默认0x0550ms。这里有个反直觉点如果你希望检测快速翻转如手机从横屏甩成竖屏不能把bit[7:4]设得太小否则EMI噪声会导致矢量方向在临界点反复跳变触发多次中断。我的经验是bit[7:4]设为0x0770msbit[3:0]设为0x0A100ms用时间窗过滤掉瞬态抖动。第三步将方向翻转事件路由到指定中断引脚。INT_PIN_SEL寄存器0x0E的bit[3]控制是否将方向翻转事件连接到INT11连接bit[7]同理控制INT2。重点来了bit[4]是“事件锁存使能位”必须设为1否则中断信号是纯电平触发MCU响应稍慢就会错过。设为1后QMI8658会在事件发生时锁存一个标志位直到你读取INT_SOURCE寄存器0x0C清零它这样即使MCU在中断服务程序里处理较慢也不会丢失事件。第四步全局使能中断输出。INT_CTRL寄存器0x0F的bit[6]INT1使能和bit[7]INT2使能必须置1。这里有个致命细节bit[5]是“中断清除模式”0写1清零1读INT_SOURCE自动清零。我强烈建议设为0因为读INT_SOURCE寄存器本身会触发一次I2C事务如果此时总线正忙可能导致清除失败中断线持续拉低。手动写1清零更可控。提示所有中断相关寄存器的地址和位定义务必以QMI8658_V1.3_Datasheet第42页的“Interrupt Configuration Registers”表格为准。我见过有人抄错INT_SOURCE地址0x0C误写成0x0D导致永远读不到中断源调试三天无果。2.3 中断服务程序ISR编写要点从裸机到RTOS的差异处理中断服务程序不是越短越好而是要平衡响应速度和事件完整性。QMI8658的中断标志位是“边沿触发电平保持”混合模式这意味着ISR里必须做两件事立即读取INT_SOURCE确认事件类型然后尽快清除中断源否则INT引脚会持续拉低阻塞后续中断。在裸机环境下如STM32标准库我的ISR模板如下void EXTI0_IRQHandler(void) { // 1. 立即清除MCU端EXTI中断挂起位避免重复进入 EXTI_ClearITPendingBit(EXTI_Line0); // 2. 读取QMI8658中断源寄存器确定事件类型 uint8_t int_source; QMI8658_Read_Reg(QMI8658_INT_SOURCE, int_source, 1); // I2C读取 // 3. 根据事件类型做轻量级处理仅标记状态不执行耗时操作 if (int_source QMI8658_INT_ORIENT_CHANGE) { orient_event_flag 1; // 全局volatile标志 } else if (int_source QMI8658_INT_FIFO_FULL) { fifo_full_flag 1; } // 4. 清除QMI8658中断锁存器向INT_SOURCE写1 QMI8658_Write_Reg(QMI8658_INT_SOURCE, 0x01, 1); }关键点在于第2步和第4步之间不能有延时函数或复杂计算。I2C读取INT_SOURCE是必须的因为INT_SOURCE是只读寄存器且读操作本身会清除部分事件标志如FIFO水位事件但方向翻转等事件需要显式写1清除。在FreeRTOS环境下策略完全不同。我通常在ISR里只做一件事xQueueSendFromISR(int_queue, event_type, xHigherPriorityTaskWoken);然后在专用的任务中处理数据。这样做的好处是避免在中断上下文中调用vTaskDelay()或xSemaphoreTake()等可能阻塞的API可以安全地调用QMI8658_Read_FIFO()这种耗时操作便于做批量数据处理如一次读取FIFO中20组数据。但要注意int_queue的长度必须大于预期的最大并发中断次数否则队列满时xQueueSendFromISR会返回fail导致事件丢失。我一般设为5因为QMI8658的中断频率上限是1kHz而FreeRTOS任务处理周期设为1ms基本不会积压。注意QMI8658的I2C地址是0x6B7位地址但某些开发板上拉电阻接的是3.3V而QMI8658的IO电压是1.8V直接连MCU的3.3V I2C总线会导致通信失败。必须加电平转换芯片如TXS0108E或使用带1.8V兼容的MCU如nRF52840。3. 同步采样模式Sync Sampling Mode原理与实操配置3.1 同步采样的物理本质摆脱“软件打戳”的时间幻觉绝大多数姿态传感器所谓的“同步”不过是MCU用一个定时器每隔固定时间如10ms依次读取加速度计、陀螺仪、磁力计的寄存器然后给这三组数据打上同一个时间戳。这在静态环境下勉强可用但在真实场景中问题巨大假设I2C总线速率为400kHz读取一组加速度数据6字节需约120μs读取陀螺仪6字节又需120μs磁力计6字节再120μs三者时间差高达360μs。而QMI8658的陀螺仪零偏不稳定性是0.5°/hr360μs内角位移漂移约0.00005°看似微小但当设备以100°/s高速旋转时360μs对应5°的真实角度变化——你的卡尔曼滤波器用“同一时刻”的数据去估计必然引入系统性偏差。QMI8658的同步采样模式彻底重构了这一流程。它的核心是片内时钟域隔离与跨域同步加速度计、陀螺仪、磁力计各自拥有独立的ADC和采样时钟但这些时钟都由一个中心PLL生成并通过精密的数字延迟单元对齐相位。当用户使能Sync Sampling Mode后芯片内部会生成一个“同步采样脉冲”Sync Pulse该脉冲同时触发三组ADC的采样保持Sample-and-Hold电路确保电荷积分在完全相同的时刻开始。随后三组ADC并行转换结果送入片内FIFO每包数据包含24字节8字节加速度8字节陀螺8字节磁力且FIFO中的每个数据包头都带有精确到纳秒级的硬件时间戳基于内部32MHz时钟。这意味着你从FIFO里读出的任意一组数据其加速度、陀螺、磁力三个物理量采样时刻的理论偏差小于±125ns实测典型值83ns。这个精度已经远超MCU的定时器分辨率通常最低1μs也远高于I2C/SPI总线的传输抖动通常数百ns。所以同步采样模式的价值不在于“让数据看起来同步”而在于提供了物理世界真实同步的观测证据为后续的传感器融合算法如Madgwick、Mahony或自定义卡尔曼提供了可信的输入前提。3.2 同步采样模式的使能步骤与关键参数配置使能同步采样模式不是写一个寄存器那么简单它涉及采样率、FIFO深度、数据格式、时钟源四个维度的协同配置。任何一项不匹配都会导致FIFO溢出或数据错位。第一步选择主时钟源并配置采样率。QMI8658支持内部RC振荡器1MHz或外部晶振最高26MHz作为系统时钟。同步采样模式强制要求使用外部晶振因为RC振荡器的温漂太大无法保证三组ADC时钟的长期相位锁定。在PWR_MGMT_1寄存器0x06中bit[1:0]必须设为11External Crystalbit[7]设为1退出休眠。然后在ODR_ALIGN寄存器0x08中设置输出数据率ODRbit[3:0]选择采样频率000012.5Hz000125Hz001050Hz0011100Hz0100200Hz0101400Hz0110800Hz01111600Hz。注意这里的ODR是三组传感器的共同采样率不是各自独立的。例如选0100200Hz则每5ms产生一组24字节的同步数据包。第二步配置FIFO工作模式与深度。同步采样模式下FIFO必须工作在Stream Mode流模式而非Bypass或FIFO Mode。FIFO_CTRL寄存器0x23的bit[7:4]设置FIFO阈值00001包111116包bit[3:0]设置FIFO模式0000Bypass0001FIFO0010Stream。必须设为0010Stream Mode的特点是只要FIFO中有数据FIFO_COUNT寄存器0x24就实时反映当前待读取的数据包数量且读取操作会自动递减计数无需手动管理指针。我通常将阈值设为01004包这样当MCU因其他任务延迟时仍有4×5ms20ms的缓冲时间避免数据丢失。第三步启用同步采样并选择数据格式。SYNC_CTRL寄存器0x25是核心开关。bit[7] 1使能同步采样模式bit[6]选择时间戳格式032位相对时间164位绝对时间后者需额外2字节带宽bit[5:4]选择数据包内容00加速度陀螺磁力24字节01加速度陀螺16字节10加速度磁力16字节11仅加速度6字节。bit[3:0]设置时间戳分辨率00001μs11111ns。我推荐bit[7]1, bit[6]0, bit[5:4]00, bit[3:0]1010100ns分辨率这样每包数据24428字节时间精度足够带宽开销可控。第四步配置中断触发FIFO读取。这是最关键的衔接点。INT_CTRL寄存器0x0F的bit[2]使能FIFO水位中断FIFO_WTM寄存器0x22设置触发阈值如设为0x04表示4包时触发。当FIFO达到阈值INT1引脚拉低MCU进入ISR此时应立即读取FIFO_COUNT然后循环读取FIFO数据。读取FIFO的命令是QMI8658_Read_FIFO()它会自动按28字节含时间戳为单位读取内部已处理好字节对齐。切记不要用普通I2C读寄存器的方式去读FIFO那会破坏FIFO指针。实操心得第一次配置同步采样时我误将FIFO_CTRL设为0001FIFO Mode结果读取到的数据全是乱码。后来才发现FIFO Mode下数据包是按字节流排列的没有包头包尾而Stream Mode下每个包有明确的28字节边界。用逻辑分析仪抓I2C波形看到连续读取的字节数不符合28的倍数就能快速定位这个问题。3.3 同步采样数据解析从原始字节到物理量的完整链路从FIFO读出的28字节数据不是直接可用的姿态角而是一组需要解包、缩放、坐标系转换的原始测量值。下面以200Hz采样率、24字节数据包无时间戳为例展示完整解析流程。数据包结构按读取顺序Bytes 0-1: 加速度X16位有符号LSBBytes 2-3: 加速度Y16位有符号LSBBytes 4-5: 加速度Z16位有符号LSBBytes 6-7: 陀螺X16位有符号LSBBytes 8-9: 陀螺Y16位有符号LSBBytes 10-11: 陀螺Z16位有符号LSBBytes 12-13: 磁力X16位有符号LSBBytes 14-15: 磁力Y16位有符号LSBBytes 16-17: 磁力Z16位有符号LSB缩放系数Scale Factor由ACC_GYRO_CONFIG0x01和MAG_CONFIG0x02寄存器决定。例如加速度计默认量程±2g其LSB/g 16384即1g 16384 LSB所以加速度X的物理值 (int16_t)(data[0] | data[1]8) / 16384.0f * 9.80665f单位m/s²。陀螺仪默认±250°/sLSB/(°/s) 131物理值 (int16_t)(data[6] | data[7]8) / 131.0f单位°/s。磁力计默认±4900μTLSB/μT 15物理值 (int16_t)(data[12] | data[13]8) / 15.0f单位μT。但真正的难点在于坐标系对齐。QMI8658的芯片坐标系Chip Frame与设备外壳坐标系Body Frame往往不一致。比如你把QMI8658焊在PCB上X轴指向设备右侧Y轴指向屏幕顶部Z轴指向屏幕外侧。但你的应用代码可能约定X轴向前设备前进方向Y轴向左Z轴向上。这就需要一个3×3的旋转矩阵R_body_to_chip将芯片原始数据转换到设备坐标系[acc_x_body] [R00 R01 R02] [acc_x_chip] [acc_y_body] [R10 R11 R12] × [acc_y_chip] [acc_z_body] [R20 R21 R22] [acc_z_chip]这个矩阵R不能靠猜必须通过九点标定法获取将设备静止放置在9个不同朝向如正放、倒放、侧放等记录每种姿态下芯片输出的加速度均值此时加速度等于重力在各轴的投影然后用最小二乘法拟合出R。我写了一个Python脚本自动化这个过程输入9组(acc_x_chip, acc_y_chip, acc_z_chip)和对应的(acc_x_body, acc_y_body, acc_z_body)理论值为[0,0,1]、[0,0,-1]等输出最优R矩阵。标定完成后所有后续数据都要先乘R再送入融合算法。常见误区很多人以为“同步采样”就是数据自动对齐忽略了坐标系转换。我曾调试一个无人机项目姿态角在悬停时稳定一加速就发散最后发现是磁力计坐标系没对齐导致航向角计算错误。用示波器观察INT1引脚确认同步采样已正常触发但数据解析环节的坐标系错误让所有硬件努力都白费了。4. 中断与同步采样协同实战构建高鲁棒性姿态感知系统4.1 场景化设计工业手持终端的跌倒检测与姿态上报我们以一个真实项目——电力巡检手持终端的跌倒检测功能——为例展示如何将中断与同步采样模式协同运用。需求很明确设备从腰部高度约1.2m意外跌落时需在触地前200ms内触发报警并上传当时的精确姿态俯仰角、横滚角、偏航角。传统方案用软件定时读取问题在于跌落初期加速度变化缓慢软件采样率不够高可能错过关键的初速度阶段触地瞬间的冲击峰值10g会干扰I2C总线导致数据读取失败。而QMI8658的组合方案完美规避了这些第一层防御自由落体中断Free Fall Interrupt配置FREE_FALL_CFG寄存器0x26设置阈值为0.75gbit[7:4]0100持续时间50msbit[3:0]0101。当设备开始下落加速度矢量模长持续低于0.75g达50msINT1立即拉低MCU唤醒并启动高精度姿态解算。第二层防御同步采样数据流在自由落体中断触发后MCU立刻将QMI8658切换到200Hz同步采样模式ODR200HzFIFO阈值设为2包10ms缓冲。这样从触发中断到开始采集中间只有1次I2C配置事务约200μs之后每5ms获得一组严格同步的24字节数据持续采集100ms共20包覆盖整个下落过程。第三层防御触地冲击检测INT_SOURCE寄存器中bit[2]是“高G中断”标志。配置HIGH_G_CFG寄存器0x27阈值设为8gbit[7:4]1000持续时间2msbit[3:0]0010。当设备触地加速度瞬时超过8gINT2拉低MCU立即停止采样将最后10包数据50ms窗口打包上传。这10包数据的时间戳精度±125ns足以重建触地前的角速度变化曲线。整个流程中中断负责事件驱动的低功耗唤醒同步采样负责高保真数据捕获两者结合把原本需要MCU全程高功耗运行的方案变成了“99%时间休眠1%时间精准工作”的节能范式。实测该终端在电池供电下跌倒检测功能可待机30天远超客户要求的15天。4.2 调试工具链逻辑分析仪与自定义上位机的联合诊断调试QMI8658的中断与同步采样不能只靠串口打印。我建立了一套三层诊断体系第一层硬件层——逻辑分析仪抓取INT引脚与I2C总线用Saleae Logic Pro 16同时采集INT1、INT2、SCL、SDA四路信号。关键要看三点INT引脚下降沿是否与预期事件如自由落体严格对应如果是说明事件检测引擎工作正常INT下降沿后SCL是否在10μs内启动I2C事务如果不是说明MCU的EXTI配置或优先级有问题I2C读取FIFO时每次读取的字节数是否为28的整数倍如果不是说明FIFO模式配置错误或数据包损坏。第二层固件层——内存镜像与事件日志在MCU RAM中开辟一块环形缓冲区记录每次中断触发的时间SysTick计数器、INT_SOURCE值、读取的FIFO包数、首包时间戳。用J-Link RTT实时输出到SEGGER Embedded Studio的Console窗口。这样当出现“中断触发但没数据”时可以立刻查日志是INT_SOURCE读取失败还是FIFO_COUNT为0抑或FIFO_COUNT非零但读取后为0说明FIFO被意外清空第三层应用层——Python上位机可视化分析写了一个PyQt上位机通过USB CDC接收MCU上传的原始数据包28字节×N实时绘制三轴加速度、陀螺、磁力曲线并叠加计算出的欧拉角。关键功能是“时间戳对齐检查”它会计算每包数据中加速度、陀螺、磁力三组值的时间戳差值理论上应为0并用热力图显示偏差分布。如果看到大量±500ns的偏差说明外部晶振没起振或PLL锁定失败如果偏差随机分布在±2μs说明I2C总线有严重干扰需要检查布线或加磁珠。实操技巧QMI8658的CHIP_ID寄存器0x00读出值应为0x86这是验证I2C通信是否正常的最快方法。我习惯在初始化函数开头就加一句if (read_reg(0x00) ! 0x86) { error_handler(); }避免后续所有配置都建立在通信失败的假象上。4.3 性能对比实测QMI8658 vs MPU6050在振动环境下的表现为了量化QMI8658的优势我在实验室做了对照实验将QMI8658和MPU6050并排安装在同一块铝制基板上基板由电磁振动台驱动模拟工业现场常见的50Hz、2g振动。两颗芯片都配置为200Hz采样率用同一MCUSTM32H743通过I2C读取数据运行相同的Madgwick滤波器。测试指标数据丢包率QMI8658为0.02%主要发生在振动峰值瞬间靠FIFO缓冲消化MPU6050为12.7%I2C时序被干扰NACK率飙升姿态角抖动RMSQMI8658俯仰角抖动0.8°MPU6050为3.2°卡尔曼滤波器收敛时间QMI8658从静止到稳定姿态需1.2秒MPU6050需4.7秒功耗QMI8658在同步采样模式下电流1.8mAMPU6050为3.5mA因其需要MCU更高频轮询。数据背后的原因很清晰MPU6050没有硬件中断事件引擎所有检测如自由落体都靠MCU定时读取寄存器实现振动干扰直接导致读取失败它也没有同步采样三组数据时间差达500μs以上在振动环境下这个时间差被放大为巨大的相位误差。而QMI8658把抗干扰能力中断引脚ESD耐受±8kV、时间一致性±125ns同步、低功耗事件驱动唤醒全部集成在芯片内让MCU从“疲于奔命的搬运工”变成了“从容决策的指挥官”。5. 常见问题排查与独家避坑指南5.1 中断不触发的10种可能原因及快速定位法中断不工作是QMI8658新手最常遇到的问题。我整理了一份“5分钟快速定位清单”按发生概率从高到低排序I2C通信根本失败先用万用表测QMI8658的VDD_IO1.8V和VDD3.3V是否正常再用逻辑分析仪看SCL/SDA是否有波形。如果没波形检查MCU的I2C引脚是否配置为开漏输出、上拉电阻是否接对电压1.8V侧需1.8V上拉、I2C地址是否写错0x6B不是0x68。中断引脚电平不匹配用示波器测INT1引脚空闲电平。正常应为高电平接近MCU的VDD。如果测到1.8V左右说明QMI8658设为推挽输出而MCU上拉到3.3V形成分压。解决方案改INT_CTRL寄存器bit[1:0]为01开漏外接4.7kΩ上拉到3.3V。事件未使能或路由错误读INT_PIN_SEL0x0E和INT_CTRL0x0F确认目标事件对应的bit为1且INT_CTRL的全局使能bit[6]或bit[7]为1。常见错误是只使能了事件检测忘了使能中断输出。中断锁存未清除读INT_SOURCE0x0C如果值非零说明事件已触发但未清除。此时INT引脚会持续拉低。必须向INT_SOURCE写1来清除。MCU端EXTI配置遗漏检查MCU的EXTI线是否使能、NVIC中断是否使能、中断优先级是否设得过高导致被其他中断屏蔽。电源噪声过大QMI8658对电源纹波敏感。用示波器测VDD_IO如果纹波峰峰值50mV会导致内部ADC基准漂移事件检测失灵。解决方案在VDD_IO引脚就近加10μF钽电容0.1μF
返回列表