gpio.c 20 KB

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