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