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 "hc32l196_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_cfg_t * pstcGpioCfg)98 en_result_t Gpio_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin, stc_gpio_cfg_t  *pstcGpioCfg)
99 {
100     //配置为默认值,GPIO功能
101     SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, FALSE);
102     *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;
103 
104     //默认输出值配置
105     SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, pstcGpioCfg->bOutputVal);
106     //方向配置
107     SetBit(((uint32_t)&M0P_GPIO->PADIR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDir));
108     //驱动能力配置
109     SetBit(((uint32_t)&M0P_GPIO->PADR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDrv));
110     //上拉/下拉配置
111     SetBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, (boolean_t)(pstcGpioCfg->enPu));
112     SetBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, (boolean_t)(pstcGpioCfg->enPd));
113     //开漏输出功能
114     SetBit(((uint32_t)&M0P_GPIO->PAOD + enPort), enPin, (boolean_t)(pstcGpioCfg->enOD));
115 
116     M0P_GPIO->CTRL2_f.AHB_SEL = pstcGpioCfg->enCtrlMode;
117 
118     return Ok;
119 }
120 
121 
122 
123 /**
124  *******************************************************************************
125  ** \brief GPIO IO输入值获取
126  **
127  ** \param [in]  enPort          IO Port口
128  ** \param [in]  enPin           IO Pin脚
129  **
130  ** \retval boolean_t            IO电平高低
131  ******************************************************************************/
Gpio_GetInputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)132 boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
133 {
134     return GetBit(((uint32_t)&M0P_GPIO->PAIN + enPort), enPin);
135 }
136 
137 /**
138  *******************************************************************************
139  ** \brief GPIO IO Port输入数据获取
140  **
141  ** \param [in]  enPort          IO Port
142  **
143  ** \retval boolean_t            IO Port数据
144  ******************************************************************************/
Gpio_GetInputData(en_gpio_port_t enPort)145 uint16_t    Gpio_GetInputData(en_gpio_port_t enPort)
146 {
147     return (uint16_t)(*((uint32_t *)((uint32_t)&M0P_GPIO->PAIN + enPort)));
148 }
149 
150 /**
151  *******************************************************************************
152  ** \brief GPIO IO输出值写入
153  **
154  ** \param [in]  enPort          IO Port口
155  ** \param [in]  enPin           IO Pin脚
156  ** \param [out] bVal            输出值
157  **
158  ** \retval en_result_t          Ok      设置成功
159  **                              其他值  设置失败
160  ******************************************************************************/
Gpio_WriteOutputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin,boolean_t bVal)161 en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
162 {
163     SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);
164 
165     return Ok;
166 }
167 
168 /**
169  *******************************************************************************
170  ** \brief GPIO IO输出值获取
171  **
172  ** \param [in]  enPort          IO Port口
173  ** \param [in]  enPin           IO Pin脚
174  **
175  ** \retval boolean_t            IO电平高低
176  ******************************************************************************/
Gpio_ReadOutputIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)177 boolean_t   Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
178 {
179     return GetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin);
180 }
181 
182 /**
183  *******************************************************************************
184  ** \brief GPIO IO Port设置,可同时设置一组Port中的多个PIN
185  **
186  ** \param [in]  enPort          IO Port
187  ** \param [in]  u16ValMsk       该Port的16个PIN掩码值,将需要设置的PIN对应的bit写1有效
188  **
189  ** \retval boolean_t            IO Port数据
190  ******************************************************************************/
Gpio_SetPort(en_gpio_port_t enPort,uint16_t u16ValMsk)191 en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
192 {
193     *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABSET)) + enPort)) = u16ValMsk;
194     return Ok;
195 }
196 
197 /**
198  *******************************************************************************
199  ** \brief GPIO IO设置
200  **
201  ** \param [in]  enPort          IO Port口
202  ** \param [in]  enPin           IO Pin脚
203  **
204  ** \retval en_result_t          Ok      设置成功
205  **                              其他值  设置失败
206  ******************************************************************************/
Gpio_SetIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)207 en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
208 {
209     SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);
210 
211     return Ok;
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_ClrPort(en_gpio_port_t enPort,uint16_t u16ValMsk)223 en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
224 {
225     *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABCLR)) + enPort)) = u16ValMsk;
226 
227     return Ok;
228 }
229 
230 /**
231  *******************************************************************************
232  ** \brief GPIO IO清零
233  **
234  ** \param [in]  enPort          IO Port口
235  ** \param [in]  enPin           IO Pin脚
236  **
237  ** \retval en_result_t          Ok      设置成功
238  **                              其他值  设置失败
239  ******************************************************************************/
Gpio_ClrIO(en_gpio_port_t enPort,en_gpio_pin_t enPin)240 en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
241 {
242     SetBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);
243 
244     return Ok;
245 }
246 
247 /**
248  *******************************************************************************
249  ** \brief GPIO IO Port置位/清零,可同时置位/清零一组Port中的多个PIN
250  **
251  ** \param [in]  enPort       IO Port
252  ** \param [in]  u32ValMsk    高16bits表示该Port的16个PIN置位掩码值,
253  **                           低16bits表示该Port的16个PIN清零掩码值,
254  **                           将需要设置的PIN对应的bit写1,同一个PIN的掩码同时为1,则该PIN清零。
255  **
256  ** \retval en_result_t       Ok      设置成功
257  **                           其他值  设置失败
258  ******************************************************************************/
Gpio_SetClrPort(en_gpio_port_t enPort,uint32_t u32ValMsk)259 en_result_t Gpio_SetClrPort(en_gpio_port_t enPort, uint32_t u32ValMsk)
260 {
261     *((uint32_t*)(((uint32_t)&(M0P_GPIO->PABSETCLR)) + enPort)) = u32ValMsk;
262 
263     return Ok;
264 }
265 
266 /**
267  *******************************************************************************
268  ** \brief GPIO IO配置为模拟功能模式
269  **
270  ** \param [in]  enPort          IO Port口
271  ** \param [in]  enPin           IO Pin脚
272  **
273  ** \retval Ok         设置成功
274  **         其他值     设置失败
275  ******************************************************************************/
Gpio_SetAnalogMode(en_gpio_port_t enPort,en_gpio_pin_t enPin)276 en_result_t Gpio_SetAnalogMode(en_gpio_port_t enPort, en_gpio_pin_t enPin)
277 {
278     SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, TRUE);
279 
280     return Ok;
281 }
282 
283 /**
284  *******************************************************************************
285 ** \brief GPIO IO复用功能设置
286  **
287  ** \param [in]  enPort    IO Port口
288  ** \param [in]  enPin     IO Pin脚
289  ** \param [in]  enAf      复用功能枚举类型选择
290  ** \retval Ok             设置成功
291  **         其他值         设置失败
292  ******************************************************************************/
Gpio_SetAfMode(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_af_t enAf)293 en_result_t Gpio_SetAfMode(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_af_t enAf)
294 {
295     *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = enAf;
296 
297     return Ok;
298 }
299 
300 /**
301  *******************************************************************************
302  ** \brief GPIO IO复用功能设置
303  **
304  ** \param [in]  PinMux    复用功能宏定义
305  ** \retval Null
306  **
307  ******************************************************************************/
Gpio_SetAfMode_Lite(GpioPinMux PinMux)308 void Gpio_SetAfMode_Lite(GpioPinMux PinMux)
309 {
310     *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + ((PinMux>>16u)&0xFFFFu)) + (((uint32_t)((PinMux>>8u)&0xFFu))<<2))) = (uint32_t)(PinMux&0x7u);
311 }
312 
313 /**
314  *******************************************************************************
315  ** \brief GPIO IO中断使能
316  **
317  ** \param [in]  enPort          IO Port口
318  ** \param [in]  enPin           IO Pin脚
319  ** \param [in]  enType          中断使能类型
320  **
321  ** \retval      Ok            设置成功
322  ******************************************************************************/
Gpio_EnableIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_irqtype_t enType)323 en_result_t Gpio_EnableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
324 {
325     uint32_t u32PieAddr;
326 
327     u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
328 
329     SetBit(u32PieAddr, enPin, TRUE);
330 
331     return Ok;
332 }
333 
334 /**
335  *******************************************************************************
336  ** \brief GPIO IO中断关闭
337  **
338  ** \param [in]  enPort          IO Port口
339  ** \param [in]  enPin           IO Pin脚
340  ** \param [in]  enType          中断使能类型
341  **
342  ** \retval      Ok            设置成功
343  ******************************************************************************/
Gpio_DisableIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin,en_gpio_irqtype_t enType)344 en_result_t Gpio_DisableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
345 {
346     uint32_t u32PieAddr;
347 
348     u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
349 
350     SetBit(u32PieAddr, enPin, FALSE);
351 
352     return Ok;
353 }
354 
355 
356 /**
357  *******************************************************************************
358  ** \brief GPIO 获得IO中断状态
359  **
360  ** \param [in]  u8Port          IO Port口
361  ** \param [in]  u8Pin           IO Pin脚
362  **
363  ** \retval      IO中断状态开关
364  ******************************************************************************/
Gpio_GetIrqStatus(en_gpio_port_t enPort,en_gpio_pin_t enPin)365 boolean_t Gpio_GetIrqStatus(en_gpio_port_t enPort, en_gpio_pin_t enPin)
366 {
367     return GetBit((uint32_t)&M0P_GPIO->PA_STAT + enPort, enPin);
368 }
369 
370 /**
371  *******************************************************************************
372  ** \brief GPIO 清除IO中断状态
373  **
374  ** \param [in]  u8Port          IO Port口
375  ** \param [in]  u8Pin           IO Pin脚
376  **
377  ** \retval    Ok       设置成功
378  ******************************************************************************/
Gpio_ClearIrq(en_gpio_port_t enPort,en_gpio_pin_t enPin)379 en_result_t Gpio_ClearIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin)
380 {
381     SetBit((uint32_t)&M0P_GPIO->PA_ICLR + enPort, enPin, FALSE);
382 
383     return Ok;
384 }
385 
386 /**
387  *******************************************************************************
388  ** \brief GPIO 端口辅助功能配置——中断模式配置
389  **
390  ** \param [in]  enIrqMode          端口中断模式(深度休眠是否响应中断)
391  **
392  ** \retval    Ok       设置成功
393  ******************************************************************************/
Gpio_SfIrqModeCfg(en_gpio_sf_irqmode_t enIrqMode)394 en_result_t Gpio_SfIrqModeCfg(en_gpio_sf_irqmode_t enIrqMode)
395 {
396     M0P_GPIO->CTRL0_f.IESEL = enIrqMode;
397 
398     return Ok;
399 }
400 
401 /**
402  *******************************************************************************
403  ** \brief GPIO 端口辅助功能配置——IR输出极性配置
404  **
405  ** \param [in]  enIrPolMode          IR输出极性配置枚举
406  **
407  ** \retval    Ok       设置成功
408  ******************************************************************************/
Gpio_SfIrPolCfg(en_gpio_sf_irpol_t enIrPolMode)409 en_result_t Gpio_SfIrPolCfg(en_gpio_sf_irpol_t enIrPolMode)
410 {
411     M0P_GPIO->CTRL1_f.IR_POL = enIrPolMode;
412 
413     return Ok;
414 }
415 
416 /**
417  *******************************************************************************
418  ** \brief GPIO 端口辅助功能配置——HCLK输出配置
419  **
420  ** \param [in]  enGate         HCLK输出使能
421  ** \param [in]  enDiv          输出分频枚举值
422  **
423  ** \retval    Ok       设置成功
424  ******************************************************************************/
Gpio_SfHClkOutputCfg(en_gpio_sf_hclkout_g_t enGate,en_gpio_sf_hclkout_div_t enDiv)425 en_result_t Gpio_SfHClkOutputCfg(en_gpio_sf_hclkout_g_t enGate, en_gpio_sf_hclkout_div_t enDiv)
426 {
427     M0P_GPIO->CTRL1_f.HCLK_EN  = enGate;
428     M0P_GPIO->CTRL1_f.HCLK_SEL = enDiv;
429 
430     return Ok;
431 }
432 
433 /**
434  *******************************************************************************
435  ** \brief GPIO 端口辅助功能配置——PCLK输出配置
436  **
437  ** \param [in]  enGate         PCLK输出使能
438  ** \param [in]  enDiv          输出分频枚举值
439  **
440  ** \retval    Ok       设置成功
441  ******************************************************************************/
Gpio_SfPClkOutputCfg(en_gpio_sf_pclkout_g_t enGate,en_gpio_sf_pclkout_div_t enDiv)442 en_result_t Gpio_SfPClkOutputCfg(en_gpio_sf_pclkout_g_t enGate, en_gpio_sf_pclkout_div_t enDiv)
443 {
444     M0P_GPIO->CTRL1_f.PCLK_EN  = enGate;
445     M0P_GPIO->CTRL1_f.PCLK_SEL = enDiv;
446 
447     return Ok;
448 }
449 
450 /**
451  *******************************************************************************
452  ** \brief GPIO 端口辅助功能配置——外部时钟输入来源配置
453  **
454  ** \param [in]  enExtClk         外部时钟信号来源选择枚举
455  **
456  ** \retval    Ok       设置成功
457  ******************************************************************************/
Gpio_SfExtClkCfg(en_gpio_sf_ssn_extclk_t enExtClk)458 en_result_t Gpio_SfExtClkCfg(en_gpio_sf_ssn_extclk_t enExtClk)
459 {
460     M0P_GPIO->CTRL1_f.EXT_CLK_SEL  = enExtClk;
461 
462     return Ok;
463 }
464 
465 /**
466  *******************************************************************************
467  ** \brief GPIO 端口辅助功能配置——SSN 通道信号来源配置
468  **
469  ** \param [in]  enSpi         SSN SPI通道选择枚举
470  ** \param [in]  enSsn         SSN 信号来源选择枚举
471  **
472  ** \retval    Ok       设置成功
473  ******************************************************************************/
Gpio_SfSsnCfg(en_gpio_sf_ssnspi_t enSpi,en_gpio_sf_ssn_extclk_t enSsn)474 en_result_t Gpio_SfSsnCfg(en_gpio_sf_ssnspi_t enSpi, en_gpio_sf_ssn_extclk_t enSsn)
475 {
476     //SPI0
477     if(enSpi == GpioSpi0)
478     {
479         M0P_GPIO->CTRL1_f.SSN0_SEL = enSsn;
480     }
481     //SPI1
482     if(enSpi == GpioSpi1)
483     {
484         M0P_GPIO->CTRL2_f.SSN1_SEL = enSsn;
485     }
486 
487     return Ok;
488 }
489 
490 /**
491  *******************************************************************************
492  ** \brief GPIO 端口辅助功能配置——Timer 门控输入配置
493  **
494  ** \param [in]  enTimG       Timer类型选择枚举
495  ** \param [in]  enSf         Timer互联功能选择枚举
496  **
497  ** \retval    Ok       设置成功
498  ******************************************************************************/
Gpio_SfTimGCfg(en_gpio_sf_tim_g_t enTimG,en_gpio_sf_t enSf)499 en_result_t Gpio_SfTimGCfg(en_gpio_sf_tim_g_t enTimG, en_gpio_sf_t enSf)
500 {
501     if(enTimG&0x20u)
502     {
503         enTimG &= ~0x20u;
504         M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimG));
505         M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimG);
506     }
507     else
508     {
509         M0P_GPIO->TIMGS &= (uint32_t)(~(0x07U<<enTimG));
510         M0P_GPIO->TIMGS |= (uint32_t)(enSf<<enTimG);
511     }
512 
513     return Ok;
514 }
515 
516 /**
517  *******************************************************************************
518  ** \brief GPIO 端口辅助功能配置——Timer ETR选择配置
519  **
520  ** \param [in]  enTimE       Timer类型选择枚举
521  ** \param [in]  enSf         Timer互联功能选择枚举
522  **
523  ** \retval    Ok       设置成功
524  ******************************************************************************/
Gpio_SfTimECfg(en_gpio_sf_tim_e_t enTimE,en_gpio_sf_t enSf)525 en_result_t Gpio_SfTimECfg(en_gpio_sf_tim_e_t enTimE, en_gpio_sf_t enSf)
526 {
527     if(enTimE&0x20u)
528     {
529         enTimE &= ~0x20u;
530         M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimE));
531         M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimE);
532     }
533     else
534     {
535         M0P_GPIO->TIMES &= (uint32_t)(~(0x07U<<enTimE));
536         M0P_GPIO->TIMES |= (uint32_t)(enSf<<enTimE);
537     }
538 
539     return Ok;
540 }
541 
542 /**
543  *******************************************************************************
544  ** \brief GPIO 端口辅助功能配置——Timer 捕获输入选择配置
545  **
546  ** \param [in]  enTimC       Timer类型选择枚举
547  ** \param [in]  enSf         Timer互联功能选择枚举
548  **
549  ** \retval    Ok       设置成功
550  ******************************************************************************/
Gpio_SfTimCCfg(en_gpio_sf_tim_c_t enTimC,en_gpio_sf_t enSf)551 en_result_t Gpio_SfTimCCfg(en_gpio_sf_tim_c_t enTimC, en_gpio_sf_t enSf)
552 {
553     M0P_GPIO->TIMCPS &= (uint32_t)(~(0x07u<<enTimC));
554     M0P_GPIO->TIMCPS |= (uint32_t)(enSf<<enTimC);
555 
556     return Ok;
557 }
558 
559 /**
560  *******************************************************************************
561  ** \brief GPIO 端口辅助功能配置——PCA 捕获输入选择配置
562  **
563  ** \param [in]  enPca        PCA类型选择枚举
564  ** \param [in]  enSf         PCA互联功能选择枚举
565  **
566  ** \retval    Ok       设置成功
567  ******************************************************************************/
Gpio_SfPcaCfg(en_gpio_sf_pca_t enPca,en_gpio_sf_t enSf)568 en_result_t Gpio_SfPcaCfg(en_gpio_sf_pca_t enPca, en_gpio_sf_t enSf)
569 {
570     M0P_GPIO->PCAS &= (uint32_t)(~(0x07u<<enPca));
571     M0P_GPIO->PCAS |= (uint32_t)(enSf<<enPca);
572 
573     return Ok;
574 }
575 
576 //@} // GpioGroup
577 
578 
579 /*******************************************************************************
580  * EOF (not truncated)
581  ******************************************************************************/
582 
583