fm33lc0xx_fl_gpio.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /**
  2. ****************************************************************************************************
  3. * @file fm33lC0xx_fl_gpio.c
  4. * @author FMSH Application Team
  5. * @brief Src file of GPIO FL Module
  6. ****************************************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) [2019] [Fudan Microelectronics]
  10. * THIS SOFTWARE is licensed under the Mulan PSL v1.
  11. * can use this software according to the terms and conditions of the Mulan PSL v1.
  12. * You may obtain a copy of Mulan PSL v1 at:
  13. * http://license.coscl.org.cn/MulanPSL
  14. * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
  16. * PURPOSE.
  17. * See the Mulan PSL v1 for more details.
  18. *
  19. ****************************************************************************************************
  20. */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "fm33lc0xx_fl_gpio.h"
  23. #include "fm33lc0xx_fl_rcc.h"
  24. #include "fm33_assert.h"
  25. /** @addtogroup FM33LC0XX_FL_Driver
  26. * @{
  27. */
  28. /** @addtogroup GPIO
  29. * @{
  30. */
  31. /* Private macros ------------------------------------------------------------*/
  32. /** @addtogroup GPIO_FL_Private_Macros
  33. * @{
  34. */
  35. #define IS_GPIO_ALL_INSTANCE(INSTANCE) (((INSTANCE) == GPIOA)||\
  36. ((INSTANCE) == GPIOB)||\
  37. ((INSTANCE) == GPIOC)||\
  38. ((INSTANCE) == GPIOD))
  39. #define IS_FL_GPIO_PIN(__VALUE__) ((((uint32_t)0x00000000U) < (__VALUE__)) &&\
  40. ((__VALUE__) <= (FL_GPIO_PIN_ALL)))
  41. #define IS_FL_GPIO_MODE(__VALUE__) (((__VALUE__) == FL_GPIO_MODE_ANALOG)||\
  42. ((__VALUE__) == FL_GPIO_MODE_INPUT)||\
  43. ((__VALUE__) == FL_GPIO_MODE_OUTPUT)||\
  44. ((__VALUE__) == FL_GPIO_MODE_DIGITAL))
  45. #define IS_FL_GPIO_OPENDRAIN(__VALUE__) (((__VALUE__) == FL_GPIO_OUTPUT_OPENDRAIN)||\
  46. ((__VALUE__) == FL_GPIO_OUTPUT_PUSHPULL))
  47. #define IS_FL_GPIO_PULL_UP(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
  48. ((__VALUE__) == FL_ENABLE))
  49. #define IS_FL_GPIO_WKUP_ENTRY(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_INT_ENTRY_NMI)||\
  50. ((__VALUE__) == FL_GPIO_WAKEUP_INT_ENTRY_38))
  51. #define IS_FL_GPIO_WKUP_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_RISING)||\
  52. ((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_FALLING))
  53. #define IS_FL_GPIO_WKUP_NUM(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_0)||\
  54. ((__VALUE__) == FL_GPIO_WAKEUP_1)||\
  55. ((__VALUE__) == FL_GPIO_WAKEUP_2)||\
  56. ((__VALUE__) == FL_GPIO_WAKEUP_3)||\
  57. ((__VALUE__) == FL_GPIO_WAKEUP_4)||\
  58. ((__VALUE__) == FL_GPIO_WAKEUP_5)||\
  59. ((__VALUE__) == FL_GPIO_WAKEUP_6)||\
  60. ((__VALUE__) == FL_GPIO_WAKEUP_7))
  61. /**
  62. * @}
  63. */
  64. /** @addtogroup GPIO_FL_EF_Init
  65. * @{
  66. */
  67. /**
  68. * @brief 复位GPIO外设
  69. * @param GPIOx 外设入口地址
  70. * @param pin 引脚
  71. * @retval 错误状态,可能值:
  72. * -FL_PASS 外设寄存器值恢复复位值
  73. * -FL_FAIL 未成功执行
  74. */
  75. FL_ErrorStatus FL_GPIO_DeInit(GPIO_Type *GPIOx, uint32_t pin)
  76. {
  77. uint32_t pinPos = 0x00000000U;
  78. uint32_t currentPin = 0x00000000U;
  79. /* 入口参数检查 */
  80. assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  81. assert_param(IS_FL_GPIO_PIN(pin));
  82. /* 恢复寄存器值为默认值 */
  83. while(((pin) >> pinPos) != 0x00000000U)
  84. {
  85. /* 获取当前遍历到的Pin脚 */
  86. currentPin = (pin) & (0x00000001U << pinPos);
  87. if(currentPin)
  88. {
  89. FL_GPIO_SetPinMode(GPIOx, currentPin, FL_GPIO_MODE_INPUT);
  90. FL_GPIO_DisablePinInput(GPIOx, currentPin);
  91. FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
  92. FL_GPIO_DisablePinPullup(GPIOx, currentPin);
  93. FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin);
  94. FL_GPIO_DisablePinRemap(GPIOx, currentPin);
  95. }
  96. pinPos++;
  97. }
  98. return FL_PASS;
  99. }
  100. /**
  101. * @brief 根据 GPIO_InitStruct 的配置信息初始化对应外设.
  102. * @param GPIOx GPIO Port
  103. * @param GPIO_InitStruct 指向一个 @ref FL_GPIO_InitTypeDef 结构体
  104. * 其中包含了外设的相关配置信息.
  105. * @retval 错误状态,可能值:
  106. * -FL_FAIL 配置过程发生错误
  107. * -FL_PASS 配置成功
  108. */
  109. FL_ErrorStatus FL_GPIO_Init(GPIO_Type *GPIOx, FL_GPIO_InitTypeDef *initStruct)
  110. {
  111. uint32_t pinPos = 0x00000000U;
  112. uint32_t currentPin = 0x00000000U;
  113. /* 入口参数检查 */
  114. assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  115. assert_param(IS_FL_GPIO_PIN(initStruct->pin));
  116. assert_param(IS_FL_GPIO_MODE(initStruct->mode));
  117. assert_param(IS_FL_GPIO_OPENDRAIN(initStruct->outputType));
  118. assert_param(IS_FL_GPIO_PULL_UP(initStruct->pull));
  119. /* 使能时钟总线 */
  120. FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_PAD);
  121. /* 这里考虑到PIN有可能不止一个因此需要遍历 */
  122. while(((initStruct->pin) >> pinPos) != 0x00000000U)
  123. {
  124. /* 获取当前遍历到的Pin脚 */
  125. currentPin = (initStruct->pin) & (0x00000001U << pinPos);
  126. if(currentPin)
  127. {
  128. /* Pin脚模拟模式设置 */
  129. if(initStruct->mode == FL_GPIO_MODE_ANALOG)
  130. {
  131. FL_GPIO_DisablePinInput(GPIOx, currentPin);
  132. FL_GPIO_DisablePinPullup(GPIOx, currentPin);
  133. FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
  134. FL_GPIO_EnablePinAnalogSwitch(GPIOx, currentPin);
  135. }
  136. else
  137. {
  138. FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin);
  139. /* Pin脚输入使能控制 */
  140. if(initStruct->mode == FL_GPIO_MODE_INPUT)
  141. {
  142. FL_GPIO_EnablePinInput(GPIOx, currentPin);
  143. }
  144. else
  145. {
  146. FL_GPIO_DisablePinInput(GPIOx, currentPin);
  147. }
  148. /* Pin脚输出模式设置 */
  149. if(initStruct->outputType == FL_GPIO_OUTPUT_PUSHPULL)
  150. {
  151. FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin);
  152. }
  153. else
  154. {
  155. FL_GPIO_EnablePinOpenDrain(GPIOx, currentPin);
  156. }
  157. /* Pin脚上拉模式设置 */
  158. if(initStruct->pull)
  159. {
  160. FL_GPIO_EnablePinPullup(GPIOx, currentPin);
  161. }
  162. else
  163. {
  164. FL_GPIO_DisablePinPullup(GPIOx, currentPin);
  165. }
  166. }
  167. /* 数字模式复用功能选择 */
  168. if(initStruct->mode == FL_GPIO_MODE_DIGITAL)
  169. {
  170. /*重定向*/
  171. if(initStruct->remapPin == FL_ENABLE)
  172. {
  173. FL_GPIO_EnablePinRemap(GPIOx, currentPin);
  174. }
  175. else
  176. {
  177. FL_GPIO_DisablePinRemap(GPIOx, currentPin);
  178. }
  179. }
  180. /* Pin脚工作模式设置 */
  181. FL_GPIO_SetPinMode(GPIOx, currentPin, initStruct->mode);
  182. }
  183. pinPos++;
  184. }
  185. return FL_PASS;
  186. }
  187. /**
  188. * @brief 将 @ref FL_GPIO_InitTypeDef 结构体初始化为默认配置
  189. * @param initStruct 指向 @ref FL_GPIO_InitTypeDef 结构体的指针
  190. *
  191. * @retval None
  192. */
  193. void FL_GPIO_StructInit(FL_GPIO_InitTypeDef *initStruct)
  194. {
  195. /* 复位配置信息 */
  196. initStruct->pin = FL_GPIO_PIN_ALL;
  197. initStruct->mode = FL_GPIO_MODE_INPUT;
  198. initStruct->outputType = FL_GPIO_OUTPUT_OPENDRAIN;
  199. initStruct->pull = FL_DISABLE;
  200. initStruct->remapPin = FL_DISABLE;
  201. }
  202. /**
  203. * @brief 根据 FL_WKUP_InitTypeDef 配置GPIO唤醒对应外设
  204. * @param initStruct 指向一个 @ref FL_WKUP_InitTypeDef 结构体
  205. * 其中包含了外设的相关配置信息.
  206. * @param wakeup 唤醒入口
  207. * FL_GPIO_WAKEUP_0
  208. * FL_GPIO_WAKEUP_1
  209. * FL_GPIO_WAKEUP_2
  210. * FL_GPIO_WAKEUP_3
  211. * FL_GPIO_WAKEUP_4
  212. * FL_GPIO_WAKEUP_5
  213. * FL_GPIO_WAKEUP_6
  214. * FL_GPIO_WAKEUP_7
  215. * @retval 错误状态,可能值:
  216. * -FL_FAIL 配置过程发生错误
  217. * -FL_PASS 配置成功
  218. */
  219. FL_ErrorStatus FL_WKUP_Init(FL_WKUP_InitTypeDef *initStruct, uint32_t wakeup)
  220. {
  221. /* 入口参数检查 */
  222. assert_param(IS_FL_GPIO_WKUP_NUM(wakeup));
  223. assert_param(IS_FL_GPIO_WKUP_EDGE(initStruct->polarity));
  224. FL_GPIO_EnableWakeup(GPIO, wakeup);
  225. FL_GPIO_SetWakeupEdge(GPIO, wakeup, initStruct->polarity);
  226. return FL_PASS;
  227. }
  228. /**
  229. * @brief 去初始化Wakeup配置
  230. * @param Wkupx 唤醒入口
  231. * FL_GPIO_WKUP_0
  232. * FL_GPIO_WKUP_1
  233. * FL_GPIO_WKUP_2
  234. * FL_GPIO_WKUP_3
  235. * FL_GPIO_WKUP_4
  236. * FL_GPIO_WKUP_5
  237. * FL_GPIO_WKUP_6
  238. * FL_GPIO_WKUP_7
  239. * @retval 错误状态,可能值:
  240. * -FL_FAIL 配置过程发生错误
  241. * -FL_PASS 配置成功
  242. */
  243. FL_ErrorStatus FL_WKUP_DeInit(uint32_t wkupx)
  244. {
  245. /* 入口参数检查 */
  246. assert_param(IS_FL_GPIO_WKUP_NUM(wkupx));
  247. FL_GPIO_EnableWakeup(GPIO, wkupx);
  248. return FL_PASS;
  249. }
  250. /**
  251. * @brief 将 @ref FL_WKUP_InitTypeDef 结构体初始化为默认配置
  252. * @param initStruct_Wakeup 指向需要将值设置为默认配置的结构体 @ref FL_WKUP_InitTypeDef 结构体
  253. *
  254. * @retval None
  255. */
  256. void FL_WKUP_StructInit(FL_WKUP_InitTypeDef *initStruct_Wakeup)
  257. {
  258. /* 复位配置信息 */
  259. initStruct_Wakeup->polarity = FL_GPIO_WAKEUP_TRIGGER_FALLING;
  260. }
  261. /**
  262. *@}
  263. */
  264. /** @addtogroup RNG_FL_EF_Operation
  265. * @{
  266. */
  267. /**
  268. * @brief 设置所有GPIO为输入模式、输入使能关闭(高阻态),SWD接口除外。
  269. * @note PD7和PD8为调试接口
  270. *
  271. * @param None
  272. *
  273. * @retval None
  274. */
  275. void FL_GPIO_ALLPIN_LPM_MODE(void)
  276. {
  277. FL_GPIO_DeInit(GPIOA, FL_GPIO_PIN_ALL);
  278. FL_GPIO_DeInit(GPIOB, FL_GPIO_PIN_ALL);
  279. FL_GPIO_DeInit(GPIOC, FL_GPIO_PIN_ALL);
  280. FL_GPIO_DeInit(GPIOD, FL_GPIO_PIN_ALL_EXCEPTSWD);
  281. }
  282. /**
  283. * @}
  284. */
  285. /**
  286. * @}
  287. */
  288. /**
  289. * @}
  290. */
  291. /*************************************************************END OF FILE************************************************************/