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 "hc32l196_uart.h"
56 /**
57  ******************************************************************************
58  ** \addtogroup UartGroup
59  ******************************************************************************/
60 //@{
61 /******************************************************************************/
62 /* Local pre-processor symbols/macros ('#define')                             */
63 /******************************************************************************/
64 
65 /******************************************************************************/
66 /* Local function prototypes ('static')                                       */
67 /******************************************************************************/
68 
69 /******************************************************************************/
70 /* Local variable definitions ('static')                                       */
71 /******************************************************************************/
72 
73 /**
74  ******************************************************************************
75  ** \brief  UART通信中断使能函数设置
76  **
77  ** \param [in] UARTx通道号,enIrqSel发送or接收中断使能
78  **
79  ** \retval OK配置成功
80  ** \retval ErrorInvalidParameter配置失败
81  ******************************************************************************/
Uart_EnableIrq(M0P_UART_TypeDef * UARTx,en_uart_irq_sel_t enIrqSel)82 en_result_t Uart_EnableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
83 {
84     SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, TRUE);
85 
86     return Ok;
87 }
88 /**
89  ******************************************************************************
90  ** \brief  UART通信中断禁止函数设置
91  **
92  ** \param [in] UARTx通道号,enIrqSel发送or接收中断禁止
93  **
94  ** \retval OK配置成功
95  ** \retval ErrorInvalidParameter配置失败
96  ******************************************************************************/
Uart_DisableIrq(M0P_UART_TypeDef * UARTx,en_uart_irq_sel_t enIrqSel)97 en_result_t Uart_DisableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
98 {
99     SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, FALSE);
100 
101     return Ok;
102 }
103 
104 /**
105  ******************************************************************************
106  ** \brief  UART通道多主机模式配置
107  **
108  ** \param [in] UARTx通道号,stcMultiCfg多主机模式结构
109  **
110  ** \retval OK配置成功
111  ** \retval ErrorInvalidParameter配置失败
112  ******************************************************************************/
Uart_SetMultiMode(M0P_UART_TypeDef * UARTx,stc_uart_multimode_t * pstcMultiCfg)113 en_result_t Uart_SetMultiMode(M0P_UART_TypeDef* UARTx, stc_uart_multimode_t* pstcMultiCfg)
114 {
115     if(NULL != pstcMultiCfg)
116     {
117         UARTx->SCON_f.ADRDET = TRUE;
118         UARTx->SADDR = pstcMultiCfg->u8SlaveAddr;
119         UARTx->SADEN = pstcMultiCfg->u8SaddEn;
120 
121     }
122     else
123     {
124         return ErrorInvalidParameter;
125     }
126 
127     return Ok;
128 }
129 
130 /**
131  ******************************************************************************
132  ** \brief  UART单线半双工模式使能
133  **
134  ** \param [in] UARTx 通道号
135  **
136  ** \retval Null
137  ******************************************************************************/
Uart_HdModeEnable(M0P_UART_TypeDef * UARTx)138 void Uart_HdModeEnable(M0P_UART_TypeDef* UARTx)
139 {
140     UARTx->SCON_f.HDSEL = TRUE;
141 }
142 
143 /**
144  ******************************************************************************
145  ** \brief  UART单线半双工模式关闭
146  **
147  ** \param [in] UARTx 通道号
148  **
149  ** \retval Null
150  ******************************************************************************/
Uart_HdModeDisable(M0P_UART_TypeDef * UARTx)151 void Uart_HdModeDisable(M0P_UART_TypeDef* UARTx)
152 {
153     UARTx->SCON_f.HDSEL = FALSE;
154 }
155 
156 /**
157  ******************************************************************************
158  ** \brief  UART通道多机模式发送数据/地址帧配置TB8
159  **
160  ** \param [in] UARTx 通道号
161  ** \param [in] TRUE-TB8为地址帧标志;FALSE-TB8为数据帧标志;
162  **
163  ** \retval Null
164  ******************************************************************************/
Uart_SetTb8(M0P_UART_TypeDef * UARTx,boolean_t bTB8Value)165 void Uart_SetTb8(M0P_UART_TypeDef* UARTx, boolean_t bTB8Value)
166 {
167     UARTx->SCON_f.B8CONT = bTB8Value;
168 
169 }
170 
171 /**
172  ******************************************************************************
173  ** \brief 获取RB8数值
174  **
175  ** \param [in] UARTx通道号
176  **
177  ** \retval RB8
178  ******************************************************************************/
Uart_GetRb8(M0P_UART_TypeDef * UARTx)179 boolean_t Uart_GetRb8(M0P_UART_TypeDef* UARTx)
180 {
181     return (UARTx->SBUF_f.DATA8);
182 }
183 
184 /**
185  ******************************************************************************
186  ** \brief  UART通道多主机模式从机地址配置函数
187  **
188  ** \param [in] UARTx通道号,addr地址
189  **
190  ** \retval OK配置成功
191  ** \retval ErrorInvalidParameter配置失败
192  ******************************************************************************/
Uart_SetSaddr(M0P_UART_TypeDef * UARTx,uint8_t u8Addr)193 en_result_t Uart_SetSaddr(M0P_UART_TypeDef* UARTx,uint8_t u8Addr)
194 {
195     UARTx->SADDR = u8Addr;
196 
197     return Ok;
198 }
199 
200 /**
201  ******************************************************************************
202  ** \brief  UART通道发送或接收等功能使能设置
203  **
204  ** \param [in] UARTx通道号,enFunc功能
205  **
206  ** \retval OK配置成功
207  ** \retval ErrorInvalidParameter配置失败
208  ******************************************************************************/
Uart_EnableFunc(M0P_UART_TypeDef * UARTx,en_uart_func_t enFunc)209 en_result_t Uart_EnableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc)
210 {
211     SetBit((uint32_t)(&(UARTx->SCON)), enFunc, TRUE);
212 
213     return Ok;
214 }
215 /**
216  ******************************************************************************
217  ** \brief  UART通道发送或接收等功能禁止设置
218  **
219  ** \param [in] UARTx通道号,enFunc功能
220  **
221  ** \retval OK配置成功
222  ** \retval ErrorInvalidParameter配置失败
223  ******************************************************************************/
Uart_DisableFunc(M0P_UART_TypeDef * UARTx,en_uart_func_t enFunc)224 en_result_t Uart_DisableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc)
225 {
226     SetBit((uint32_t)(&(UARTx->SCON)), enFunc, FALSE);
227 
228     return Ok;
229 }
230 /**
231  ******************************************************************************
232  ** \brief  UART通道通信状态获取
233  **
234  ** \param [in] UARTx通道号
235  **
236  ** \retval 状态值
237  ******************************************************************************/
Uart_GetIsr(M0P_UART_TypeDef * UARTx)238 uint8_t Uart_GetIsr(M0P_UART_TypeDef* UARTx)
239 {
240     return (UARTx->ISR);
241 }
242 
243 /**
244  ******************************************************************************
245  ** \brief  UART通道通信状态获取
246  **
247  ** \param [in] UARTx通道号,enStatus获取哪个状态
248  **
249  ** \retval 状态值
250  ******************************************************************************/
Uart_GetStatus(M0P_UART_TypeDef * UARTx,en_uart_status_t enStatus)251 boolean_t Uart_GetStatus(M0P_UART_TypeDef* UARTx, en_uart_status_t enStatus)
252 {
253     boolean_t bStatus = FALSE;
254 
255 
256     ASSERT(IS_VALID_STATUS(enStatus));
257 
258     bStatus =  GetBit((uint32_t)(&(UARTx->ISR)), enStatus);
259 
260     return bStatus;
261 }
262 /**
263  ******************************************************************************
264  ** \brief  UART通道通信状态清除
265  **
266  ** \param [in] UARTx通道号
267  **
268  ** \retval OK
269  ** \retval ErrorInvalidParameter清除失败
270  ******************************************************************************/
Uart_ClrIsr(M0P_UART_TypeDef * UARTx)271 en_result_t Uart_ClrIsr(M0P_UART_TypeDef* UARTx)
272 {
273     UARTx->ICR = 0u;
274     return Ok;
275 }
276 /**
277  ******************************************************************************
278  ** \brief  UART通道通信状态清除
279  **
280  ** \param [in] UARTx通道号,enStatus清除哪个状态
281  **
282  ** \retval OK
283  ** \retval ErrorInvalidParameter清除失败
284  ******************************************************************************/
Uart_ClrStatus(M0P_UART_TypeDef * UARTx,en_uart_status_t enStatus)285 en_result_t Uart_ClrStatus(M0P_UART_TypeDef* UARTx,en_uart_status_t enStatus)
286 {
287     ASSERT(IS_VALID_STATUS(enStatus));
288 
289     SetBit((uint32_t)(&(UARTx->ICR)), enStatus, FALSE);
290 
291     return Ok;
292 }
293 /**
294  ******************************************************************************
295  ** \brief  UART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
296  **
297  ** \param [in] UARTx通道号,Data发送数据
298  **
299  ** \retval Ok发送成功
300  ** \retval ErrorInvalidParameter发送失败
301  ******************************************************************************/
Uart_SendDataPoll(M0P_UART_TypeDef * UARTx,uint8_t u8Data)302 en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
303 {
304     while(FALSE == Uart_GetStatus(UARTx,UartTxe))
305     {}
306     UARTx->SBUF_f.DATA = u8Data;
307     while(FALSE == Uart_GetStatus(UARTx,UartTC))
308     {}
309     Uart_ClrStatus(UARTx,UartTC);
310     return Ok;
311 }
312 
313 /**
314  ******************************************************************************
315  ** \brief  UART通道发送数据函数,中断方式调用此函数
316  **
317  ** \param [in] UARTx通道号,Data发送数据
318  **
319  ** \retval Ok发送成功
320  ** \retval ErrorInvalidParameter发送失败
321  ******************************************************************************/
Uart_SendDataIt(M0P_UART_TypeDef * UARTx,uint8_t u8Data)322 en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
323 {
324     UARTx->SBUF_f.DATA = u8Data;
325 
326     return Ok;
327 }
328 
329 /**
330  ******************************************************************************
331  ** \brief  UART通道接收数据函数
332  **
333  ** \param [in] UARTx通道号
334  **
335  ** \retval 接收数据
336  ******************************************************************************/
Uart_ReceiveData(M0P_UART_TypeDef * UARTx)337 uint8_t Uart_ReceiveData(M0P_UART_TypeDef* UARTx)
338 {
339     return (UARTx->SBUF_f.DATA);
340 }
341 
342 /**
343  ******************************************************************************
344  ** \brief  UART通道初始化函数
345  **
346  ** \param [in] UARTx通道号,pstcCfg初始化结构体 @ref stc_uart_cfg_t
347  **
348  ** \retval OK配置成功
349  ** \retval ErrorInvalidParameter配置失败
350  ******************************************************************************/
Uart_Init(M0P_UART_TypeDef * UARTx,stc_uart_cfg_t * pstcCfg)351 en_result_t Uart_Init(M0P_UART_TypeDef* UARTx, stc_uart_cfg_t* pstcCfg)
352 {
353     en_result_t enRet = Error;
354     uint32_t u32Over[2] = {0x4, 0x3};
355     uint16_t u16OverShift;
356     float32_t f32Scnt=0;
357 
358     if(NULL == pstcCfg)
359     {
360         return ErrorInvalidParameter;
361     }
362 
363     UARTx->SCON = 0;
364 
365     UARTx->SCON = (uint32_t)pstcCfg->enStopBit |
366                   (uint32_t)pstcCfg->enMmdorCk |
367                   (uint32_t)pstcCfg->stcBaud.enClkDiv |
368                   (uint32_t)pstcCfg->enRunMode;
369 
370     if((UartMskMode1 == pstcCfg->enRunMode) || (UartMskMode3 == pstcCfg->enRunMode))
371     {
372         u16OverShift = u32Over[pstcCfg->stcBaud.enClkDiv/UartMsk8Or16Div];
373         f32Scnt = (float32_t)(pstcCfg->stcBaud.u32Pclk)/(float32_t)(pstcCfg->stcBaud.u32Baud<<u16OverShift);
374         UARTx->SCNT = (uint16_t)(float32_t)(f32Scnt + 0.5f);
375         Uart_EnableFunc(UARTx,UartRenFunc);       ///<使能收发
376     }
377 
378 
379 
380     enRet = Ok;
381     return enRet;
382 }
383 //@} // UartGroup
384