#ifndef __LKS32MC09X_CLU_H__
#define __LKS32MC09X_CLU_H__

#include "lks32mc09x_reg.h"

typedef struct
{
    uint32_t EN;     ///< 模块使能 0关闭模块 1打开模块
    uint32_t FIE;    ///< 下降沿中断使能
    uint32_t RIE;    ///< 上升沿中断使能
    uint32_t MXA;    ///< A输入复用选择 格式 CLU_MXA_CLUa_b a取值范围为[0 1 2 3] 对应不同的CLU b表示选择不同的输入信号
    uint32_t MXB;    ///< B输入复用选择 格式 CLU_MXB_CLUa_b a取值范围为[0 1 2 3] 对应不同的CLU b表示选择不同的输入信号
    uint32_t FN;     ///< 真值表 格式 CLU_FN_x x取值范围为[A NOTA A_NOTB ...]对应为最简与或式下的最小相 例如 y=a+bc+!c 表示为 CLU_FN_A|CLU_FN_B_C|CLU_FN_NOTC
    uint32_t OUTSEL; ///< 输出选择 0: D 触发器输出 1: LUT 输出
    uint32_t OEN;    ///< 输出使能 0: 关闭 1: 使能
    uint32_t CLKINV; ///< D 触发器时钟电平 0: 同相 1: 反向
    uint32_t CLKSEL; ///< D 触发器时钟选择 0x0: 进位输入 0x1: MXA 输入 0x2: ALTCLK0 0x3: ALTCLK1
} CLU_InitTypeDef;

#define CLU_MODEL_CLU0 BIT0 ///< CLU0 CL0里面有4个CLU 这里用BIT0 BIT1 BIT2 BIT3做区分 不可修改
#define CLU_MODEL_CLU1 BIT1 ///< CLU1
#define CLU_MODEL_CLU2 BIT2 ///< CLU2
#define CLU_MODEL_CLU3 BIT3 ///< CLU3

///< CLU_MXA信号选择
#define CLU_MXA_CLU0_CLU0OUT       0
#define CLU_MXA_CLU0_CLU1OUT       1
#define CLU_MXA_CLU0_CLU2OUT       2
#define CLU_MXA_CLU0_CLU3OUT       3
#define CLU_MXA_CLU0_TIMER0ch0ovfl 4
#define CLU_MXA_CLU0_TIMER1ch0ovfl 5
#define CLU_MXA_CLU0_PWM0          6
#define CLU_MXA_CLU0_PWM1          7
#define CLU_MXA_CLU0_P0_0          8
#define CLU_MXA_CLU0_P0_3          9
#define CLU_MXA_CLU0_P0_5          10
#define CLU_MXA_CLU0_P0_7          11
#define CLU_MXA_CLU0_P2_12         12
#define CLU_MXA_CLU0_P0_12         13
#define CLU_MXA_CLU0_P0_14         14
#define CLU_MXA_CLU0_P1_0          15

#define CLU_MXA_CLU1_CLU0OUT       0
#define CLU_MXA_CLU1_CLU1OUT       1
#define CLU_MXA_CLU1_CLU2OUT       2
#define CLU_MXA_CLU1_CLU3OUT       3
#define CLU_MXA_CLU1_TIMER0ch1ovfl 4
#define CLU_MXA_CLU1_TIMER1ch1ovfl 5
#define CLU_MXA_CLU1_PWM2          6
#define CLU_MXA_CLU1_PWM3          7
#define CLU_MXA_CLU1_P0_0          8
#define CLU_MXA_CLU1_P0_2          9
#define CLU_MXA_CLU1_P0_5          10
#define CLU_MXA_CLU1_P0_6          11
#define CLU_MXA_CLU1_P2_12         12
#define CLU_MXA_CLU1_P0_11         13
#define CLU_MXA_CLU1_P0_14         14
#define CLU_MXA_CLU1_P0_15         15

#define CLU_MXA_CLU2_CLU0OUT       0
#define CLU_MXA_CLU2_CLU1OUT       1
#define CLU_MXA_CLU2_CLU2OUT       2
#define CLU_MXA_CLU2_CLU3OUT       3
#define CLU_MXA_CLU2_TIMER2ch0ovfl 4
#define CLU_MXA_CLU2_TIMER3ch0ovfl 5
#define CLU_MXA_CLU2_PWM0          6
#define CLU_MXA_CLU2_PWM2          7
#define CLU_MXA_CLU2_P2_8          8
#define CLU_MXA_CLU2_P1_13         9
#define CLU_MXA_CLU2_P1_15         10
#define CLU_MXA_CLU2_P1_10         11
#define CLU_MXA_CLU2_P2_1          12
#define CLU_MXA_CLU2_P2_4          13
#define CLU_MXA_CLU2_P2_6          14
#define CLU_MXA_CLU2_P2_14         15

#define CLU_MXA_CLU3_CLU0OUT       0
#define CLU_MXA_CLU3_CLU1OUT       1
#define CLU_MXA_CLU3_CLU2OUT       2
#define CLU_MXA_CLU3_CLU3OUT       3
#define CLU_MXA_CLU3_TIMER2ch1ovfl 4
#define CLU_MXA_CLU3_TIMER3ch1ovfl 5
#define CLU_MXA_CLU3_PWM1          6
#define CLU_MXA_CLU3_PWM3          7
#define CLU_MXA_CLU3_P2_8          8
#define CLU_MXA_CLU3_P2_7          9
#define CLU_MXA_CLU3_P1_15         10
#define CLU_MXA_CLU3_P2_0          11
#define CLU_MXA_CLU3_P2_1          12
#define CLU_MXA_CLU3_P2_3          13
#define CLU_MXA_CLU3_P2_6          14
#define CLU_MXA_CLU3_P2_13         15

///< CLU_MXB信号选择
#define CLU_MXB_CLU0_CLU0OUT  0
#define CLU_MXB_CLU0_CLU1OUT  1
#define CLU_MXB_CLU0_CLU2OUT  2
#define CLU_MXB_CLU0_CLU3OUT  3
#define CLU_MXB_CLU0_ADBUSY0  4
#define CLU_MXB_CLU0_CMP0_OUT 5
#define CLU_MXB_CLU0_PWM3     6
#define CLU_MXB_CLU0_SPIMOSI  7
#define CLU_MXB_CLU0_P0_2     8
#define CLU_MXB_CLU0_P0_4     9
#define CLU_MXB_CLU0_P0_6     10
#define CLU_MXB_CLU0_P2_11    11
#define CLU_MXB_CLU0_P0_11    12
#define CLU_MXB_CLU0_P0_13    13
#define CLU_MXB_CLU0_P0_15    14
#define CLU_MXB_CLU0_P2_7     15

#define CLU_MXB_CLU1_CLU0OUT  0
#define CLU_MXB_CLU1_CLU1OUT  1
#define CLU_MXB_CLU1_CLU2OUT  2
#define CLU_MXB_CLU1_CLU3OUT  3
#define CLU_MXB_CLU1_ADBUSY0  4
#define CLU_MXB_CLU1_CMP1_OUT 5
#define CLU_MXB_CLU1_PWM1     6
#define CLU_MXB_CLU1_SPIMISO  7
#define CLU_MXB_CLU1_P0_3     8
#define CLU_MXB_CLU1_P0_4     9
#define CLU_MXB_CLU1_P0_7     10
#define CLU_MXB_CLU1_P2_11    11
#define CLU_MXB_CLU1_P0_12    12
#define CLU_MXB_CLU1_P0_13    13
#define CLU_MXB_CLU1_P1_0     14
#define CLU_MXB_CLU1_P2_7     15

#define CLU_MXB_CLU2_CLU0OUT  0
#define CLU_MXB_CLU2_CLU1OUT  1
#define CLU_MXB_CLU2_CLU2OUT  2
#define CLU_MXB_CLU2_CLU3OUT  3
#define CLU_MXB_CLU2_PWM1     4
#define CLU_MXB_CLU2_PWM3     5
#define CLU_MXB_CLU2_I2CSDA   6
#define CLU_MXB_CLU2_SPICLK   7
#define CLU_MXB_CLU2_P3_9     8
#define CLU_MXB_CLU2_P1_14    9
#define CLU_MXB_CLU2_P2_0     10
#define CLU_MXB_CLU2_P1_11    11
#define CLU_MXB_CLU2_P2_3     12
#define CLU_MXB_CLU2_P2_5     13
#define CLU_MXB_CLU2_P2_13    14
#define CLU_MXB_CLU2_P2_15    15

#define CLU_MXB_CLU3_CLU0OUT  0
#define CLU_MXB_CLU3_CLU1OUT  1
#define CLU_MXB_CLU3_CLU2OUT  2
#define CLU_MXB_CLU3_CLU3OUT  3
#define CLU_MXB_CLU3_PWM0     4
#define CLU_MXB_CLU3_PWM2     5
#define CLU_MXB_CLU3_I2CSCL   6
#define CLU_MXB_CLU3_SPICSN   7
#define CLU_MXB_CLU3_P1_13    8
#define CLU_MXB_CLU3_P1_14    9
#define CLU_MXB_CLU3_P1_10    10
#define CLU_MXB_CLU3_P1_11    11
#define CLU_MXB_CLU3_P2_4     12
#define CLU_MXB_CLU3_P2_5     13
#define CLU_MXB_CLU3_P2_14    14
#define CLU_MXB_CLU3_P2_15    15

#define CLU_FN_0              0x0  ///< CLU真值表的最小相 0        注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_1              0xff ///< CLU真值表的最小相 1        注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A              0xf0 ///< CLU真值表的最小相 a        注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA           0x0f ///< CLU真值表的最小相 !a       注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_B              0xcc ///< CLU真值表的最小相 b        注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTB           0x33 ///< CLU真值表的最小相 !b       注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_C              0xaa ///< CLU真值表的最小相 c        注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTC           0x55 ///< CLU真值表的最小相 !c       注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_B            0xc0 ///< CLU真值表的最小相 a&b      注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_NOTB      0x03 ///< CLU真值表的最小相 !a&!b    注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_B         0x0c ///< CLU真值表的最小相 !a&b     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_NOTB         0x30 ///< CLU真值表的最小相 a&!b     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_C            0xa0 ///< CLU真值表的最小相 a&c      注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_NOTC      0x05 ///< CLU真值表的最小相 !a&!c    注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_C         0x0a ///< CLU真值表的最小相 !a&c     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_NOTC         0x50 ///< CLU真值表的最小相 a&!c     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_B_C            0x88 ///< CLU真值表的最小相 b&c      注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTB_NOTC      0x11 ///< CLU真值表的最小相 !b&!c    注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTB_C         0x22 ///< CLU真值表的最小相 !b&c     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_B_NOTC         0x44 ///< CLU真值表的最小相 b&!c     注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_NOTB_NOTC 0x01 ///< CLU真值表的最小相 !a&!b&!c 注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_NOTB_C    0x02 ///< CLU真值表的最小相 !a&!b&c  注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_B_NOTC    0x04 ///< CLU真值表的最小相 !a&b&!c  注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_NOTA_B_C       0x08 ///< CLU真值表的最小相 !a&b&c   注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_NOTB_NOTC    0x10 ///< CLU真值表的最小相 a&!b&!c  注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_NOTB_C       0x20 ///< CLU真值表的最小相 a&!b&c   注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_B_NOTC       0x40 ///< CLU真值表的最小相 a&b&!c   注意最小相之间只能用 | （C语言按位或）
#define CLU_FN_A_B_C          0x80 ///< CLU真值表的最小相 a&b&c    注意最小相之间只能用 | （C语言按位或）

void CLU_Init(CLU_TypeDef *CLUx, uint8_t CLU_MODEL_CLUx, CLU_InitTypeDef *CLU_InitStruct);
void CLU_StructInit(CLU_InitTypeDef *CLU_InitStruct);

void CLU_Enable(CLU_TypeDef *CLUx);
void CLU_Disable(CLU_TypeDef *CLUx);

uint8_t CLU_ReadOutVolue(CLU_TypeDef *CLUx, uint8_t CLU_MODEL_CLUx);
#endif /*__LKS32MC08x_CLU_H */
