gpio.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /******************************************************************************
  2. * Copyright (C) 2021, Xiaohua Semiconductor Co., Ltd. All rights reserved.
  3. *
  4. * This software component is licensed by XHSC under BSD 3-Clause license
  5. * (the "License"); You may not use this file except in compliance with the
  6. * License. You may obtain a copy of the License at:
  7. * opensource.org/licenses/BSD-3-Clause
  8. *
  9. ******************************************************************************/
  10. /******************************************************************************
  11. * @file gpio.c
  12. *
  13. * @brief Source file for GPIO functions
  14. *
  15. * @author MADS Team
  16. *
  17. ******************************************************************************/
  18. /*******************************************************************************
  19. * Include files
  20. ******************************************************************************/
  21. #include "gpio.h"
  22. /**
  23. *******************************************************************************
  24. ** \addtogroup GpioGroup
  25. ******************************************************************************/
  26. //@{
  27. /*******************************************************************************
  28. * Local pre-processor symbols/macros ('#define')
  29. ******************************************************************************/
  30. #define IS_VALID_PIN(port,pin) ( )
  31. /*******************************************************************************
  32. * Global variable definitions (declared in header file with 'extern') *
  33. ******************************************************************************/
  34. /*******************************************************************************
  35. * Local type definitions ('typedef')
  36. ******************************************************************************/
  37. /*******************************************************************************
  38. * Local function prototypes ('static')
  39. ******************************************************************************/
  40. /*******************************************************************************
  41. * Local variable definitions ('static')
  42. ******************************************************************************/
  43. /*******************************************************************************
  44. * Function implementation - global ('extern') and local ('static')
  45. ******************************************************************************/
  46. /**
  47. *******************************************************************************
  48. ** \brief GPIO 初始化
  49. **
  50. ** \param [in] enPort IO Port口
  51. ** \param [in] enPin IO Pin脚
  52. ** \param [in] pstcGpioCfg IO 配置结构体指针
  53. **
  54. ** \retval Ok 设置成功
  55. ** 其他值 设置失败
  56. ******************************************************************************/
  57. en_result_t Gpio_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin, stc_gpio_cfg_t *pstcGpioCfg)
  58. {
  59. //配置为默认值,GPIO功能
  60. SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, FALSE);
  61. *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;
  62. //默认输出值配置
  63. SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, pstcGpioCfg->bOutputVal);
  64. //方向配置
  65. SetBit(((uint32_t)&M0P_GPIO->PADIR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDir));
  66. //驱动能力配置
  67. SetBit(((uint32_t)&M0P_GPIO->PADR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDrv));
  68. //上拉/下拉配置
  69. SetBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, (boolean_t)(pstcGpioCfg->enPu));
  70. SetBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, (boolean_t)(pstcGpioCfg->enPd));
  71. //开漏输出功能
  72. SetBit(((uint32_t)&M0P_GPIO->PAOD + enPort), enPin, (boolean_t)(pstcGpioCfg->enOD));
  73. M0P_GPIO->CTRL2_f.AHB_SEL = pstcGpioCfg->enCtrlMode;
  74. return Ok;
  75. }
  76. /**
  77. *******************************************************************************
  78. ** \brief GPIO IO输入值获取
  79. **
  80. ** \param [in] enPort IO Port口
  81. ** \param [in] enPin IO Pin脚
  82. **
  83. ** \retval boolean_t IO电平高低
  84. ******************************************************************************/
  85. boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  86. {
  87. return GetBit(((uint32_t)&M0P_GPIO->PAIN + enPort), enPin);
  88. }
  89. /**
  90. *******************************************************************************
  91. ** \brief GPIO IO Port输入数据获取
  92. **
  93. ** \param [in] enPort IO Port
  94. **
  95. ** \retval boolean_t IO Port数据
  96. ******************************************************************************/
  97. uint16_t Gpio_GetInputData(en_gpio_port_t enPort)
  98. {
  99. return (uint16_t)(*((uint32_t *)((uint32_t)&M0P_GPIO->PAIN + enPort)));
  100. }
  101. /**
  102. *******************************************************************************
  103. ** \brief GPIO IO输出值写入
  104. **
  105. ** \param [in] enPort IO Port口
  106. ** \param [in] enPin IO Pin脚
  107. ** \param [out] bVal 输出值
  108. **
  109. ** \retval en_result_t Ok 设置成功
  110. ** 其他值 设置失败
  111. ******************************************************************************/
  112. en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
  113. {
  114. SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);
  115. return Ok;
  116. }
  117. /**
  118. *******************************************************************************
  119. ** \brief GPIO IO输出值获取
  120. **
  121. ** \param [in] enPort IO Port口
  122. ** \param [in] enPin IO Pin脚
  123. **
  124. ** \retval boolean_t IO电平高低
  125. ******************************************************************************/
  126. boolean_t Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  127. {
  128. return GetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin);
  129. }
  130. /**
  131. *******************************************************************************
  132. ** \brief GPIO IO Port设置,可同时设置一组Port中的多个PIN
  133. **
  134. ** \param [in] enPort IO Port
  135. ** \param [in] u16ValMsk 该Port的16个PIN掩码值,将需要设置的PIN对应的bit写1有效
  136. **
  137. ** \retval boolean_t IO Port数据
  138. ******************************************************************************/
  139. en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
  140. {
  141. *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABSET)) + enPort)) = u16ValMsk;
  142. return Ok;
  143. }
  144. /**
  145. *******************************************************************************
  146. ** \brief GPIO IO设置
  147. **
  148. ** \param [in] enPort IO Port口
  149. ** \param [in] enPin IO Pin脚
  150. **
  151. ** \retval en_result_t Ok 设置成功
  152. ** 其他值 设置失败
  153. ******************************************************************************/
  154. en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  155. {
  156. SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);
  157. return Ok;
  158. }
  159. /**
  160. *******************************************************************************
  161. ** \brief GPIO IO Port清零,可同时清零一组Port中的多个PIN
  162. **
  163. ** \param [in] enPort IO Port
  164. ** \param [in] u16ValMsk 该Port的16个PIN掩码值,将需要清零的PIN对应的bit写1有效
  165. **
  166. ** \retval boolean_t IO Port数据
  167. ******************************************************************************/
  168. en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
  169. {
  170. *((uint16_t*)(((uint32_t)&(M0P_GPIO->PABCLR)) + enPort)) = u16ValMsk;
  171. return Ok;
  172. }
  173. /**
  174. *******************************************************************************
  175. ** \brief GPIO IO清零
  176. **
  177. ** \param [in] enPort IO Port口
  178. ** \param [in] enPin IO Pin脚
  179. **
  180. ** \retval en_result_t Ok 设置成功
  181. ** 其他值 设置失败
  182. ******************************************************************************/
  183. en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  184. {
  185. SetBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);
  186. return Ok;
  187. }
  188. /**
  189. *******************************************************************************
  190. ** \brief GPIO IO Port置位/清零,可同时置位/清零一组Port中的多个PIN
  191. **
  192. ** \param [in] enPort IO Port
  193. ** \param [in] u32ValMsk 高16bits表示该Port的16个PIN置位掩码值,
  194. ** 低16bits表示该Port的16个PIN清零掩码值,
  195. ** 将需要设置的PIN对应的bit写1,同一个PIN的掩码同时为1,则该PIN清零。
  196. **
  197. ** \retval en_result_t Ok 设置成功
  198. ** 其他值 设置失败
  199. ******************************************************************************/
  200. en_result_t Gpio_SetClrPort(en_gpio_port_t enPort, uint32_t u32ValMsk)
  201. {
  202. *((uint32_t*)(((uint32_t)&(M0P_GPIO->PABSETCLR)) + enPort)) = u32ValMsk;
  203. return Ok;
  204. }
  205. /**
  206. *******************************************************************************
  207. ** \brief GPIO IO配置为模拟功能模式
  208. **
  209. ** \param [in] enPort IO Port口
  210. ** \param [in] enPin IO Pin脚
  211. **
  212. ** \retval Ok 设置成功
  213. ** 其他值 设置失败
  214. ******************************************************************************/
  215. en_result_t Gpio_SetAnalogMode(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  216. {
  217. SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, TRUE);
  218. return Ok;
  219. }
  220. /**
  221. *******************************************************************************
  222. ** \brief GPIO IO复用功能设置
  223. **
  224. ** \param [in] enPort IO Port口
  225. ** \param [in] enPin IO Pin脚
  226. ** \param [in] enAf 复用功能枚举类型选择
  227. ** \retval Ok 设置成功
  228. ** 其他值 设置失败
  229. ******************************************************************************/
  230. en_result_t Gpio_SetAfMode(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_af_t enAf)
  231. {
  232. *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = enAf;
  233. return Ok;
  234. }
  235. /**
  236. *******************************************************************************
  237. ** \brief GPIO IO复用功能设置
  238. **
  239. ** \param [in] PinMux 复用功能宏定义
  240. ** \retval Null
  241. **
  242. ******************************************************************************/
  243. void Gpio_SetAfMode_Lite(GpioPinMux PinMux)
  244. {
  245. *((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + ((PinMux>>16u)&0xFFFFu)) + (((uint32_t)((PinMux>>8u)&0xFFu))<<2))) = (uint32_t)(PinMux&0x7u);
  246. }
  247. /**
  248. *******************************************************************************
  249. ** \brief GPIO IO中断使能
  250. **
  251. ** \param [in] enPort IO Port口
  252. ** \param [in] enPin IO Pin脚
  253. ** \param [in] enType 中断使能类型
  254. **
  255. ** \retval Ok 设置成功
  256. ******************************************************************************/
  257. en_result_t Gpio_EnableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
  258. {
  259. uint32_t u32PieAddr;
  260. u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
  261. SetBit(u32PieAddr, enPin, TRUE);
  262. return Ok;
  263. }
  264. /**
  265. *******************************************************************************
  266. ** \brief GPIO IO中断关闭
  267. **
  268. ** \param [in] enPort IO Port口
  269. ** \param [in] enPin IO Pin脚
  270. ** \param [in] enType 中断使能类型
  271. **
  272. ** \retval Ok 设置成功
  273. ******************************************************************************/
  274. en_result_t Gpio_DisableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
  275. {
  276. uint32_t u32PieAddr;
  277. u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
  278. SetBit(u32PieAddr, enPin, FALSE);
  279. return Ok;
  280. }
  281. /**
  282. *******************************************************************************
  283. ** \brief GPIO 获得IO中断状态
  284. **
  285. ** \param [in] u8Port IO Port口
  286. ** \param [in] u8Pin IO Pin脚
  287. **
  288. ** \retval IO中断状态开关
  289. ******************************************************************************/
  290. boolean_t Gpio_GetIrqStatus(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  291. {
  292. return GetBit((uint32_t)&M0P_GPIO->PA_STAT + enPort, enPin);
  293. }
  294. /**
  295. *******************************************************************************
  296. ** \brief GPIO 清除IO中断状态
  297. **
  298. ** \param [in] u8Port IO Port口
  299. ** \param [in] u8Pin IO Pin脚
  300. **
  301. ** \retval Ok 设置成功
  302. ******************************************************************************/
  303. en_result_t Gpio_ClearIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin)
  304. {
  305. SetBit((uint32_t)&M0P_GPIO->PA_ICLR + enPort, enPin, FALSE);
  306. return Ok;
  307. }
  308. /**
  309. *******************************************************************************
  310. ** \brief GPIO 端口辅助功能配置——中断模式配置
  311. **
  312. ** \param [in] enIrqMode 端口中断模式(深度休眠是否响应中断)
  313. **
  314. ** \retval Ok 设置成功
  315. ******************************************************************************/
  316. en_result_t Gpio_SfIrqModeCfg(en_gpio_sf_irqmode_t enIrqMode)
  317. {
  318. M0P_GPIO->CTRL0_f.IESEL = enIrqMode;
  319. return Ok;
  320. }
  321. /**
  322. *******************************************************************************
  323. ** \brief GPIO 端口辅助功能配置——IR输出极性配置
  324. **
  325. ** \param [in] enIrPolMode IR输出极性配置枚举
  326. **
  327. ** \retval Ok 设置成功
  328. ******************************************************************************/
  329. en_result_t Gpio_SfIrPolCfg(en_gpio_sf_irpol_t enIrPolMode)
  330. {
  331. M0P_GPIO->CTRL1_f.IR_POL = enIrPolMode;
  332. return Ok;
  333. }
  334. /**
  335. *******************************************************************************
  336. ** \brief GPIO 端口辅助功能配置——HCLK输出配置
  337. **
  338. ** \param [in] enGate HCLK输出使能
  339. ** \param [in] enDiv 输出分频枚举值
  340. **
  341. ** \retval Ok 设置成功
  342. ******************************************************************************/
  343. en_result_t Gpio_SfHClkOutputCfg(en_gpio_sf_hclkout_g_t enGate, en_gpio_sf_hclkout_div_t enDiv)
  344. {
  345. M0P_GPIO->CTRL1_f.HCLK_EN = enGate;
  346. M0P_GPIO->CTRL1_f.HCLK_SEL = enDiv;
  347. return Ok;
  348. }
  349. /**
  350. *******************************************************************************
  351. ** \brief GPIO 端口辅助功能配置——PCLK输出配置
  352. **
  353. ** \param [in] enGate PCLK输出使能
  354. ** \param [in] enDiv 输出分频枚举值
  355. **
  356. ** \retval Ok 设置成功
  357. ******************************************************************************/
  358. en_result_t Gpio_SfPClkOutputCfg(en_gpio_sf_pclkout_g_t enGate, en_gpio_sf_pclkout_div_t enDiv)
  359. {
  360. M0P_GPIO->CTRL1_f.PCLK_EN = enGate;
  361. M0P_GPIO->CTRL1_f.PCLK_SEL = enDiv;
  362. return Ok;
  363. }
  364. /**
  365. *******************************************************************************
  366. ** \brief GPIO 端口辅助功能配置——外部时钟输入来源配置
  367. **
  368. ** \param [in] enExtClk 外部时钟信号来源选择枚举
  369. **
  370. ** \retval Ok 设置成功
  371. ******************************************************************************/
  372. en_result_t Gpio_SfExtClkCfg(en_gpio_sf_ssn_extclk_t enExtClk)
  373. {
  374. M0P_GPIO->CTRL1_f.EXT_CLK_SEL = enExtClk;
  375. return Ok;
  376. }
  377. /**
  378. *******************************************************************************
  379. ** \brief GPIO 端口辅助功能配置——SSN 通道信号来源配置
  380. **
  381. ** \param [in] enSpi SSN SPI通道选择枚举
  382. ** \param [in] enSsn SSN 信号来源选择枚举
  383. **
  384. ** \retval Ok 设置成功
  385. ******************************************************************************/
  386. en_result_t Gpio_SfSsnCfg(en_gpio_sf_ssnspi_t enSpi, en_gpio_sf_ssn_extclk_t enSsn)
  387. {
  388. //SPI0
  389. if(enSpi == GpioSpi0)
  390. {
  391. M0P_GPIO->CTRL1_f.SSN0_SEL = enSsn;
  392. }
  393. //SPI1
  394. if(enSpi == GpioSpi1)
  395. {
  396. M0P_GPIO->CTRL2_f.SSN1_SEL = enSsn;
  397. }
  398. return Ok;
  399. }
  400. /**
  401. *******************************************************************************
  402. ** \brief GPIO 端口辅助功能配置——Timer 门控输入配置
  403. **
  404. ** \param [in] enTimG Timer类型选择枚举
  405. ** \param [in] enSf Timer互联功能选择枚举
  406. **
  407. ** \retval Ok 设置成功
  408. ******************************************************************************/
  409. en_result_t Gpio_SfTimGCfg(en_gpio_sf_tim_g_t enTimG, en_gpio_sf_t enSf)
  410. {
  411. if(enTimG&0x20u)
  412. {
  413. enTimG &= ~0x20u;
  414. M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimG));
  415. M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimG);
  416. }
  417. else
  418. {
  419. M0P_GPIO->TIMGS &= (uint32_t)(~(0x07U<<enTimG));
  420. M0P_GPIO->TIMGS |= (uint32_t)(enSf<<enTimG);
  421. }
  422. return Ok;
  423. }
  424. /**
  425. *******************************************************************************
  426. ** \brief GPIO 端口辅助功能配置——Timer ETR选择配置
  427. **
  428. ** \param [in] enTimE Timer类型选择枚举
  429. ** \param [in] enSf Timer互联功能选择枚举
  430. **
  431. ** \retval Ok 设置成功
  432. ******************************************************************************/
  433. en_result_t Gpio_SfTimECfg(en_gpio_sf_tim_e_t enTimE, en_gpio_sf_t enSf)
  434. {
  435. if(enTimE&0x20u)
  436. {
  437. enTimE &= ~0x20u;
  438. M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimE));
  439. M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimE);
  440. }
  441. else
  442. {
  443. M0P_GPIO->TIMES &= (uint32_t)(~(0x07U<<enTimE));
  444. M0P_GPIO->TIMES |= (uint32_t)(enSf<<enTimE);
  445. }
  446. return Ok;
  447. }
  448. /**
  449. *******************************************************************************
  450. ** \brief GPIO 端口辅助功能配置——Timer 捕获输入选择配置
  451. **
  452. ** \param [in] enTimC Timer类型选择枚举
  453. ** \param [in] enSf Timer互联功能选择枚举
  454. **
  455. ** \retval Ok 设置成功
  456. ******************************************************************************/
  457. en_result_t Gpio_SfTimCCfg(en_gpio_sf_tim_c_t enTimC, en_gpio_sf_t enSf)
  458. {
  459. M0P_GPIO->TIMCPS &= (uint32_t)(~(0x07u<<enTimC));
  460. M0P_GPIO->TIMCPS |= (uint32_t)(enSf<<enTimC);
  461. return Ok;
  462. }
  463. /**
  464. *******************************************************************************
  465. ** \brief GPIO 端口辅助功能配置——PCA 捕获输入选择配置
  466. **
  467. ** \param [in] enPca PCA类型选择枚举
  468. ** \param [in] enSf PCA互联功能选择枚举
  469. **
  470. ** \retval Ok 设置成功
  471. ******************************************************************************/
  472. en_result_t Gpio_SfPcaCfg(en_gpio_sf_pca_t enPca, en_gpio_sf_t enSf)
  473. {
  474. M0P_GPIO->PCAS &= (uint32_t)(~(0x07u<<enPca));
  475. M0P_GPIO->PCAS |= (uint32_t)(enSf<<enPca);
  476. return Ok;
  477. }
  478. //@} // GpioGroup
  479. /*******************************************************************************
  480. * EOF (not truncated)
  481. ******************************************************************************/