1 /******************************************************************************************************************************************
2 * 文件名称: SWM341_uart.c
3 * 功能说明: SWM341单片机的UART串口功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项: 没有编写LIN功能相关的函数
6 * 版本日期: V1.0.0      2016年1月30日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM341.h"
22 #include "SWM341_uart.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: UART_Init()
27 * 功能说明: UART串口初始化
28 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
29 *           UART_InitStructure * initStruct    包含UART串口相关设定值的结构体
30 * 输    出: 无
31 * 注意事项: 无
32 ******************************************************************************************************************************************/
UART_Init(UART_TypeDef * UARTx,UART_InitStructure * initStruct)33 void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
34 {
35     switch((uint32_t)UARTx)
36     {
37     case ((uint32_t)UART0):
38         SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_UART0_Pos);
39         break;
40 
41     case ((uint32_t)UART1):
42         SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_UART1_Pos);
43         break;
44 
45     case ((uint32_t)UART2):
46         SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_UART2_Pos);
47         break;
48 
49     case ((uint32_t)UART3):
50         SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_UART3_Pos);
51         break;
52     }
53 
54     UART_Close(UARTx);  //一些关键寄存器只能在串口关闭时设置
55 
56     UARTx->BAUD &= ~(UART_BAUD_BAUD_Msk | UART_BAUD_FRAC_Msk);
57     UARTx->BAUD |= (((SystemCoreClock/initStruct->Baudrate - 1) / 16) << UART_BAUD_BAUD_Pos) |
58                    (((SystemCoreClock/initStruct->Baudrate - 1) % 16) << UART_BAUD_FRAC_Pos);
59 
60     UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
61     UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
62                    (initStruct->Parity   << UART_CTRL_PARITY_Pos) |
63                    (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
64 
65     UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
66     UARTx->FIFO |= (initStruct->RXThreshold << UART_FIFO_RXTHR_Pos) |
67                    (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
68 
69     UARTx->TOCR &= ~UART_TOCR_TIME_Msk;
70     UARTx->TOCR |= (1 << UART_TOCR_MODE_Pos) |
71                    (initStruct->TimeoutTime << UART_TOCR_TIME_Pos);
72 
73     UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
74     UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
75                    (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
76                    (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
77 
78     switch((uint32_t)UARTx)
79     {
80     case ((uint32_t)UART0):
81         if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
82         {
83             NVIC_EnableIRQ(UART0_IRQn);
84         }
85         else
86         {
87             NVIC_DisableIRQ(UART0_IRQn);
88         }
89         break;
90 
91     case ((uint32_t)UART1):
92         if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
93         {
94             NVIC_EnableIRQ(UART1_IRQn);
95         }
96         else
97         {
98             NVIC_DisableIRQ(UART1_IRQn);
99         }
100         break;
101 
102     case ((uint32_t)UART2):
103         if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
104         {
105             NVIC_EnableIRQ(UART2_IRQn);
106         }
107         else
108         {
109             NVIC_DisableIRQ(UART2_IRQn);
110         }
111         break;
112 
113     case ((uint32_t)UART3):
114         if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
115         {
116             NVIC_EnableIRQ(UART3_IRQn);
117         }
118         else
119         {
120             NVIC_DisableIRQ(UART3_IRQn);
121         }
122         break;
123     }
124 }
125 
126 /******************************************************************************************************************************************
127 * 函数名称: UART_Open()
128 * 功能说明: UART串口打开
129 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
130 * 输    出: 无
131 * 注意事项: 无
132 ******************************************************************************************************************************************/
UART_Open(UART_TypeDef * UARTx)133 void UART_Open(UART_TypeDef * UARTx)
134 {
135     UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
136 }
137 
138 /******************************************************************************************************************************************
139 * 函数名称: UART_Close()
140 * 功能说明: UART串口关闭
141 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
142 * 输    出: 无
143 * 注意事项: 无
144 ******************************************************************************************************************************************/
UART_Close(UART_TypeDef * UARTx)145 void UART_Close(UART_TypeDef * UARTx)
146 {
147     UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
148 }
149 
150 /******************************************************************************************************************************************
151 * 函数名称: UART_WriteByte()
152 * 功能说明: 发送一个字节数据
153 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
154 *           uint8_t data            要发送的字节
155 * 输    出: 无
156 * 注意事项: 无
157 ******************************************************************************************************************************************/
UART_WriteByte(UART_TypeDef * UARTx,uint8_t data)158 void UART_WriteByte(UART_TypeDef * UARTx, uint8_t data)
159 {
160     UARTx->DATA = data;
161 }
162 
163 /******************************************************************************************************************************************
164 * 函数名称: UART_ReadByte()
165 * 功能说明: 读取一个字节数据,并指出数据是否Valid
166 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
167 *           uint32_t * data         接收到的数据
168 * 输    出: uint32_t              0 无错误    UART_ERR_PARITY 奇偶校验错误
169 * 注意事项: 无
170 ******************************************************************************************************************************************/
UART_ReadByte(UART_TypeDef * UARTx,uint32_t * data)171 uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
172 {
173     uint32_t reg = UARTx->DATA;
174 
175     *data = (reg & UART_DATA_DATA_Msk);
176 
177     if(reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
178 
179     return 0;
180 }
181 
182 /******************************************************************************************************************************************
183 * 函数名称: UART_IsTXBusy()
184 * 功能说明: UART是否正在发送数据
185 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
186 * 输    出: uint32_t              1 UART正在发送数据    0 数据已发完
187 * 注意事项: 无
188 ******************************************************************************************************************************************/
UART_IsTXBusy(UART_TypeDef * UARTx)189 uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
190 {
191     return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
192 }
193 
194 /******************************************************************************************************************************************
195 * 函数名称: UART_IsRXFIFOEmpty()
196 * 功能说明: 接收FIFO是否为空,如果不空则说明其中有数据可以读取
197 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
198 * 输    出: uint32_t              1 接收FIFO空    0 接收FIFO非空
199 * 注意事项: 无
200 ******************************************************************************************************************************************/
UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)201 uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
202 {
203     return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
204 }
205 
206 /******************************************************************************************************************************************
207 * 函数名称: UART_IsTXFIFOFull()
208 * 功能说明: 发送FIFO是否为满,如果不满则可以继续向其中写入数据
209 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
210 * 输    出: uint32_t              1 发送FIFO满    0 发送FIFO不满
211 * 注意事项: 无
212 ******************************************************************************************************************************************/
UART_IsTXFIFOFull(UART_TypeDef * UARTx)213 uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
214 {
215     return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
216 }
217 
218 /******************************************************************************************************************************************
219 * 函数名称: UART_SetBaudrate()
220 * 功能说明: 设置波特率
221 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
222 *           uint32_t baudrate       要设置的波特率
223 * 输    出: 无
224 * 注意事项: 不要在串口工作时更改波特率,使用此函数前请先调用UART_Close()关闭串口
225 ******************************************************************************************************************************************/
UART_SetBaudrate(UART_TypeDef * UARTx,uint32_t baudrate)226 void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
227 {
228     UARTx->BAUD &= ~(UART_BAUD_BAUD_Msk | UART_BAUD_FRAC_Msk);
229     UARTx->BAUD |= (((SystemCoreClock/baudrate - 1) / 16) << UART_BAUD_BAUD_Pos) |
230                    (((SystemCoreClock/baudrate - 1) % 16) << UART_BAUD_FRAC_Pos);
231 }
232 
233 /******************************************************************************************************************************************
234 * 函数名称: UART_GetBaudrate()
235 * 功能说明: 查询波特率
236 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
237 * 输    出: uint32_t              当前波特率
238 * 注意事项: 无
239 ******************************************************************************************************************************************/
UART_GetBaudrate(UART_TypeDef * UARTx)240 uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
241 {
242     return SystemCoreClock/(((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) * 16 +
243                             ((UARTx->BAUD & UART_BAUD_FRAC_Msk) >> UART_BAUD_FRAC_Pos) + 1);
244 }
245 
246 /******************************************************************************************************************************************
247 * 函数名称: UART_CTSConfig()
248 * 功能说明: UART CTS流控配置
249 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
250 *           uint32_t enable         1 使能CTS流控    0 禁止CTS流控
251 *           uint32_t polarity       0 CTS输入为低表示可以发送数据    1 CTS输入为高表示可以发送数据
252 * 输    出: 无
253 * 注意事项: 无
254 ******************************************************************************************************************************************/
UART_CTSConfig(UART_TypeDef * UARTx,uint32_t enable,uint32_t polarity)255 void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
256 {
257     UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
258     UARTx->CTSCR |= (enable   << UART_CTSCR_EN_Pos) |
259                     (polarity << UART_CTSCR_POL_Pos);
260 }
261 
262 /******************************************************************************************************************************************
263 * 函数名称: UART_CTSLineState()
264 * 功能说明: UART CTS线当前状态
265 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
266 * 输    出: uint32_t              0 CTS线当前为低电平    1 CTS线当前为高电平
267 * 注意事项: 无
268 ******************************************************************************************************************************************/
UART_CTSLineState(UART_TypeDef * UARTx)269 uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
270 {
271     return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
272 }
273 
274 /******************************************************************************************************************************************
275 * 函数名称: UART_RTSConfig()
276 * 功能说明: UART RTS流控配置
277 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
278 *           uint32_t enable         1 使能RTS流控    0 禁止RTS流控
279 *           uint32_t polarity       0 RTS输出低表示可以接收数据    1 RTS输出高表示可以接收数据
280 *           uint32_t threshold      RTS流控的触发阈值,可取值UART_RTS_1BYTE、UART_RTS_2BYTE、UART_RTS_4BYTE、UART_RTS_6BYTE
281 * 输    出: 无
282 * 注意事项: 无
283 ******************************************************************************************************************************************/
UART_RTSConfig(UART_TypeDef * UARTx,uint32_t enable,uint32_t polarity,uint32_t threshold)284 void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
285 {
286     UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
287     UARTx->RTSCR |= (enable    << UART_RTSCR_EN_Pos)  |
288                     (polarity  << UART_RTSCR_POL_Pos) |
289                     (threshold << UART_RTSCR_THR_Pos);
290 }
291 
292 /******************************************************************************************************************************************
293 * 函数名称: UART_RTSLineState()
294 * 功能说明: UART RTS线当前状态
295 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
296 * 输    出: uint32_t              0 RTS线当前为低电平    1 RTS线当前为高电平
297 * 注意事项: 无
298 ******************************************************************************************************************************************/
UART_RTSLineState(UART_TypeDef * UARTx)299 uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
300 {
301     return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
302 }
303 
304 /******************************************************************************************************************************************
305 * 函数名称: UART_LINConfig()
306 * 功能说明: UART LIN功能配置
307 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
308 *           uint32_t detectedLen    检测到Break需要的低电平长度(位数),取值1--16
309 *           uint32_t detectedIEn    检测到Break中断使能
310 *           uint32_t generatedLen   Break发送低电平长度,取值1--15
311 *           uint32_t generatedIEn   Break发送完成中断使能
312 * 输    出: 无
313 * 注意事项: 无
314 ******************************************************************************************************************************************/
UART_LINConfig(UART_TypeDef * UARTx,uint32_t detectedLen,uint32_t detectedIEn,uint32_t generatedLen,uint32_t generatedIEn)315 void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedLen, uint32_t detectedIEn, uint32_t generatedLen, uint32_t generatedIEn)
316 {
317     UARTx->CFG &= ~(UART_CFG_BRKTXLEN_Msk | UART_CFG_BRKRXLEN_Msk);
318     UARTx->CFG |= ((detectedLen-1) << UART_CFG_BRKRXLEN_Pos) |
319                   (generatedLen    << UART_CFG_BRKTXLEN_Pos);
320     UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
321     UARTx->LINCR |= (detectedIEn  << UART_LINCR_BRKDETIE_Pos) |
322                     (generatedIEn << UART_LINCR_GENBRKIE_Pos);
323 }
324 
325 /******************************************************************************************************************************************
326 * 函数名称: UART_LINGenerate()
327 * 功能说明: UART LIN产生/发送Break
328 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
329 * 输    出: 无
330 * 注意事项: 无
331 ******************************************************************************************************************************************/
UART_LINGenerate(UART_TypeDef * UARTx)332 void UART_LINGenerate(UART_TypeDef * UARTx)
333 {
334     UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
335 }
336 
337 /******************************************************************************************************************************************
338 * 函数名称: UART_LINIsDetected()
339 * 功能说明: UART LIN是否检测到Break
340 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
341 * 输    出: uint32_t              1 检测到LIN Break    0 未检测到LIN Break
342 * 注意事项: 无
343 ******************************************************************************************************************************************/
UART_LINIsDetected(UART_TypeDef * UARTx)344 uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
345 {
346     return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
347 }
348 
349 /******************************************************************************************************************************************
350 * 函数名称: UART_LINIsGenerated()
351 * 功能说明: UART LIN Break是否发送完成
352 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
353 * 输    出: uint32_t              1 LIN Break 发送完成    0 LIN Break发送未完成
354 * 注意事项: 无
355 ******************************************************************************************************************************************/
UART_LINIsGenerated(UART_TypeDef * UARTx)356 uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
357 {
358     return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
359 }
360 
361 /******************************************************************************************************************************************
362 * 函数名称: UART_ABRStart()
363 * 功能说明: UART 自动波特率检测开始
364 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
365 *           uint32_t detectChar     用于自动检测、计算波特率的检测字符
366 *                                   8位数据时可取值:0xFF、0xFE、0xF8、0x80,分别表示发送方必须发送0xFF、0xFE、0xF8、0x80
367 *                                   9位数据时可取值:0x1FF、0x1FE、0x1F8、0x180,分别表示发送方必须发送0x1FF、0x1FE、0x1F8、0x180
368 * 输    出: 无
369 * 注意事项: 自动波特率检测时不能开启奇偶校验
370 ******************************************************************************************************************************************/
UART_ABRStart(UART_TypeDef * UARTx,uint32_t detectChar)371 void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
372 {
373     uint32_t bits = 0;
374 
375     if((detectChar == 0xFF) || (detectChar == 0x1FF))      bits = 0;
376     else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
377     else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
378     else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
379     else while(1);
380 
381     UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
382     UARTx->BAUD |= (1    << UART_BAUD_ABREN_Pos) |
383                    (bits << UART_BAUD_ABRBIT_Pos);
384 }
385 
386 /******************************************************************************************************************************************
387 * 函数名称: UART_ABRIsDone()
388 * 功能说明: UART 自动波特率是否完成
389 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
390 * 输    出: uint32_t              0 未完成    UART_ABR_RES_OK 已完成,且成功    UART_ABR_RES_ERR 已完成,但失败、出错
391 * 注意事项: 无
392 ******************************************************************************************************************************************/
UART_ABRIsDone(UART_TypeDef * UARTx)393 uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
394 {
395     if(UARTx->BAUD & UART_BAUD_ABREN_Msk)
396     {
397         return 0;
398     }
399     else if(UARTx->BAUD & UART_BAUD_ABRERR_Msk)
400     {
401         return UART_ABR_RES_ERR;
402     }
403     else
404     {
405         return UART_ABR_RES_OK;
406     }
407 }
408 
409 /******************************************************************************************************************************************
410 * 函数名称: UART_INTEn()
411 * 功能说明: 中断使能
412 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
413 *           uint32_t it             interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
414 * 输    出: 无
415 * 注意事项: 无
416 ******************************************************************************************************************************************/
UART_INTEn(UART_TypeDef * UARTx,uint32_t it)417 void UART_INTEn(UART_TypeDef * UARTx, uint32_t it)
418 {
419     UARTx->CTRL |= it;
420 }
421 
422 /******************************************************************************************************************************************
423 * 函数名称: UART_INTDis()
424 * 功能说明: 中断禁止
425 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
426 *           uint32_t it             interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
427 * 输    出: 无
428 * 注意事项: 无
429 ******************************************************************************************************************************************/
UART_INTDis(UART_TypeDef * UARTx,uint32_t it)430 void UART_INTDis(UART_TypeDef * UARTx, uint32_t it)
431 {
432     UARTx->CTRL &= ~it;
433 }
434 
435 /******************************************************************************************************************************************
436 * 函数名称: UART_INTClr()
437 * 功能说明: 中断标志清除
438 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
439 *           uint32_t it             interrupt type,有效值有 UART_IT_RX_TOUT
440 * 输    出: 无
441 * 注意事项: 无
442 ******************************************************************************************************************************************/
UART_INTClr(UART_TypeDef * UARTx,uint32_t it)443 void UART_INTClr(UART_TypeDef * UARTx, uint32_t it)
444 {
445     if(it & UART_IT_RX_TOUT)
446         UARTx->TOCR |= UART_TOCR_IFCLR_Msk;
447 }
448 
449 /******************************************************************************************************************************************
450 * 函数名称: UART_INTStat()
451 * 功能说明: 中断状态查询
452 * 输    入: UART_TypeDef * UARTx  指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
453 *           uint32_t it             interrupt type,有效值有 UART_IT_RX_THR、UART_IT_RX_TOUT、UART_IT_TX_THR、UART_IT_TX_DONE 及其“或”
454 * 输    出: uint32_t              1 中断已发生    0 中断未发生
455 * 注意事项: 无
456 ******************************************************************************************************************************************/
UART_INTStat(UART_TypeDef * UARTx,uint32_t it)457 uint32_t UART_INTStat(UART_TypeDef * UARTx, uint32_t it)
458 {
459     return (((it & UART_IT_RX_THR)  && (UARTx->BAUD & UART_BAUD_RXIF_Msk)) ||
460             ((it & UART_IT_RX_TOUT) && (UARTx->BAUD & UART_BAUD_TOIF_Msk)) ||
461             ((it & UART_IT_TX_THR)  && (UARTx->BAUD & UART_BAUD_TXIF_Msk)) ||
462             ((it & UART_IT_TX_DONE) && (UARTx->BAUD & UART_BAUD_TXDOIF_Msk)));
463 }
464