这几天看了看LSM6DSOX的有限状态机相关内容,从最开始一脸懵逼,到现在相对明白些。想必肯定有伙伴跟我也是一样的,收到开发板初步体验后,想要尝试下FSM的乐趣,找了3月19日直播回顾的官方ppt和版主nmg发出的Unico上FSM的使用.pdf,但由于其篇幅有限,感觉看完还是不能很好地明白如何写自己的状态机程序。
经过一晚上的研读ST官网上提供了的关于LSM6DSOX的说明文档,算是理解了LSM6DSOX的特性、使用方法和命令选择了。
本篇**想跟小伙伴们分享下我的学习收获,希望内容可以帮到小伙伴们,我将从FSM基础开始分享,当然如有纰漏,请小伙伴指正。 啥是有限状态机(FSM)? 维基百科给出的解释:有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 用LSM6DSOX的示例状态机图解释,如下图,每一个蓝色方块为一个状态,程序会逐行运行,当满足某些条件的时候,就会触发相应的状态转移。
按照上面的规则推到一下可知,FSM会先判断状态1中的“返回1”的条件是否满足,如果满足,就会回到默认复位点,如果不满足,则继续判断“前进1”的条件是否满足,如果仍不满足,则返回复位点, 如果满足了,那么将会进入状态2执行“命令处理”,当处理完成后,则进入状态3,判断方法跟状态1一样。(细心的伙伴可以看到这里的复位点不再是默认的了,是的,因为有个命令可以更改重复位的位置,这个之后讲命令的时候会提到)
FSM的有哪些特点? 3月19日的培训ppt上写的有: - 输入量可以是加速度、角速度、磁力计(需要扩展),MLC机器学习模块的输出量
- 最多有16个状态机程序同时运行
- 每个状态机程序都可以输出多个状态
- 有一套完整的命令和条件指令集
我们逐条来看
第一点,输入量可以是加速度、角速度、磁力计(需要扩展),MLC机器学习模块的输出量,那么如下图所示。
加速度、角速度、磁力计的原始数据通过信号调节模块处理成适当灵敏度(对应量程)的半精度浮点值HFP(float为32位,HFP为16位),然后直接输入到FSM中或者经过机器学习MLC模块处理后将其输出传入FSM模块,FSM处理后输出结果。
可以看到FSM的输入源是很丰富的,具体选择哪个参数作为输入源是可以通过CMD指令更改的,具体的后面再说。
第二点,最多有16个状态机程序同时运行,我们把FSM展开来看,如下图所示。 在LSM6DSOX的FSM中共有16个状态机模块,所有状态机间是相互独立的。每个状态机拥有自己的专用内存区,每个程序最大的空间为256字节,而且每个状态机独立运行,所以每个程序都可以独立输出结果。 LSM6DSOX的状态机程序不具备掉电保存特性,每次重新上电的时候都需要重新配置。
第三点,每个状态机程序都可以输出多个状态。
状态机程序的输出可以通过特定命令触发内部中断,从而将输出值传送到对应的FSM_OUTS寄存器中。
当外部INT1/INT2中断被使能后,内部中断也可以路由到外部中断,以此来提示外部处理器读取FSM_OUTS寄存器状态变化。
输出掩码Mask的配置参数格式如下图所示,通过掩码可以设置不同组合的输出状态,详细的在后面讲。
掩码Mask | +X | -X | +Y | -Y | +Z | -Z | +V | -V | 字节位号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
第四点,有一套完整的命令和条件指令集。 这个命令指令集在ST可编程传感器.pdf中的13-14页中有提到,我在官方的AN5273文档中找到了更为详细的介绍,FSM一共有16个条件指令和35个命令指令,但是由于篇幅有限,我将会在一个帖子里专门分享我对每个命令和条件指令功能的理解和使用示例。 在了解了FSM是啥,都有什么特点之后,小伙伴应该就对它有了宏观全面的认识了。
但同时也会有“这些输入怎么选择?输出Mask怎么设置?中断怎么配置?指令都有啥?等等”很多新的疑问,我该怎么写状态机呢?
|