看呆了!竟然有mcu自带逻辑分析仪功能??
一、聊一聊
逻辑分析仪这玩意,拥有了几个,比如梦源的DSlogic,章鱼哥的PXlogic,金沙滩的selease,这些方案都是FPGA,采集性能无需置疑。自己曾经也想试试在MCU进行DIY一下,过过下小瘾。
在一次偶发翻看先楫的HPM6E00的用户手册时,在GPIO章节发现了一个新奇的外设-LOBS,逻辑观察模块,这让人好比看腻了千篇一律的GPIO,突然袭来的一阵新鲜感,也开启了这个外设的探索之旅。从外设功能看,主要是trace gpio功能,可以采集触发之前和之后的指定数量的gpio状态。
本文也就借着这个外设简单搭建下基本的采集上报功能,简单DIY了个32通道的基于pluseview的逻辑分析仪,对应的是PORT的32个pin,每个通道的GPIO状态都是通过lobs外设采集存储上报。
还是那句话,源码链接:
https://github.com/RCSN/hpm_sdk_extra.git
路径在demos/digital_logic_analyzer_hpm_for_pulseview中。
二、看一看
对于先楫的HPM6E00,发布的时候,ethercat的外设好像盖过了这个MCU的其他外设,让人觉得这个亮点就是ethercat,但是亮点也不仅仅是ethercat,还有其他外设的新增以及原有外设的功能增加,比如本文的Lobs逻辑观察模块。
该外设的功能比较丰富,内部章节寄存器描述也比较完善,官方对于该外设的功能描述也大体一两句话概括。本文就根据该功能描述进行简单的阐述,对于更详细的内容可参考用户手册以及hpm_sdk的lobs例子。
三、探一探
(一)满足什么期待的条件会送到LOBS采集
注意:这里的DI表示GPIO的输入信号电平,DO代表GPIO的输出信号电平,OE代表是GPIO的属性是输入还是输出。
在官方的配置须知可知,可以两个条件触发。简单理解就是可以类似是定时器的输入引脚触发,一个是内部计数器计数重载触发。
1、LOBS一共有5个触发状态数组,每一组触发完成后都可以通过NETSTATE寄存器互相指向,每个state只能指定一个GPIO PORT。
2、当该state的NEXTSTATE为0时,也就是标志触发采集完成。如果需要下次再次触发,需要重新打开采集。
简单理解就是:
对于触发信号,当输入检测到高电平或者低电平时,对应stata开始触发采集,电平触发取决于设置的golden值。
在SDK中也做了封装处理,比如触发的信号PF26,golden值为ture,那么就是高电平触发采集。
对于计数器触发,可以理解为计数器计数到比较值时停止采集,比较值就是采集的数量。
(二)GPIO数值怎么存储
lobs支持两个模式,一个是支持单group,一个是支持双group,简单理解就是,一个state要么只能采集单个gpio port,要么采集两个gpio port。两种模式都占用128bit内存,也就是16字节。
其中单group可以采集整个port的pin脚,每个pin占用3个bit,128bit中占用有效是3*32=96bit,高32bit被固定字节占用。手册中如是描述:
而有效bit对应的gpio顺序如下:
这里可以用结构体简单封装下,如此一来就可以通过位域读取每个Pin的DI/DO/OE。
对于双group,需要注意的是有效只有8bit,就是存储的最低8bit,但需要的内存占用同样也是128bit,方便在于可以只采集关心的Pin脚的信号,比如DI或者DO或者OE,在SDK也提供展示。
本文代码主要参考hpm_sdk的sample-lobs,根据上述的功能描述进行拆分阐述。
该sample主要演示lobs的trace功能,可以监视跟踪触发之前和触发之后的gpio状态,从readme可以看到:
这里以单group进行阐述:
1、group的采集长度为1024笔数据,主要体现在赋值的开始和结束地址,lobs会自动算出总采集长度
2、state0设置信号触发之前的触发模式,比如使用信号触发,触发信号选择,并把触发之后指向state1。注意的是,触发信号的选择只能在state设置group,比如state设置的是PA,那么触发信号只能在PA00到PA31之间选择。
3、state1设置信号触发之后的触发模式,比如使用计数器比较触发,比较值设置。设置的比较值为1024-64=960个数据。也就是说state0触发前会采集64个数据。不指向下一个state,当前state作为最后一个state。
四、测一测
为了直观查看lobs的数据是否准确采集,可以通过pluseview上位机采集显示,对于pluseview逻辑分析仪这里不多介绍,协议使用的是sump协议,可以采用串口通信,这里为了方便采用USB的cdc功能,使用的参考例子是sdk中的cherryusb的cdc acm例子。
需要告知pluseview当前的型号,采样率等等
在收到sump的meta指令时,把以上的数据发给上位机
打开pluseview,以下选择,上位机就检测到对应的设备,点击Ok。
出现32通道设备。
当收到run指令时候,开启lobs采集,收到reset指令时采集关闭,关闭lobs采集。
在关闭和打开Lobs时,需要unlock解锁,配置完最好lock加锁。对应的api如下。
打开Lobs采集
关闭lobs采集
这里只使用一个state,模式为单group 128bit,故状态设置为最后一个,不使用信号采集,单纯使用计数器比较。如下:
采集的Buffer进行一些转换
最终上报
这里使用的group为5,对应的port也就是PF00~PF31
引入一个PWM到PF9脚,pluseview开启采集,可以看到通道9已经采集到PWM。
五、总个结
本文以简单DIY个逻辑分析仪功能,抛砖引玉,希望一起探索和挖掘更多的用法。