本帖最后由 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);
}
|