1 /*************************************************************************************
2 * Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd ("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42 /******************************************************************************/
43 /** \file uart.c
44 **
45 ** UART function driver API.
46 ** @link SampleGroup Some description @endlink
47 **
48 ** - 2017-05-17 1.0 CJ First version for Device Driver Library of Module.
49 **
50 ******************************************************************************/
51
52 /******************************************************************************/
53 /* Include files */
54 /******************************************************************************/
55 #include "uart.h"
56 /**
57 ******************************************************************************
58 ** \addtogroup UartGroup
59 ******************************************************************************/
60 //@{
61 /******************************************************************************/
62 /* Local pre-processor symbols/macros ('#define') */
63 /******************************************************************************/
64
65 #define IS_VALID_CH(x) ((UARTCH0 == (x)) ||\
66 (UARTCH1 == (x)))
67
68 #define IS_VALID_IRQSEL(x) ((UartTxIrq == (x)) ||\
69 (UartRxIrq == (x)) ||\
70 (UartFEIrq == (x)) ||\
71 (UartCtsIrq == (x))||\
72 (UartPEIrq == (x)) ||\
73 (UartTxEIrq == (x)))
74
75 #define IS_VALID_MODE(x) ((UartMode0==(x))||\
76 (UartMode1==(x))||\
77 (UartMode2==(x))||\
78 (UartMode3==(x)))
79
80 #define IS_VALID_STATUS(x) ((UartCts == (x))||\
81 (UartRC == (x))||\
82 (UartTC == (x))||\
83 (UartPE == (x))||\
84 (UartCtsIf == (x))||\
85 (UartTxe == (x))||\
86 (UartFE == (x)))
87 /******************************************************************************/
88 /* Local function prototypes ('static') */
89 /******************************************************************************/
90 static stc_uart_instance_data_t* UartGetInternDataPtr(uint8_t u8Idx);
91 static void UartInitNvic(uint8_t u8Idx);
92 static void UartDeInitNvic(uint8_t u8Idx);
93 /******************************************************************************/
94 /* Local variable definitions ('static') */
95 /******************************************************************************/
96 static stc_uart_instance_data_t m_astcUartInstanceDataLut[] =
97 {
98 {
99 UARTCH0,
100 M0P_UART0, /* pstcInstance */
101 {NULL,NULL,NULL,NULL,NULL},
102 },
103 {
104 UARTCH1,
105 M0P_UART1, /* pstcInstance */
106 {NULL,NULL,NULL,NULL,NULL},
107 },
108 };
109 /**
110 ******************************************************************************
111 ** \brief UART0/1通道 相关地址获取
112 **
113 ** \param [in] u8Idx通道号
114 **
115 ** \retval 通道对应的地址结构
116 **
117 ******************************************************************************/
UartGetInternDataPtr(uint8_t u8Idx)118 static stc_uart_instance_data_t* UartGetInternDataPtr(uint8_t u8Idx)
119 {
120 stc_uart_instance_data_t* pstcData = NULL;
121 uint8_t u8i = 0;
122 for (u8i = 0; u8i < ARRAY_SZ(m_astcUartInstanceDataLut); u8i++)
123 {
124 if (u8Idx == m_astcUartInstanceDataLut[u8i].u32Idx)
125 {
126 pstcData = &m_astcUartInstanceDataLut[u8i];
127 break;
128 }
129 }
130
131 return (pstcData);
132 }
133 /**
134 ******************************************************************************
135 ** \brief UART通信中断使能函数设置
136 **
137 ** \param [in] u8Idx通道号,enIrqSel发送or接收中断使能
138 **
139 ** \retval OK配置成功
140 **\retval ErrorInvalidParameter配置失败
141 ******************************************************************************/
Uart_EnableIrq(uint8_t u8Idx,en_uart_irq_sel_t enIrqSel)142 en_result_t Uart_EnableIrq(uint8_t u8Idx,
143 en_uart_irq_sel_t enIrqSel)
144 {
145 stc_uart_instance_data_t* pstcData = NULL;
146 ASSERT(IS_VALID_CH(u8Idx));
147 ASSERT(IS_VALID_IRQSEL(enIrqSel));
148 pstcData = UartGetInternDataPtr(u8Idx);
149 if (NULL == pstcData)
150 {
151 return ErrorInvalidParameter;
152 }
153 switch(enIrqSel)
154 {
155 case UartTxIrq:
156 pstcData->pstcInstance->SCON_f.TCIE = 1u;
157 break;
158 case UartRxIrq:
159 pstcData->pstcInstance->SCON_f.RCIE = 1u;
160 break;
161 case UartFEIrq:
162 pstcData->pstcInstance->SCON_f.FEIE = 1u;
163 break;
164 case UartCtsIrq:
165 pstcData->pstcInstance->SCON_f.CTSIE = 1u;
166 break;
167 case UartPEIrq:
168 pstcData->pstcInstance->SCON_f.PEIE = 1u;
169 break;
170 case UartTxEIrq:
171 pstcData->pstcInstance->SCON_f.TXEIE = 1u;
172 break;
173 default:
174 return (ErrorInvalidParameter);
175 }
176 return Ok;
177 }
178 /**
179 ******************************************************************************
180 ** \brief UART通信中断禁止函数设置
181 **
182 ** \param [in] u8Idx通道号,enIrqSel发送or接收中断禁止
183 **
184 ** \retval OK配置成功
185 **\retval ErrorInvalidParameter配置失败
186 ******************************************************************************/
Uart_DisableIrq(uint8_t u8Idx,en_uart_irq_sel_t enIrqSel)187 en_result_t Uart_DisableIrq(uint8_t u8Idx,
188 en_uart_irq_sel_t enIrqSel)
189 {
190 stc_uart_instance_data_t *pstcData = NULL;
191
192 ASSERT(IS_VALID_CH(u8Idx));
193 ASSERT(IS_VALID_IRQSEL(enIrqSel));
194
195 pstcData = UartGetInternDataPtr(u8Idx);
196 if (NULL == pstcData)
197 {
198 return ErrorInvalidParameter;
199 }
200 switch(enIrqSel)
201 {
202 case UartTxIrq:
203 pstcData->pstcInstance->SCON_f.TCIE = 0u;
204 break;
205 case UartRxIrq:
206 pstcData->pstcInstance->SCON_f.RCIE = 0u;
207 break;
208 case UartFEIrq:
209 pstcData->pstcInstance->SCON_f.FEIE = 0u;
210 break;
211 case UartCtsIrq:
212 pstcData->pstcInstance->SCON_f.CTSIE = 0u;
213 break;
214 case UartPEIrq:
215 pstcData->pstcInstance->SCON_f.PEIE = 0u;
216 break;
217 case UartTxEIrq:
218 pstcData->pstcInstance->SCON_f.TXEIE = 0u;
219 break;
220 default:
221 return (ErrorInvalidParameter);
222 }
223
224 return Ok;
225 }
226 /**
227 ******************************************************************************
228 ** \brief UART通道4种模式配置
229 **
230 ** \param [in] u8Idx通道号,mode哪种模式
231 **
232 ** \retval OK配置成功
233 **\retval ErrorInvalidParameter配置失败
234 ******************************************************************************/
Uart_SetMode(uint8_t u8Idx,en_uart_mode_t enMode)235 en_result_t Uart_SetMode(uint8_t u8Idx,en_uart_mode_t enMode)
236 {
237 stc_uart_instance_data_t *pstcData = NULL;
238 ASSERT(IS_VALID_CH(u8Idx));
239 ASSERT(IS_VALID_MODE(enMode));
240 pstcData = UartGetInternDataPtr(u8Idx);
241 if (NULL == pstcData)
242 {
243 return ErrorInvalidParameter;
244 }
245 pstcData->pstcInstance->SCON_f.SM = enMode;
246 return Ok;
247 }
248 /**
249 ******************************************************************************
250 ** \brief UART通道多主机模式配置
251 **
252 ** \param [in] u8Idx通道号,stcMultiConfig多主机模式结构
253 **
254 ** \retval OK配置成功
255 **\retval ErrorInvalidParameter配置失败
256 ******************************************************************************/
Uart_SetMultiMode(uint8_t u8Idx,stc_uart_multimode_t * pstcMultiConfig)257 en_result_t Uart_SetMultiMode(uint8_t u8Idx,stc_uart_multimode_t* pstcMultiConfig)
258 {
259 stc_uart_instance_data_t *pstcData = NULL;
260 ASSERT(IS_VALID_CH(u8Idx));
261 pstcData = UartGetInternDataPtr(u8Idx);
262 if (NULL == pstcData)
263 {
264 return ErrorInvalidParameter;
265 }
266 if(NULL != pstcMultiConfig)
267 {
268 pstcData->pstcInstance->SCON_f.ADRDET = pstcMultiConfig->enMulti_mode;
269 if(pstcMultiConfig->enMulti_mode == UartMulti)
270 {
271 pstcData->pstcInstance->SADDR = pstcMultiConfig->u8SlaveAddr;
272 pstcData->pstcInstance->SADEN = pstcMultiConfig->u8SaddEn;
273 }
274 }
275 return Ok;
276 }
277 /**
278 ******************************************************************************
279 ** \brief UART通道多主机模式发送数据/地址帧或者奇偶校验配置TB8
280 **
281 ** \param [in] u8Idx通道号,tb8数据or地址帧或者奇偶校验
282 **
283 ** \retval OK配置成功
284 **\retval ErrorInvalidParameter配置失败
285 ******************************************************************************/
Uart_SetMMDOrCk(uint8_t u8Idx,en_uart_mmdorck_t enTb8)286 en_result_t Uart_SetMMDOrCk(uint8_t u8Idx,en_uart_mmdorck_t enTb8)
287 {
288 stc_uart_instance_data_t *pstcData = NULL;
289 ASSERT(IS_VALID_CH(u8Idx));
290 pstcData = UartGetInternDataPtr(u8Idx);
291 if (NULL == pstcData)
292 {
293 return ErrorInvalidParameter;
294 }
295 pstcData->pstcInstance->SCON_f.B8CONT = enTb8;
296 return Ok;
297 }
298 /**
299 ******************************************************************************
300 ** \brief 获取RB8数值
301 **
302 ** \param [in] u8Idx通道号
303 **
304 ** \retval RB8
305 **\retval ErrorInvalidParameter配置失败
306 ******************************************************************************/
Uart_GetRb8(uint8_t u8Idx)307 boolean_t Uart_GetRb8(uint8_t u8Idx)
308 {
309 stc_uart_instance_data_t *pstcData = NULL;
310 ASSERT(IS_VALID_CH(u8Idx));
311 pstcData = UartGetInternDataPtr(u8Idx);
312 if (NULL == pstcData)
313 {
314 return ErrorInvalidParameter;
315 }
316 return (pstcData->pstcInstance->SBUF_f.DATA8);
317 }
318 /**
319 ******************************************************************************
320 ** \brief UART通道多主机模式从机地址配置函数
321 **
322 ** \param [in] u8Idx通道号,addr地址
323 **
324 ** \retval OK配置成功
325 **\retval ErrorInvalidParameter配置失败
326 ******************************************************************************/
Uart_SetSaddr(uint8_t u8Idx,uint8_t u8Addr)327 en_result_t Uart_SetSaddr(uint8_t u8Idx,uint8_t u8Addr)
328 {
329 stc_uart_instance_data_t *pstcData = NULL;
330 ASSERT(IS_VALID_CH(u8Idx));
331 pstcData = UartGetInternDataPtr(u8Idx);
332 if (NULL == pstcData)
333 {
334 return ErrorInvalidParameter;
335 }
336 pstcData->pstcInstance->SADDR = u8Addr;
337 return Ok;
338 }
339 /**
340 ******************************************************************************
341 ** \brief UART通道多主机模式从机掩码配置函数
342 **
343 ** \param [in] u8Idx通道号,addren地址掩码
344 **
345 ** \retval OK配置成功
346 **\retval ErrorInvalidParameter配置失败
347 ******************************************************************************/
Uart_SetSaddrEn(uint8_t u8Idx,uint8_t u8Addren)348 en_result_t Uart_SetSaddrEn(uint8_t u8Idx,uint8_t u8Addren)
349 {
350 stc_uart_instance_data_t *pstcData = NULL;
351 ASSERT(IS_VALID_CH(u8Idx));
352 pstcData = UartGetInternDataPtr(u8Idx);
353 if (NULL == pstcData)
354 {
355 return ErrorInvalidParameter;
356 }
357 pstcData->pstcInstance->SADEN = u8Addren;
358 return Ok;
359 }
360 /**
361 ******************************************************************************
362 ** \brief UART通道停止位长度设置
363 **
364 ** \param [in] u8Idx通道号,u8Len停止位长度
365 **
366 ** \retval OK配置成功
367 **\retval ErrorInvalidParameter配置失败
368 ******************************************************************************/
Uart_SetStopBit(uint8_t u8Idx,uint8_t u8Len)369 en_result_t Uart_SetStopBit(uint8_t u8Idx,uint8_t u8Len)
370 {
371 stc_uart_instance_data_t *pstcData = NULL;
372 ASSERT(IS_VALID_CH(u8Idx));
373 pstcData = UartGetInternDataPtr(u8Idx);
374 switch(u8Len)
375 {
376 case Uart1bit:
377 case Uart15bit:
378 case Uart2bit:
379 pstcData->pstcInstance->SCON_f.STOPBIT = u8Len;
380 break;
381 default:
382 return ErrorInvalidParameter;
383 }
384 return Ok;
385 }
386 /**
387 ******************************************************************************
388 ** \brief UART采样频率配置
389 **
390 ** \param [in] u8Idx通道号,u8Div采样频率
391 **
392 ** \retval OK配置成功
393 ******************************************************************************/
Uart_SetClkDiv(uint8_t u8Idx,en_uart_clkdiv_t enClkDiv)394 en_result_t Uart_SetClkDiv(uint8_t u8Idx,en_uart_clkdiv_t enClkDiv)
395 {
396 stc_uart_instance_data_t *pstcData = NULL;
397 ASSERT(IS_VALID_CH(u8Idx));
398 pstcData = UartGetInternDataPtr(u8Idx);
399 pstcData->pstcInstance->SCON_f.OVER = enClkDiv;
400 return Ok;
401 }
402 /**
403 ******************************************************************************
404 ** \brief UART通道波特率配置值计算
405 **
406 ** \param [in] u8Idx通道号,pstcBaud波特率,
407 **
408 ** \retval 定时器配置值
409 ** \retval 0,获取值失败,u16Scnt波特率设置值
410 ******************************************************************************/
Uart_CalScnt(uint8_t u8Idx,stc_uart_baud_t * pstcBaud)411 uint16_t Uart_CalScnt(uint8_t u8Idx,stc_uart_baud_t *pstcBaud)
412 {
413 stc_uart_instance_data_t *pstcData = NULL;
414 uint16_t u16Scnt = 0;
415 uint8_t u8Over = 0;
416 ASSERT(IS_VALID_CH(u8Idx));
417
418 pstcData = UartGetInternDataPtr(u8Idx);
419 u8Over = pstcData->pstcInstance->SCON_f.OVER;
420 if(UartMode0 == pstcBaud->enRunMode)
421 {
422 return 0;//test
423 }
424 if((UartMode1 == pstcBaud->enRunMode)||(UartMode3 == pstcBaud->enRunMode))
425 {
426 if(0 == u8Over)
427 {
428 u8Over = 16;
429 }
430 else
431 {
432 u8Over = 8;
433 }
434
435 u16Scnt = pstcBaud->u32Pclk/(pstcBaud->u32Baud*u8Over);
436 }
437 else
438 {
439 if(0 == u8Over)
440 {
441 u8Over = 32;
442 }
443 else
444 {
445 u8Over = 16;
446 }
447 u16Scnt = pstcBaud->u32Pclk/u8Over;
448 }
449 return u16Scnt;
450 }
451 /**
452 ******************************************************************************
453 ** \brief UART通道波特率配置
454 **
455 ** \param [in] u8Idx通道号,u16Scnt波特率设置
456 **
457 ** \retval 定时器配置值
458 ** \retval 0,获取值失败
459 ******************************************************************************/
Uart_SetBaud(uint8_t u8Idx,uint16_t u16Scnt)460 en_result_t Uart_SetBaud(uint8_t u8Idx,uint16_t u16Scnt)
461 {
462 stc_uart_instance_data_t *pstcData = NULL;
463 ASSERT(IS_VALID_CH(u8Idx));
464 pstcData = UartGetInternDataPtr(u8Idx);
465 pstcData->pstcInstance->SCNT = u16Scnt;
466 return Ok;
467 }
468
469 /**
470 ******************************************************************************
471 ** \brief UART通道波特率获取
472 **
473 ** \param [in] u8Idx通道号,u8Mode工作模式
474 **
475 ** \retval 波特率
476 ******************************************************************************/
Uart_GetBaud(uint8_t u8Idx,uint8_t u8Mode,uint32_t u32Pclk)477 uint32_t Uart_GetBaud(uint8_t u8Idx,uint8_t u8Mode,uint32_t u32Pclk)
478 {
479 stc_uart_instance_data_t *pstcData = NULL;
480 uint32_t u32Baud = 0;
481 uint8_t u8Over = 0;
482 uint16_t u16Scnt = 0;
483 ASSERT(IS_VALID_CH(u8Idx));
484 pstcData = UartGetInternDataPtr(u8Idx);
485 u16Scnt = pstcData->pstcInstance->SCNT;
486
487 switch(u8Mode)
488 {
489 case UartMode0:
490 u32Baud = u32Pclk/12;
491 break;
492 case UartMode1:
493 case UartMode3:
494 if(0 == pstcData->pstcInstance->SCON_f.OVER)
495 {
496 u8Over = 16;
497 }
498 else
499 {
500 u8Over = 8;
501 }
502 u32Baud = u32Pclk/(u8Over*u16Scnt);
503 break;
504 case UartMode2:
505 if(0 == pstcData->pstcInstance->SCON_f.OVER)
506 {
507 u8Over = 32;
508 }
509 else
510 {
511 u8Over = 16;
512 }
513 u32Baud = u32Pclk/u8Over;
514 break;
515 default :
516 return 0;//test
517 }
518 return u32Baud;
519 }
520 /**
521 ******************************************************************************
522 ** \brief UART通道发送或接收等功能使能设置
523 **
524 ** \param [in] u8Idx通道号,enFunc功能
525 **
526 ** \retval OK配置成功
527 **\retval ErrorInvalidParameter配置失败
528 ******************************************************************************/
Uart_EnableFunc(uint8_t u8Idx,en_uart_func_t enFunc)529 en_result_t Uart_EnableFunc(uint8_t u8Idx, en_uart_func_t enFunc)
530 {
531 stc_uart_instance_data_t *pstcData = NULL;
532 ASSERT(IS_VALID_CH(u8Idx));
533 pstcData = UartGetInternDataPtr(u8Idx);
534 if (NULL == pstcData)
535 {
536 return ErrorInvalidParameter;
537 }
538 switch(enFunc)
539 {
540 case UartTx:
541 case UartRx:
542 pstcData->pstcInstance->SCON_f.REN = 1u;
543 break;
544 case UartDmaTx:
545 pstcData->pstcInstance->SCON_f.DMATXEN = 1u;
546 break;
547 case UartDmaRx:
548 pstcData->pstcInstance->SCON_f.DMARXEN = 1u;
549 break;
550 case UartCtsRts:
551 pstcData->pstcInstance->SCON_f.CTSEN = 1u;
552 pstcData->pstcInstance->SCON_f.RTSEN = 1u;
553 break;
554 default:
555 return ErrorInvalidParameter;
556 }
557 return Ok;
558 }
559 /**
560 ******************************************************************************
561 ** \brief UART通道发送或接收等功能禁止设置
562 **
563 ** \param [in] u8Idx通道号,enFunc功能
564 **
565 ** \retval OK配置成功
566 **\retval ErrorInvalidParameter配置失败
567 ******************************************************************************/
Uart_DisableFunc(uint8_t u8Idx,en_uart_func_t enFunc)568 en_result_t Uart_DisableFunc(uint8_t u8Idx, en_uart_func_t enFunc)
569 {
570 stc_uart_instance_data_t *pstcData = NULL;
571 ASSERT(IS_VALID_CH(u8Idx));
572 pstcData = UartGetInternDataPtr(u8Idx);
573 if (NULL == pstcData)
574 {
575 return ErrorInvalidParameter;
576 }
577 switch(enFunc)
578 {
579 case UartTx:
580 case UartRx:
581 pstcData->pstcInstance->SCON_f.REN = 0u;
582 break;
583 case UartDmaTx:
584 pstcData->pstcInstance->SCON_f.DMATXEN = 0u;
585 break;
586 case UartDmaRx:
587 pstcData->pstcInstance->SCON_f.DMARXEN = 0u;
588 break;
589 case UartCtsRts:
590 pstcData->pstcInstance->SCON_f.CTSEN = 0u;
591 pstcData->pstcInstance->SCON_f.RTSEN = 0u;
592 break;
593 default:
594 return ErrorInvalidParameter;
595 }
596 return Ok;
597 }
598 /**
599 ******************************************************************************
600 ** \brief UART通道通信状态获取
601 **
602 ** \param [in] u8Idx通道号
603 **
604 ** \retval 状态值
605 ******************************************************************************/
Uart_GetIsr(uint8_t u8Idx)606 uint8_t Uart_GetIsr(uint8_t u8Idx)
607 {
608 stc_uart_instance_data_t *pstcData = NULL;
609 ASSERT(IS_VALID_CH(u8Idx));
610 pstcData = UartGetInternDataPtr(u8Idx);
611 return (pstcData->pstcInstance->ISR);
612 }
613 /**
614 ******************************************************************************
615 ** \brief UART通道通信状态获取
616 **
617 ** \param [in] u8Idx通道号,enStatus获取哪个状态
618 **
619 ** \retval 状态值
620 **\retval ErrorInvalidParameter获取失败
621 ******************************************************************************/
Uart_GetStatus(uint8_t u8Idx,en_uart_status_t enStatus)622 boolean_t Uart_GetStatus(uint8_t u8Idx,en_uart_status_t enStatus)
623 {
624 boolean_t bStatus=FALSE;
625 stc_uart_instance_data_t *pstcData = NULL;
626 ASSERT(IS_VALID_CH(u8Idx));
627 ASSERT(IS_VALID_STATUS(enStatus));
628 pstcData = UartGetInternDataPtr(u8Idx);
629 if (NULL == pstcData)
630 {
631 return ErrorInvalidParameter;//4,用户只需判断0或1
632 }
633 switch(enStatus)
634 {
635 case UartCts:
636 bStatus = (pstcData->pstcInstance->ISR_f.CTS == 1) ? TRUE : FALSE;
637 break;
638 case UartRC:
639 bStatus = (pstcData->pstcInstance->ISR_f.RC == 1) ? TRUE : FALSE;
640 break;
641 case UartTC:
642 bStatus = (pstcData->pstcInstance->ISR_f.TC == 1) ? TRUE : FALSE;
643 break;
644 case UartPE:
645 bStatus = (pstcData->pstcInstance->ISR_f.PE == 1) ? TRUE : FALSE;
646 break;
647 case UartFE:
648 bStatus = (pstcData->pstcInstance->ISR_f.FE == 1) ? TRUE : FALSE;
649 break;
650 case UartCtsIf:
651 bStatus = (pstcData->pstcInstance->ISR_f.CTSIF == 1) ? TRUE : FALSE;
652 break;
653 case UartTxe:
654 bStatus = (pstcData->pstcInstance->ISR_f.TXE == 1) ? TRUE : FALSE;
655 break;
656 default:
657 break;
658 }
659 return bStatus;
660 }
661 /**
662 ******************************************************************************
663 ** \brief UART通道通信状态清除
664 **
665 ** \param [in] u8Idx通道号
666 **
667 ** \retval OK
668 ******************************************************************************/
Uart_ClrIsr(uint8_t u8Idx)669 en_result_t Uart_ClrIsr(uint8_t u8Idx)
670 {
671 stc_uart_instance_data_t *pstcData = NULL;
672 ASSERT(IS_VALID_CH(u8Idx));
673 pstcData = UartGetInternDataPtr(u8Idx);
674 pstcData->pstcInstance->ICR = 0u;
675 return Ok;
676 }
677 /**
678 ******************************************************************************
679 ** \brief UART通道通信状态清除
680 **
681 ** \param [in] u8Idx通道号,enStatus清除哪个状态
682 **
683 ** \retval 状态值
684 **\retval ErrorInvalidParameter清除失败
685 ******************************************************************************/
Uart_ClrStatus(uint8_t u8Idx,en_uart_status_t enStatus)686 en_result_t Uart_ClrStatus(uint8_t u8Idx,en_uart_status_t enStatus)
687 {
688 stc_uart_instance_data_t *pstcData = NULL;
689 ASSERT(IS_VALID_CH(u8Idx));
690 ASSERT(IS_VALID_STATUS(enStatus));
691 pstcData = UartGetInternDataPtr(u8Idx);
692 if (NULL == pstcData)
693 {
694 return ErrorInvalidParameter;
695 }
696 switch(enStatus)
697 {
698 case UartCts:
699 pstcData->pstcInstance->ICR_f.CTSIFCF = 0;
700 break;
701 case UartRC:
702 pstcData->pstcInstance->ICR_f.RCCF = 0;
703 break;
704 case UartTC:
705 pstcData->pstcInstance->ICR_f.TCCF = 0;
706 break;
707 case UartPE:
708 pstcData->pstcInstance->ICR_f.PECF = 0;
709 break;
710 case UartFE:
711 pstcData->pstcInstance->ICR_f.FECF = 0;
712 break;
713 default:
714 break;
715 }
716 return Ok;
717 }
718 /**
719 ******************************************************************************
720 ** \brief UART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
721 **
722 ** \param [in] u8Idx通道号,Data发送数据
723 **
724 ** \retval Ok发送成功
725 **\retval ErrorInvalidParameter发送失败
726 ******************************************************************************/
Uart_SendData(uint8_t u8Idx,uint8_t u8Data)727 en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data)
728 {
729 stc_uart_instance_data_t *pstcData = NULL;
730 ASSERT(IS_VALID_CH(u8Idx));
731 pstcData = UartGetInternDataPtr(u8Idx);
732 if (NULL == pstcData)
733 {
734 return ErrorInvalidParameter;
735 }
736 while(FALSE == Uart_GetStatus(u8Idx, UartTxe))
737 {}
738 pstcData->pstcInstance->SBUF_f.DATA = u8Data;
739 return Ok;
740 }
741 /**
742 ******************************************************************************
743 ** \brief UART通道接收数据函数
744 **
745 ** \param [in] u8Idx通道号
746 **
747 ** \retval 接收数据
748 **\retval ErrorInvalidParameter接收失败
749 ******************************************************************************/
Uart_ReceiveData(uint8_t u8Idx)750 int Uart_ReceiveData(uint8_t u8Idx)
751 {
752 stc_uart_instance_data_t *pstcData = NULL;
753 ASSERT(IS_VALID_CH(u8Idx));
754 pstcData = UartGetInternDataPtr(u8Idx);
755 if (NULL == pstcData)
756 {
757 return -1;
758 }
759 return (pstcData->pstcInstance->SBUF_f.DATA);
760 }
761 /**
762 ******************************************************************************
763 ** \brief UART通道中断处理函数
764 **
765 ** \param [in] u8Param通道号
766 **
767 ** \retval 无
768 **
769 ******************************************************************************/
Uart_IRQHandler(uint8_t u8Param)770 void Uart_IRQHandler(uint8_t u8Param)
771 {
772 stc_uart_instance_data_t *pstcData = NULL;
773 pstcData = UartGetInternDataPtr(u8Param);
774 if (NULL == pstcData)
775 {
776 return;
777 }
778 if(1 == pstcData->pstcInstance->ISR_f.FE)
779 {
780 Uart_ClrStatus(u8Param,UartFE);
781 if(NULL != pstcData->stcUartInternIrqCb.pfnRxFEIrqCb)
782 {
783 pstcData->stcUartInternIrqCb.pfnRxFEIrqCb();
784 }
785 return;//帧出错则不进行后续数据处理
786 }
787 if(1 == pstcData->pstcInstance->ISR_f.PE)
788 {
789 Uart_ClrStatus(u8Param,UartPE);
790 if(NULL != pstcData->stcUartInternIrqCb.pfnPEIrqCb)
791 {
792 pstcData->stcUartInternIrqCb.pfnPEIrqCb();
793 }
794 return;//若奇偶校验出错则不进行后续数据处理
795 }
796 if(1 == pstcData->pstcInstance->ISR_f.CTSIF)
797 {
798 Uart_ClrStatus(u8Param,UartCts);
799 if(NULL != pstcData->stcUartInternIrqCb.pfnCtsIrqCb)
800 {
801 pstcData->stcUartInternIrqCb.pfnCtsIrqCb();
802 }
803 }
804 if(1 == pstcData->pstcInstance->ISR_f.RC)
805 {
806 Uart_ClrStatus(u8Param,UartRC);
807 if(NULL != pstcData->stcUartInternIrqCb.pfnRxIrqCb)
808 {
809 pstcData->stcUartInternIrqCb.pfnRxIrqCb();
810 }
811 }
812 if(1 == pstcData->pstcInstance->ISR_f.TC)
813 {
814 Uart_ClrStatus(u8Param,UartTC);
815 if(NULL != pstcData->stcUartInternIrqCb.pfnTxIrqCb)
816 {
817 pstcData->stcUartInternIrqCb.pfnTxIrqCb();
818 }
819 }
820 }
821 /**
822 ******************************************************************************
823 ** \brief UART通道使能内核NVIC中断
824 **
825 ** \param [in] u8Idx通道号
826 **
827 ** \retval 无
828 **
829 ******************************************************************************/
UartInitNvic(uint8_t u8Idx)830 static void UartInitNvic(uint8_t u8Idx)
831 {
832 IRQn_Type enIrqIndex;
833
834 ASSERT(IS_VALID_CH(u8Idx));;
835 enIrqIndex = (IRQn_Type)(UART0_IRQn + u8Idx);
836 NVIC_ClearPendingIRQ(enIrqIndex);
837 NVIC_SetPriority(enIrqIndex,IrqLevel3);
838 NVIC_EnableIRQ(enIrqIndex);
839
840 }
841 /**
842 ******************************************************************************
843 ** \brief UART通道禁止内核NVIC中断
844 **
845 ** \param [in] u8Idx通道号
846 **
847 ** \retval 无
848 **
849 ******************************************************************************/
UartDeInitNvic(uint8_t u8Idx)850 static void UartDeInitNvic(uint8_t u8Idx)
851 {
852 IRQn_Type enIrqIndex;
853
854 ASSERT(IS_VALID_CH(u8Idx));
855 enIrqIndex = (IRQn_Type)(UART0_IRQn + u8Idx);
856 NVIC_ClearPendingIRQ(enIrqIndex);
857 NVIC_SetPriority(enIrqIndex,IrqLevel3);
858 NVIC_DisableIRQ(enIrqIndex);
859
860 }
861 /**
862 ******************************************************************************
863 ** \brief UART通道初始化函数
864 **
865 ** \param [in] u8Idx通道号,pstcConfig初始化结构体
866 **
867 ** \retval OK配置成功
868 **\retval ErrorInvalidParameter配置失败
869 ******************************************************************************/
Uart_Init(uint8_t u8Idx,stc_uart_config_t * pstcConfig)870 en_result_t Uart_Init(uint8_t u8Idx,
871 stc_uart_config_t* pstcConfig)
872 {
873 en_result_t enRet = Error;
874 stc_uart_instance_data_t *pstcData = NULL;
875 ASSERT(IS_VALID_CH(u8Idx));
876 pstcData = UartGetInternDataPtr(u8Idx);
877 if (NULL == pstcData)
878 {
879 return ErrorInvalidParameter;
880 }
881 if(NULL == pstcConfig)
882 {
883 return ErrorInvalidParameter;
884 }
885 enRet = Uart_SetMode(u8Idx,pstcConfig->enRunMode);
886 enRet = Uart_SetStopBit(u8Idx,pstcConfig->enStopBit);
887 if(NULL != pstcConfig->pstcMultiMode)
888 {
889 enRet = Uart_SetMultiMode(u8Idx,pstcConfig->pstcMultiMode);
890 }
891 if(NULL != pstcConfig->pstcIrqCb)
892 {
893 pstcData->stcUartInternIrqCb.pfnRxFEIrqCb = pstcConfig->pstcIrqCb->pfnRxFEIrqCb;
894 pstcData->stcUartInternIrqCb.pfnRxIrqCb = pstcConfig->pstcIrqCb->pfnRxIrqCb;
895 pstcData->stcUartInternIrqCb.pfnTxIrqCb = pstcConfig->pstcIrqCb->pfnTxIrqCb;
896 pstcData->stcUartInternIrqCb.pfnCtsIrqCb = pstcConfig->pstcIrqCb->pfnCtsIrqCb;
897 pstcData->stcUartInternIrqCb.pfnPEIrqCb = pstcConfig->pstcIrqCb->pfnPEIrqCb;
898 }
899 if(pstcConfig->bTouchNvic == TRUE)
900 {
901 UartInitNvic(u8Idx);
902 }
903 else
904 {
905 UartDeInitNvic(u8Idx);
906 }
907 enRet = Ok;
908 return enRet;
909 }
910 //@} // UartGroup
911