oxygenzz 发表于 2019-3-29 16:50

使用MCC学习PIC单片机 – CLC 可配置逻辑单元

本帖最后由 oxygenzz 于 2019-3-29 16:58 编辑

CLC 可配置逻辑单元,在很多PIC单片机中有配备。例如PIC16F18446中,就有四个CLC模块(CLC1/2/3/4)。它的作用是对内部外部信号提供逻辑操作。
工作原理我们仍然通过比较MCC软件配置界面与数据手册上的功能模块图,来理解模块的工作原理。
两张图如下,红色的文字给出功能描述和对应的配置,在两张图上是一一对应的。根据数字,可以容易的将它们对应起来。


输入源最多有64种,每个CLC模块最多能选4种,数据源可重复选择。
选择出来的数据源在四输入门控逻辑中进行与/与非/或/或非(可选择)操作,在MCC界面上,这一过程,表达为“输入逻辑选择和门控7”中的4个四输入逻辑门。经门控,出来的结果是lcxg1/2/3/4 四路信号。

这四路信号进入逻辑功能方框。8种逻辑功能,在MCC界面上,由下拉框选择。有组合逻辑,也有时序逻辑。

逻辑功能输出的结果,由使能配置EN来决定其输出是否可以进入后面的电路,进而发挥作用。而且输出的结果的可以正向或负向,由输出极性控制。
CLC输出可产生中断,分别或者同时识别上升沿/下降沿。模块图中蓝色文字描述的部分,展示了CLC信号除了产生中断之外的其他输出路径:1.   锁存在D触发器中,供软件寄存器查询当前CLC输出状态(读CLCDATA)2.   CLCx_out 输出到其他外设,做下一级外设的触发信号,或输入信号,以实现CIP操作
3.   经PPS选控后,经IO口输出,TRIS要将该IO口设置为输出状态


代码解读
按照上图配置,MCC生成代码 , clc1.c 文件在工程的“MCC Generated Files”目录下。
代码很简洁,只有三个函数:void CLC1_Initialize(void);//初始化void CLC1_ISR(void);//中断处理程序bool CLC1_OutputStatusGet(void);//CLC 输出状态查询
初始化代码,已经自动加入到系统初始化函数SYSTEM_Initialize()中,并且在主函数中进行了调用。CLCx_ISR() 当中断触发时执行。
CLC1_OutputStatusGet() 由用户调用,查询当前输出状态。

void CLC1_Initialize(void){    // Set the CLC1 to theoptions selected in the User Interface    // LC1G1POL inverted;LC1G2POL not_inverted; LC1G3POL inverted; LC1G4POL not_inverted; LC1POLinverted;     CLC1POL = 0x85;    // LC1D1S CLCIN0(CLCIN0PPS);     CLC1SEL0 = 0x00;    // LC1D2S HFINTOSC;     CLC1SEL1 = 0x05;    // LC1D3S IOCIF setsignal;     CLC1SEL2 = 0x1E;    // LC1D4S CLC3_OUT;     CLC1SEL3 = 0x22;    // LC1G1D3N disabled;LC1G1D2N disabled; LC1G1D4N disabled; LC1G1D1T enabled; LC1G1D3T disabled;LC1G1D2T disabled; LC1G1D4T enabled; LC1G1D1N disabled;     CLC1GLS0 = 0x82;    // LC1G2D2N disabled;LC1G2D1N disabled; LC1G2D4N disabled; LC1G2D3N disabled; LC1G2D2T enabled;LC1G2D1T disabled; LC1G2D4T disabled; LC1G2D3T disabled;     CLC1GLS1 = 0x08;    // LC1G3D1N disabled;LC1G3D2N disabled; LC1G3D3N disabled; LC1G3D4N disabled; LC1G3D1T disabled;LC1G3D2T enabled; LC1G3D3T enabled; LC1G3D4T disabled;     CLC1GLS2 = 0x28;    // LC1G4D1N disabled;LC1G4D2N disabled; LC1G4D3N disabled; LC1G4D4N disabled; LC1G4D1T disabled;LC1G4D2T disabled; LC1G4D3T enabled; LC1G4D4T enabled;     CLC1GLS3 = 0xA0;    // LC1EN enabled; INTNenabled; INTP enabled; MODE 2-input D flip-flop with R;     CLC1CON = 0x9D;    // Clear the CLC interruptflag    PIR5bits.CLC1IF = 0;    // Enabling CLC1interrupt.    PIE5bits.CLC1IE = 1;}void CLC1_ISR(void){    // Clear the CLC interruptflag    PIR5bits.CLC1IF = 0;}bool CLC1_OutputStatusGet(void){   return(CLC1CONbits.LC1OUT);
}


零三翟邢止胃 发表于 2019-3-30 08:19

感谢分享啊! 真是不错啊!真是个好帖子!我要顶住啊! 赞一个啊!

talktea 发表于 2019-3-30 12:49

利用MPLAB X IDE的免费插件MCC,可以很大程度上减小CLC模组设计的工作量。推荐~

CoolSilicon 发表于 2019-4-2 08:45

加油加油!!!还有16个MCC外设模块等着你!

pullyi 发表于 2022-7-19 12:43

谢谢分享,学习了

vivilyly 发表于 2022-11-6 19:23

cLc指令什么时候使用?               
页: [1]
查看完整版本: 使用MCC学习PIC单片机 – CLC 可配置逻辑单元