|
我们用STM32L431的SPI接口访问ISM330ISN. 设置了ISM330ISN的 数据ODR为6667Hz ,那么如果要把这每秒6667样本的数据 通过usart1传到上位机,怎么做到两个数据同步呢? 也就是对外也要6667Hz的数据刷新率。 目前是使用ISM330ISN的中断INT1作为同步信号,也就是ISM330ISN每准备好一组数据发送INT1中断,MCU收到后触发读操作,读取数据后发送到usart1 。 请问下int1可以这么用吗? 假设设置为6667Hz, 用串口调试助手实测 mcu发送出来的数据大约有200多Hz ,此时波特率设置为115200bps。 这部分应该怎么操作才能保证所有的振动传感器数据都发送到上位机呢? |
STM32L496ZG 通过串口驱动 SIM7022 NB-IoT 模组无法注册网络
将 TIM2 用作 TIM5、TIM1 和 TIM8 的时序控制器
Pokerogue: A Browser-Based Roguelike Pokémon Game That Hooks You
串口DMA收发出现ORE错误
STM32U5系列上电时序
STM32L476项目运行提示没有crypto.h
STM32生产产地和版本
50台设备共用一条CAN总线,会概率性丢包
STM32L431CCT6芯片的ADC差分采集
stm32l4R7ZI的uart4在stop2模式下唤醒偶发数据接收丢失或者乱码
微信公众号
手机版
这个系列内置了ISPU处理单元,所以就没有FIFO了,但是可以用这个DSP编程处理数据。
如果要输出数据,选择带FIFO的就比较好处理,时间足够。
另外通常应用(比如防抖....),最高数据ODR也就1k多就足够了。
我这边的应用是MCU需要在最大0.5ms内判断是否阈值超标 然后输出告警 同时输出6.667kHz 或者至少khz的振动原始数据。 另外ispu部分目前代码里没有用到。 想知道是否可以以ISM330 的对外中断int1作为节拍 按我的理解 ODR设定为6,667KHz时 对应就应该每秒有6.667k个int1脉冲,那么mcu收到这int后去读ism330的数据并转发。 不知道实际情况是否如此?有没有更好的方案
MCU与ism模块用spi接口,这部分时钟要设得高些,假如ism每次准备好数据,外部中断触发spi(mcu的spi做主机)发时钟把数据搬运到mcu的内存中,简单一点,spi用dma接收,等dma tc或者ht(用ht中断可以减少延时)就可以触发urat往上位机搬数据,假如6667个样本是32位数,那么一秒钟用uart(最好也要dma带fifo)搬运的比特数至少为6667x32x10(start+8+stop)= 2133440 bps,所以上位机的波特率至少要这个数,现在2.5Mbps的串口可以的,这样相当于上位机的数据总是落后ism中的数据一帧
按照你的要求,除非每秒的数据都超阈值,才需要每秒都上传。如果波特率不够大,开一个可以存好多数据的内存,暂存好几次超阈值的数据,慢点传。
6.667k的频率间隔就是149us 左右。 STM32L431既要接收中断,然后SPI读取数据,还要判断,然后再发送串口,都是软件来做,看起来时间应该不够处理完。
这个型号内置DSP,应该充分利用它来处理判断,当然有开发难度。
否则应该选带有FIFO的,这样读取数据就不需要那么快了。
是不是选用ISM330DH系列的就有FIFO 了 ? 我们板子上还有LIS2D12芯片,这个芯片有下图的阈值寄存器,是不是超阈值报警直接使用下面的寄存器就更快捷些? 我目前是读取ism330isn的加速度值后mcu再自己比大小 ,可能在0.5ms内来不及发送告警