1 前言
最近学习了一下LCU(Binary to Gray code converter)模块,它是一个S32K3内部的一个硬件逻辑运算模块,如果用的好的话可以有很大的作用,它可以实现与或门这些简单的逻辑运行,可以实现复用器,编码器,解码器等这些常见的数字电路,还可以实现一些D,SR,JK等这些触发器,还可以在电机应用中实现编码器,BLDC的换向器等等复杂应用, 下面就来简单的说一说它的实现原理。
2 LCU的框架
下图是一个LCU模块的框图。
从图中我们可以得到很多重要的点:
- 整个模块有12个输入信号,12个输出信号,2个同步信号,3个强制信号(图上有误,不要相信)
- 整个模块有3个LC逻辑运算单元,分别是LC0,C1,LC2,且相互独立
- 每个LC逻辑运算单元有4个输入信号,4个输出信号,2个同步信号,3个强制信号
- 3个LC逻辑运算单元的12个输出信号又可以作为LC逻辑运算单元的输入信号
- 每个LC逻辑运算单元都可以产生中断输出信号和DMA触发信号
3 LC逻辑运算单元
下图中黄色框的部分是一个LC逻辑运算单元的结构框图:
从图中又可以看出很多信息,下面就给它剖析一下。
3.1 input&output&sync&force
输入信号和输出信号就是传统意义上的输入和输出,没啥好说的, LCU的12个输入信号可以来自下面三个地方:
- 外部GPIO引脚
- 其他外设输出信号(通过TRGMUX连接,包括LCU的输出信号)
- 寄存器的值(软件写SWVALUE寄存器,并使能就可以直接将原来的输入信号覆盖,可以理解成是强制输入,或者叫覆盖输入信号)
强制信号就是啥意思?就是在输出的那一头整了一个强制改变输出的部件,一旦强制信号使能,那么最后输出的值则就等于强制信号的值了。
那啥又是同步信号呢?同步信号是为了给强制信号以及覆盖输入信号提供一个同步机制。对于强制信号的同步,只有当同步信号和强制信号同时有效(这里的有效可以是有效边沿或者有效电平),强制信号才会起作用;对于覆盖输入信号的同步,则只有边沿有效。
3.2 LUT block
这个其实就是LC单元的真值表,那么LUT Block的真值表是通过什么方式来驱动的呢?其实非常简单。
因为每个LC单元只有4个输入,所以一共只有16种输入可能,如果将这16种可能以一个16bit的数LUTCTRL来表示,即LUTCTRL的每一位代表一种可能,如果LUTCTRL的第一位为1,那么这一位代表的第一种可能相对应的输出就为1,反之输出0。是不是超级简单。举个例子就是如下表:
其中红框指的是输入,黄框即LUTCTRL=0x0035时的输出值。
3.3 数字filter
LCU还为输入信号和强制信号提供了数字filter,至于数字filter的原理也是非常的简单,就是当信号有效时间大于预先设置的时间,这个时候才会LCU内部逻辑才会判断信号有效,这里的时间单位为时钟数。
4 LCU应用示例
在S32K3的应用手册上提供了多种LCU应用示例介绍,如下图:
感兴趣的可以去RM手册上研究,这里就不多说了。
5 MCAL配置示例
待续。。。。。