1 /**
2   ******************************************************************************
3   * @file    lib_u32k.h
4   * @author  Application Team
5   * @version V1.1.0
6   * @date    2019-10-28
7   * @brief   UART 32K library.
8   ******************************************************************************
9   * @attention
10   *
11   ******************************************************************************
12   */
13 #ifndef __LIB_U32K_H
14 #define __LIB_U32K_H
15 
16 #ifdef __cplusplus
17  extern "C" {
18 #endif
19 
20 #include "target.h"
21 
22 typedef struct
23 {
24   uint32_t Debsel;
25   uint32_t Parity;
26   uint32_t FirstBit;
27   uint32_t AutoCal;
28   uint32_t Baudrate;
29   uint32_t LineSel;
30 } U32K_InitType;
31 
32 /**************  Bits definition for U32Kx_CTRL0 register    ******************/
33 #define U32K_CTRL0_PMODE_EVEN         (0x0U << U32K_CTRL0_PMODE_Pos)           /*!< 0x00000000 */
34 #define U32K_CTRL0_PMODE_ODD          (0x1U << U32K_CTRL0_PMODE_Pos)           /*!< 0x00000010 */
35 #define U32K_CTRL0_PMODE_0            (0x2U << U32K_CTRL0_PMODE_Pos)           /*!< 0x00000020 */
36 #define U32K_CTRL0_PMODE_1            (0x3U << U32K_CTRL0_PMODE_Pos)           /*!< 0x00000030 */
37 #define U32K_CTRL0_DEBSEL_0           (0x0U << U32K_CTRL0_DEBSEL_Pos)          /*!< 0x00000000 */
38 #define U32K_CTRL0_DEBSEL_1           (0x1U << U32K_CTRL0_DEBSEL_Pos)          /*!< 0x00000040 */
39 #define U32K_CTRL0_DEBSEL_2           (0x2U << U32K_CTRL0_DEBSEL_Pos)          /*!< 0x00000080 */
40 #define U32K_CTRL0_DEBSEL_3           (0x3U << U32K_CTRL0_DEBSEL_Pos)          /*!< 0x000000C0 */
41 
42 /**************  Bits definition for U32Kx_CTRL1 register    ******************/
43 #define U32K_CTRL1_RXSEL_RX0          (0x0U << U32K_CTRL1_RXSEL_Pos)           /*!< 0x00000000 */
44 #define U32K_CTRL1_RXSEL_RX1          (0x1U << U32K_CTRL1_RXSEL_Pos)           /*!< 0x00000010 */
45 #define U32K_CTRL1_RXSEL_RX2          (0x2U << U32K_CTRL1_RXSEL_Pos)           /*!< 0x00000020 */
46 #define U32K_CTRL1_RXSEL_RX3          (0x3U << U32K_CTRL1_RXSEL_Pos)           /*!< 0x00000030 */
47 //Debsel
48 #define U32K_DEBSEL_0   (0x0U << U32K_CTRL0_DEBSEL_Pos)
49 #define U32K_DEBSEL_1   (0x1U << U32K_CTRL0_DEBSEL_Pos)
50 #define U32K_DEBSEL_2   (0x2U << U32K_CTRL0_DEBSEL_Pos)
51 #define U32K_DEBSEL_3   (0x3U << U32K_CTRL0_DEBSEL_Pos)
52 //Parity
53 #define U32K_PARITY_EVEN    (0x1U << U32K_CTRL0_PMODE_Pos)
54 #define U32K_PARITY_ODD     (0x3U << U32K_CTRL0_PMODE_Pos)
55 #define U32K_PARITY_0       (0x5U << U32K_CTRL0_PMODE_Pos)
56 #define U32K_PARITY_1       (0x7U << U32K_CTRL0_PMODE_Pos)
57 #define U32K_PARITY_NONE    (0x0U << U32K_CTRL0_PMODE_Pos)
58 //FirstBit
59 #define U32K_FIRSTBIT_LSB   0
60 #define U32K_FIRSTBIT_MSB   (0x1U << U32K_CTRL0_MSB_Pos)
61 //AutoCal
62 #define U32K_AUTOCAL_ON     0
63 #define U32K_AUTOCAL_OFF    (0x1U << U32K_CTRL0_ACOFF_Pos)
64 //Line
65 #define U32K_LINE_RX0       (0x0U << U32K_CTRL1_RXSEL_Pos)
66 #define U32K_LINE_RX1       (0x1U << U32K_CTRL1_RXSEL_Pos)
67 #define U32K_LINE_RX2       (0x2U << U32K_CTRL1_RXSEL_Pos)
68 #define U32K_LINE_RX3       (0x3U << U32K_CTRL1_RXSEL_Pos)
69 
70 //INT
71 #define U32K_INT_RXOV       (0x1U << U32K_CTRL1_RXOVIE_Pos)
72 #define U32K_INT_RXPE       (0x1U << U32K_CTRL1_RXPEIE_Pos)
73 #define U32K_INT_RX         (0x1U << U32K_CTRL1_RXIE_Pos)
74 #define U32K_INT_Msk        (U32K_INT_RXOV \
75                             |U32K_INT_RXPE \
76                             |U32K_INT_RX)
77 
78 //INT Status
79 #define U32K_INTSTS_RXOV       (0x1U << U32K_STS_RXOV_Pos)
80 #define U32K_INTSTS_RXPE       (0x1U << U32K_STS_RXPE_Pos)
81 #define U32K_INTSTS_RX         (0x1U << U32K_STS_RXIF_Pos)
82 #define U32K_INTSTS_Msk        (U32K_INTSTS_RXOV \
83                                |U32K_INTSTS_RXPE \
84                                |U32K_INTSTS_RX)
85 
86 //WKUMode
87 #define U32K_WKUMOD_RX  0                                // Wake-up when receive data
88 #define U32K_WKUMOD_PC  (0x1U << U32K_CTRL0_WKUMODE_Pos) // Wake-up when receive data and parity/stop bit correct
89 
90 
91 /****************************** U32K Instances ********************************/
92 #define IS_U32K_ALL_INSTANCE(INSTANCE) (((INSTANCE) == U32K0) || \
93                                         ((INSTANCE) == U32K1))
94 
95 /* Private macros ------------------------------------------------------------*/
96 #define IS_U32K_DEBSEL(__DEBSEL__)  (((__DEBSEL__) == U32K_DEBSEL_0) ||\
97                                      ((__DEBSEL__) == U32K_DEBSEL_1) ||\
98                                      ((__DEBSEL__) == U32K_DEBSEL_2) ||\
99                                      ((__DEBSEL__) == U32K_DEBSEL_3))
100 
101 #define IS_U32K_PARITY(__PARITY__)  (((__PARITY__) == U32K_PARITY_EVEN) ||\
102                                      ((__PARITY__) == U32K_PARITY_ODD)  ||\
103                                      ((__PARITY__) == U32K_PARITY_0)    ||\
104                                      ((__PARITY__) == U32K_PARITY_1)    ||\
105                                      ((__PARITY__) == U32K_PARITY_NONE))
106 
107 #define IS_U32K_WORDLEN(__WORDLEN__)  (((__WORDLEN__) == U32K_WORDLEN_8B) || ((__WORDLEN__) == U32K_WORDLEN_9B))
108 
109 #define IS_U32K_FIRSTBIT(__FIRSTBIT__)  (((__FIRSTBIT__) == U32K_FIRSTBIT_LSB) || ((__FIRSTBIT__) == U32K_FIRSTBIT_MSB))
110 
111 #define IS_U32K_AUTOCAL(__AUTOCAL__)  (((__AUTOCAL__) == U32K_AUTOCAL_ON) || ((__AUTOCAL__) == U32K_AUTOCAL_OFF))
112 
113 #define IS_U32K_LINE(__LINE__)  (((__LINE__) == U32K_LINE_RX0) ||\
114                                  ((__LINE__) == U32K_LINE_RX1) ||\
115                                  ((__LINE__) == U32K_LINE_RX2) ||\
116                                  ((__LINE__) == U32K_LINE_RX3))
117 
118 #define IS_U32K_BAUDRATE(__BAUDRATE__)  ((300UL <= (__BAUDRATE__)) &&\
119                                         ((__BAUDRATE__) <= 14400UL))
120 
121 #define IS_U32K_INT(__INT__)  ((((__INT__) & U32K_INT_Msk) != 0U) &&\
122                                (((__INT__) & ~U32K_INT_Msk) == 0U))
123 
124 #define IS_U32K_INTFLAGR(__INTFLAGR__)  (((__INTFLAGR__) == U32K_INTSTS_RXOV) ||\
125                                          ((__INTFLAGR__) == U32K_INTSTS_RXPE) ||\
126                                          ((__INTFLAGR__) == U32K_INTSTS_RX))
127 
128 #define IS_U32K_INTFLAGC(__INTFLAGC__)  ((((__INTFLAGC__) & U32K_INTSTS_Msk) != 0U) &&\
129                                          (((__INTFLAGC__) & ~U32K_INTSTS_Msk) == 0U))
130 
131 #define IS_U32K_WKUMODE(__WKUMODE__)  (((__WKUMODE__) == U32K_WKUMOD_RX) || ((__WKUMODE__) == U32K_WKUMOD_PC))
132 
133 /* Exported Functions ------------------------------------------------------- */
134 /* U32K Exported Functions Group1:
135                                    (De)Initialization  -----------------------*/
136 void U32K_DeInit(U32K_Type *U32Kx);
137 void U32K_Init(U32K_Type *U32Kx, U32K_InitType *InitStruct);
138 void U32K_StructInit(U32K_InitType *InitStruct);
139 /* U32K Exported Functions Group2:
140                                    Interrupt (flag) configure  ---------------*/
141 void U32K_INTConfig(U32K_Type *U32Kx, uint32_t INTMask, uint8_t NewState);
142 uint8_t U32K_GetINTStatus(U32K_Type *U32Kx, uint32_t INTMask);
143 void U32K_ClearINTStatus(U32K_Type *U32Kx, uint32_t INTMask);
144 /* U32K Exported Functions Group3:
145                                    Receive datas -----------------------------*/
146 uint8_t U32K_ReceiveData(U32K_Type *U32Kx);
147 /* U32K Exported Functions Group4:
148                                    MISC Configuration -------- ---------------*/
149 void U32K_BaudrateConfig(U32K_Type *U32Kx, uint32_t BaudRate);
150 void U32K_Cmd(U32K_Type *U32Kx, uint32_t NewState);
151 void U32K_LineConfig(U32K_Type *U32Kx, uint32_t Line);
152 void U32K_WKUModeConfig(U32K_Type *U32Kx, uint32_t WKUMode);
153 
154 #ifdef __cplusplus
155 }
156 #endif
157 
158 #endif  /* __LIB_U32K_H */
159 
160 /*********************************** END OF FILE ******************************/
161