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