1 /******************************************************************************
2 * Copyright (C) 2018, 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 Gpio.c
44  **
45  ** GPIO driver API.
46  ** @link Driver Group Some description @endlink
47  **
48  **   - 2018-04-22  1.0  Lux First version
49  **
50  ******************************************************************************/
51 
52 /*******************************************************************************
53  * Include files
54  ******************************************************************************/
55 #include "gpio.h"
56 
57 /**
58  *******************************************************************************
59  ** \addtogroup GpioGroup
60  ******************************************************************************/
61 //@{
62 
63 /*******************************************************************************
64  * Local pre-processor symbols/macros ('#define')
65  ******************************************************************************/
66 #define IS_VALID_PIN(port,pin)      (  )
67 /*******************************************************************************
68  * Global variable definitions (declared in header file with 'extern')         *
69  ******************************************************************************/
70 
71 /*******************************************************************************
72  * Local type definitions ('typedef')
73  ******************************************************************************/
74 
75 /*******************************************************************************
76  * Local function prototypes ('static')
77  ******************************************************************************/
78 
79 /*******************************************************************************
80  * Local variable definitions ('static')
81  ******************************************************************************/
82 
83 /*******************************************************************************
84  * Function implementation - global ('extern') and local ('static')
85  ******************************************************************************/
86 
87 /**
88  *******************************************************************************
89  ** \brief GPIO 初始化
90  **
91  ** \param [in]  enPort          IO Port口
92  ** \param [in]  enPin           IO Pin脚
93  ** \param [in]  pstcGpioCfg     IO 配置结构体指针
94  **
95  ** \retval Ok         设置成功
96  **         其他值     设置失败
97  ******************************************************************************/
Gpio_Init(en_gpio_port_t enPort,en_gpio_pin_t enPin,stc_gpio_config_t * pstcGpioCfg)98 en_result_t Gpio_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin, stc_gpio_config_t  *pstcGpioCfg)
99 {
100     //配置为默认值,GPIO功能
101     *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;
102 
103     //方向配置
104     if(GpioDirIn == pstcGpioCfg->enDir)
105     {
106         setBit(((uint32_t)&M0P_GPIO->PADIR + enPort), enPin, TRUE);
107     }
108     else
109     {
110         setBit(((uint32_t)&M0P_GPIO->PADIR + enPort), enPin, FALSE);
111     }
112 
113     //驱动能力配置
114     if(GpioDrvH == pstcGpioCfg->enDrv)
115     {
116         setBit(((uint32_t)&M0P_GPIO->PADR + enPort), enPin, FALSE);
117     }
118     else
119     {
120         setBit(((uint32_t)&M0P_GPIO->PADR + enPort), enPin, TRUE);
121     }
122 
123     //上拉下拉配置
124     if(GpioPu == pstcGpioCfg->enPuPd)
125     {
126         setBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, TRUE);
127         setBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, FALSE);
128     }
129     else if(GpioPd == pstcGpioCfg->enPuPd)
130     {
131         setBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, FALSE);
132         setBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, TRUE);
133     }
134     else
135     {
136         setBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, FALSE);
137         setBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, FALSE);
138     }
139 
140     //开漏输出功能
141     if(GpioOdDisable == pstcGpioCfg->enOD)
142     {
143         setBit(((uint32_t)&M0P_GPIO->PAOD + enPort), enPin, FALSE);
144     }
145     else
146     {
147         setBit(((uint32_t)&M0P_GPIO->PAOD + enPort), enPin, TRUE);
148     }
149 
150     M0P_GPIO->CTRL2_f.AHB_SEL = pstcGpioCfg->enCtrlMode;
151 
152     return Ok;
153 }
154 
155 /**
156  *******************************************************************************
157  ** \brief GPIO IO输入值获取
158  **
159  ** \param [in]  enPort          IO Port口
160  ** \param [in]  enPin           IO Pin脚
161  **
162  ** \retval boolean_t            IO电平高低
163  ******************************************************************************/
Gpio_GetInputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)164 boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
165 {
166     return getBit(((uint32_t)&M0P_GPIO->PAIN + enPort), enPin);
167 }
168 
169 /**
170  *******************************************************************************
171  ** \brief GPIO IO Port输入数据获取
172  **
173  ** \param [in]  enPort          IO Port
174  **
175  ** \retval boolean_t            IO Port数据
176  ******************************************************************************/
Gpio_GetInputData(en_gpio_port_t enPort)177 uint16_t    Gpio_GetInputData(en_gpio_port_t enPort)
178 {
179     return (uint16_t)(*((uint32_t *)((uint32_t)&M0P_GPIO->PAIN + enPort)));
180 }
181 
182 /**
183  *******************************************************************************
184  ** \brief GPIO IO输出值写入
185  **
186  ** \param [in]  enPort          IO Port口
187  ** \param [in]  enPin           IO Pin脚
188  ** \param [out] bVal            输出值
189  **
190  ** \retval en_result_t          Ok      设置成功
191  **                              其他值  设置失败
192  ******************************************************************************/
Gpio_WriteOutputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin,boolean_t bVal)193 en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
194 {
195     setBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);
196 
197     return Ok;
198 }
199 
200 /**
201  *******************************************************************************
202  ** \brief GPIO IO输出值获取
203  **
204  ** \param [in]  enPort          IO Port口
205  ** \param [in]  enPin           IO Pin脚
206  **
207  ** \retval boolean_t            IO电平高低
208  ******************************************************************************/
Gpio_ReadOutputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)209 boolean_t   Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
210 {
211     return getBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin);
212 }
213 
214 /**
215  *******************************************************************************
216  ** \brief GPIO IO Port设置,可同时设置一组Port中的多个PIN
217  **
218  ** \param [in]  enPort          IO Port
219  ** \param [in]  u16ValMsk       该Port的16个PIN掩码值,将需要设置的PIN对应的bit写1有效
220  **
221  ** \retval boolean_t            IO Port数据
222  ******************************************************************************/
Gpio_SetPort(en_gpio_port_t enPort,uint16_t u16ValMsk)223 en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
224 {
225     *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABSET)) + enPort)) = u16ValMsk;
226     return Ok;
227 }
228 
229 /**
230  *******************************************************************************
231  ** \brief GPIO IO设置
232  **
233  ** \param [in]  enPort          IO Port口
234  ** \param [in]  enPin           IO Pin脚
235  **
236  ** \retval en_result_t          Ok      设置成功
237  **                              其他值  设置失败
238  ******************************************************************************/
Gpio_SetIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)239 en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
240 {
241     setBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);
242 
243     return Ok;
244 }
245 
246 /**
247  *******************************************************************************
248  ** \brief GPIO IO Port清零,可同时清零一组Port中的多个PIN
249  **
250  ** \param [in]  enPort          IO Port
251  ** \param [in]  u16ValMsk       该Port的16个PIN掩码值,将需要清零的PIN对应的bit写1有效
252  **
253  ** \retval boolean_t            IO Port数据
254  ******************************************************************************/
Gpio_ClrPort(en_gpio_port_t enPort,uint16_t u16ValMsk)255 en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
256 {
257     *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABCLR)) + enPort)) = u16ValMsk;
258 
259     return Ok;
260 }
261 
262 /**
263  *******************************************************************************
264  ** \brief GPIO IO清零
265  **
266  ** \param [in]  enPort          IO Port口
267  ** \param [in]  enPin           IO Pin脚
268  **
269  ** \retval en_result_t          Ok      设置成功
270  **                              其他值  设置失败
271  ******************************************************************************/
Gpio_ClrIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)272 en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
273 {
274     setBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);
275 
276     return Ok;
277 }
278 
279 /**
280  *******************************************************************************
281  ** \brief GPIO IO Port置位/清零,可同时置位/清零一组Port中的多个PIN
282  **
283  ** \param [in]  enPort       IO Port
284 ** \param [in]  u32ValMsk     高16bits表示该Port的16个PIN置位掩码值,
285  **                           低16bits表示该Port的16个PIN清零掩码值,
286 **                            将需要设置的PIN对应的bit写1,同一个PIN的掩码同时为1,则该PIN清零。
287  **
288  ** \retval en_result_t       Ok      设置成功
289  **                           其他值  设置失败
290  ******************************************************************************/
Gpio_SetClrPort(en_gpio_port_t enPort,uint32_t u32ValMsk)291 en_result_t Gpio_SetClrPort(en_gpio_port_t enPort, uint32_t u32ValMsk)
292 {
293     *((uint32_t*)(((uint32_t)&(M0P_GPIO->PABSETCLR)) + enPort)) = u32ValMsk;
294 
295     return Ok;
296 }
297 
298 /**
299  *******************************************************************************
300  ** \brief GPIO IO配置为模拟功能模式
301  **
302  ** \param [in]  enPort          IO Port口
303  ** \param [in]  enPin           IO Pin脚
304  **
305  ** \retval Ok         设置成功
306  **         其他值     设置失败
307  ******************************************************************************/
Gpio_SetAnalogMode(en_gpio_port_t enPort,en_gpio_pin_t enPin)308 en_result_t Gpio_SetAnalogMode(en_gpio_port_t enPort, en_gpio_pin_t enPin)
309 {
310     setBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, TRUE);
311 
312     return Ok;
313 }
314 
315 /**
316  *******************************************************************************
317 ** \brief GPIO IO复用功能设置
318  **
319  ** \param [in]  enPort    IO Port口
320  ** \param [in]  enPin     IO Pin脚
321  ** \param [in]  enAf      复用功能枚举类型选择
322  ** \retval Ok             设置成功
323  **         其他值         设置失败
324  ******************************************************************************/
Gpio_SetAfMode(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_af_t enAf)325 en_result_t Gpio_SetAfMode(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_af_t enAf)
326 {
327     *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = enAf;
328 
329     return Ok;
330 }
331 
332 
_GpioEnableIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_irqtype_t enType,boolean_t bEnable)333 static en_result_t _GpioEnableIrq(en_gpio_port_t enPort,
334                            en_gpio_pin_t enPin,
335                            en_gpio_irqtype_t enType,
336                            boolean_t bEnable)
337 {
338     //high level
339     if (enType & GpioIrqHigh)
340     {
341         setBit((uint32_t)&M0P_GPIO->PAHIE + enPort, enPin, bEnable);
342     }
343     //low level
344     if (enType & GpioIrqLow)
345     {
346         setBit((uint32_t)&M0P_GPIO->PALIE + enPort, enPin, bEnable);
347     }
348     //rising
349     if (enType & GpioIrqRising)
350     {
351         setBit((uint32_t)&M0P_GPIO->PARIE + enPort, enPin, bEnable);
352     }
353     //falling
354     if (enType & GpioIrqFalling)
355     {
356         setBit((uint32_t)&M0P_GPIO->PAFIE + enPort, enPin, bEnable);
357     }
358 
359     return Ok;
360 }
361 
362 /**
363  *******************************************************************************
364  ** \brief GPIO IO中断使能
365  **
366  ** \param [in]  enPort          IO Port口
367  ** \param [in]  enPin           IO Pin脚
368  ** \param [in]  enType          中断使能类型
369  **
370  ** \retval      Ok            设置成功
371  ******************************************************************************/
Gpio_EnableIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_irqtype_t enType)372 en_result_t Gpio_EnableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
373 {
374     _GpioEnableIrq(enPort, enPin, enType, TRUE);
375 
376     return Ok;
377 }
378 
379 /**
380  *******************************************************************************
381  ** \brief GPIO IO中断关闭
382  **
383  ** \param [in]  enPort          IO Port口
384  ** \param [in]  enPin           IO Pin脚
385  ** \param [in]  enType          中断使能类型
386  **
387  ** \retval      Ok            设置成功
388  ******************************************************************************/
Gpio_DisableIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_irqtype_t enType)389 en_result_t Gpio_DisableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
390 {
391     _GpioEnableIrq(enPort, enPin, enType, FALSE);
392 
393     return Ok;
394 }
395 
396 
397 /**
398  *******************************************************************************
399  ** \brief GPIO 获得IO中断状态
400  **
401  ** \param [in]  u8Port          IO Port口
402  ** \param [in]  u8Pin           IO Pin脚
403  **
404  ** \retval      IO中断状态开关
405  ******************************************************************************/
Gpio_GetIrqStatus(en_gpio_port_t enPort,en_gpio_pin_t enPin)406 boolean_t Gpio_GetIrqStatus(en_gpio_port_t enPort, en_gpio_pin_t enPin)
407 {
408     return getBit((uint32_t)&M0P_GPIO->PA_STAT + enPort, enPin);
409 }
410 
411 /**
412  *******************************************************************************
413  ** \brief GPIO 清除IO中断状态
414  **
415  ** \param [in]  u8Port          IO Port口
416  ** \param [in]  u8Pin           IO Pin脚
417  **
418  ** \retval    Ok       设置成功
419  ******************************************************************************/
Gpio_ClearIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin)420 en_result_t Gpio_ClearIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin)
421 {
422     setBit((uint32_t)&M0P_GPIO->PA_ICLR + enPort, enPin, FALSE);
423 
424     return Ok;
425 }
426 
427 /**
428  *******************************************************************************
429  ** \brief GPIO 端口辅助功能配置——中断模式配置
430  **
431  ** \param [in]  enIrqMode          端口中断模式(深度休眠是否响应中断)
432  **
433  ** \retval    Ok       设置成功
434  ******************************************************************************/
Gpio_SfIrqModeConfig(en_gpio_sf_irqmode_t enIrqMode)435 en_result_t Gpio_SfIrqModeConfig(en_gpio_sf_irqmode_t enIrqMode)
436 {
437     M0P_GPIO->CTRL0_f.IESEL = enIrqMode;
438 
439     return Ok;
440 }
441 
442 /**
443  *******************************************************************************
444  ** \brief GPIO 端口辅助功能配置——IR输出极性配置
445  **
446  ** \param [in]  enIrPolMode          IR输出极性配置枚举
447  **
448  ** \retval    Ok       设置成功
449  ******************************************************************************/
Gpio_SfIrPolConfig(en_gpio_sf_irpol_t enIrPolMode)450 en_result_t Gpio_SfIrPolConfig(en_gpio_sf_irpol_t enIrPolMode)
451 {
452     M0P_GPIO->CTRL1_f.IR_POL = enIrPolMode;
453 
454     return Ok;
455 }
456 
457 /**
458  *******************************************************************************
459  ** \brief GPIO 端口辅助功能配置——HCLK输出配置
460  **
461  ** \param [in]  enGate         HCLK输出使能
462  ** \param [in]  enDiv          输出分频枚举值
463  **
464  ** \retval    Ok       设置成功
465  ******************************************************************************/
Gpio_SfHClkOutputConfig(en_gpio_sf_hclkout_g_t enGate,en_gpio_sf_hclkout_div_t enDiv)466 en_result_t Gpio_SfHClkOutputConfig(en_gpio_sf_hclkout_g_t enGate, en_gpio_sf_hclkout_div_t enDiv)
467 {
468     M0P_GPIO->CTRL1_f.HCLK_EN  = enGate;
469     M0P_GPIO->CTRL1_f.HCLK_SEL = enDiv;
470 
471     return Ok;
472 }
473 
474 /**
475  *******************************************************************************
476  ** \brief GPIO 端口辅助功能配置——PCLK输出配置
477  **
478  ** \param [in]  enGate         PCLK输出使能
479  ** \param [in]  enDiv          输出分频枚举值
480  **
481  ** \retval    Ok       设置成功
482  ******************************************************************************/
Gpio_SfPClkOutputConfig(en_gpio_sf_pclkout_g_t enGate,en_gpio_sf_pclkout_div_t enDiv)483 en_result_t Gpio_SfPClkOutputConfig(en_gpio_sf_pclkout_g_t enGate, en_gpio_sf_pclkout_div_t enDiv)
484 {
485     M0P_GPIO->CTRL1_f.PCLK_EN  = enGate;
486     M0P_GPIO->CTRL1_f.PCLK_SEL = enDiv;
487 
488     return Ok;
489 }
490 
491 /**
492  *******************************************************************************
493  ** \brief GPIO 端口辅助功能配置——外部时钟输入来源配置
494  **
495  ** \param [in]  enExtClk         外部时钟信号来源选择枚举
496  **
497  ** \retval    Ok       设置成功
498  ******************************************************************************/
Gpio_SfExtClkConfig(en_gpio_sf_ssn_extclk_t enExtClk)499 en_result_t Gpio_SfExtClkConfig(en_gpio_sf_ssn_extclk_t enExtClk)
500 {
501     M0P_GPIO->CTRL1_f.EXT_CLK_SEL  = enExtClk;
502 
503     return Ok;
504 }
505 
506 /**
507  *******************************************************************************
508  ** \brief GPIO 端口辅助功能配置——SSN 通道信号来源配置
509  **
510  ** \param [in]  enSpi         SSN SPI通道选择枚举
511  ** \param [in]  enSsn         SSN 信号来源选择枚举
512  **
513  ** \retval    Ok       设置成功
514  ******************************************************************************/
Gpio_SfSsnConfig(en_gpio_sf_ssnspi_t enSpi,en_gpio_sf_ssn_extclk_t enSsn)515 en_result_t Gpio_SfSsnConfig(en_gpio_sf_ssnspi_t enSpi, en_gpio_sf_ssn_extclk_t enSsn)
516 {
517     //SPI0
518     if(enSpi == GpioSpi0)
519     {
520         M0P_GPIO->CTRL1_f.SSN0_SEL = enSsn;
521     }
522     //SPI1
523     if(enSpi == GpioSpi1)
524     {
525         M0P_GPIO->CTRL2_f.SSN1_SEL = enSsn;
526     }
527 
528     return Ok;
529 }
530 
531 /**
532  *******************************************************************************
533  ** \brief GPIO 端口辅助功能配置——Timer 门控输入配置
534  **
535  ** \param [in]  enTimG       Timer类型选择枚举
536  ** \param [in]  enSf         Timer互联功能选择枚举
537  **
538  ** \retval    Ok       设置成功
539  ******************************************************************************/
Gpio_SfTimGConfig(en_gpio_sf_tim_g_t enTimG,en_gpio_sf_t enSf)540 en_result_t Gpio_SfTimGConfig(en_gpio_sf_tim_g_t enTimG, en_gpio_sf_t enSf)
541 {
542     M0P_GPIO->TIMGS &= (uint32_t)(~(0x07U<<enTimG));
543     M0P_GPIO->TIMGS |= (uint32_t)(enSf<<enTimG);
544 
545     return Ok;
546 }
547 
548 /**
549  *******************************************************************************
550  ** \brief GPIO 端口辅助功能配置——Timer ETR选择配置
551  **
552  ** \param [in]  enTimE       Timer类型选择枚举
553  ** \param [in]  enSf         Timer互联功能选择枚举
554  **
555  ** \retval    Ok       设置成功
556  ******************************************************************************/
Gpio_SfTimEConfig(en_gpio_sf_tim_e_t enTimE,en_gpio_sf_t enSf)557 en_result_t Gpio_SfTimEConfig(en_gpio_sf_tim_e_t enTimE, en_gpio_sf_t enSf)
558 {
559     M0P_GPIO->TIMES &= (uint32_t)(~(0x07U<<enTimE));
560     M0P_GPIO->TIMES |= (uint32_t)(enSf<<enTimE);
561 
562     return Ok;
563 }
564 
565 /**
566  *******************************************************************************
567  ** \brief GPIO 端口辅助功能配置——Timer 捕获输入选择配置
568  **
569  ** \param [in]  enTimC       Timer类型选择枚举
570  ** \param [in]  enSf         Timer互联功能选择枚举
571  **
572  ** \retval    Ok       设置成功
573  ******************************************************************************/
Gpio_SfTimCConfig(en_gpio_sf_tim_c_t enTimC,en_gpio_sf_t enSf)574 en_result_t Gpio_SfTimCConfig(en_gpio_sf_tim_c_t enTimC, en_gpio_sf_t enSf)
575 {
576     M0P_GPIO->TIMCPS &= (uint32_t)(~(0x07u<<enTimC));
577     M0P_GPIO->TIMCPS |= (uint32_t)(enSf<<enTimC);
578 
579     return Ok;
580 }
581 
582 /**
583  *******************************************************************************
584  ** \brief GPIO 端口辅助功能配置——PCA 捕获输入选择配置
585  **
586  ** \param [in]  enPca        PCA类型选择枚举
587  ** \param [in]  enSf         PCA互联功能选择枚举
588  **
589  ** \retval    Ok       设置成功
590  ******************************************************************************/
Gpio_SfPcaConfig(en_gpio_sf_pca_t enPca,en_gpio_sf_t enSf)591 en_result_t Gpio_SfPcaConfig(en_gpio_sf_pca_t enPca, en_gpio_sf_t enSf)
592 {
593     if(GpioSfPcaCH0 == enPca)
594     {
595         M0P_GPIO->PCAS_f.PCA_CH0 = enSf;
596     }
597 
598     if(GpioSfPcaECI == enPca)
599     {
600         M0P_GPIO->PCAS_f.PCA_ECI = enSf;
601     }
602 
603     return Ok;
604 }
605 
606 
607 //@} // GpioGroup
608 
609 
610 /*******************************************************************************
611  * EOF (not truncated)
612  ******************************************************************************/
613 
614