fm33lc0xx_fl_exti.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /**
  2. ****************************************************************************************************
  3. * @file fm33lc0xx_fl_exti.c
  4. * @author FMSH Application Team
  5. * @brief Src file of EXTI 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_exti.h"
  23. #include "fm33_assert.h"
  24. /** @addtogroup FM33LC0XX_FL_Driver_EXTI
  25. * @{
  26. */
  27. /* Private macros ------------------------------------------------------------*/
  28. /** @addtogroup EXTI_FL_Private_Macros
  29. * @{
  30. */
  31. #define IS_EXTI_ALL_INSTANCE(INSTANCE) (((INSTANCE) == FL_GPIO_EXTI_LINE_0)||\
  32. ((INSTANCE) == FL_GPIO_EXTI_LINE_1)||\
  33. ((INSTANCE) == FL_GPIO_EXTI_LINE_2)||\
  34. ((INSTANCE) == FL_GPIO_EXTI_LINE_3)||\
  35. ((INSTANCE) == FL_GPIO_EXTI_LINE_4)||\
  36. ((INSTANCE) == FL_GPIO_EXTI_LINE_5)||\
  37. ((INSTANCE) == FL_GPIO_EXTI_LINE_6)||\
  38. ((INSTANCE) == FL_GPIO_EXTI_LINE_7)||\
  39. ((INSTANCE) == FL_GPIO_EXTI_LINE_8)||\
  40. ((INSTANCE) == FL_GPIO_EXTI_LINE_9)||\
  41. ((INSTANCE) == FL_GPIO_EXTI_LINE_10)||\
  42. ((INSTANCE) == FL_GPIO_EXTI_LINE_11)||\
  43. ((INSTANCE) == FL_GPIO_EXTI_LINE_12)||\
  44. ((INSTANCE) == FL_GPIO_EXTI_LINE_13)||\
  45. ((INSTANCE) == FL_GPIO_EXTI_LINE_14))
  46. #define IS_EXTI_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_RCC_EXTI_CLK_SOURCE_HCLK)||\
  47. ((__VALUE__) == FL_RCC_EXTI_CLK_SOURCE_LSCLK))
  48. #define IS_EXTI_INPUT_GROUP(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP0)||\
  49. ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP1)||\
  50. ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP2)||\
  51. ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP3))
  52. #define IS_EXTI_TRIG_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_RISING)||\
  53. ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_FALLING)||\
  54. ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_BOTH))
  55. #define IS_EXTI_FILTER(__VALUE__) (((__VALUE__) == FL_ENABLE)||\
  56. ((__VALUE__) == FL_DISABLE))
  57. /**
  58. * @}
  59. */
  60. /* Private macros ------------------------------------------------------------*/
  61. /** @addtogroup EXTI_FL_Private_Consts
  62. * @{
  63. */
  64. typedef void (*pSetExtiLineFunc)(GPIO_COMMON_Type *, uint32_t);
  65. static const pSetExtiLineFunc setExtiLineFuncs[] =
  66. {
  67. FL_GPIO_SetExtiLine0,
  68. FL_GPIO_SetExtiLine1,
  69. FL_GPIO_SetExtiLine2,
  70. FL_GPIO_SetExtiLine3,
  71. FL_GPIO_SetExtiLine4,
  72. FL_GPIO_SetExtiLine5,
  73. FL_GPIO_SetExtiLine6,
  74. FL_GPIO_SetExtiLine7,
  75. FL_GPIO_SetExtiLine8,
  76. FL_GPIO_SetExtiLine9,
  77. FL_GPIO_SetExtiLine10,
  78. NULL,
  79. FL_GPIO_SetExtiLine12,
  80. FL_GPIO_SetExtiLine13,
  81. FL_GPIO_SetExtiLine14,
  82. };
  83. typedef void (*pSetTrigEdgeFunc)(GPIO_COMMON_Type *, uint32_t, uint32_t);
  84. static const pSetTrigEdgeFunc setTrigEdgeFuncs[] =
  85. {
  86. FL_GPIO_SetTriggerEdge,
  87. };
  88. /**
  89. * @}
  90. */
  91. /** @addtogroup EXTI_FL_EF_Init
  92. * @{
  93. */
  94. /**
  95. * @brief EXTI通用配置设置
  96. *
  97. * @param EXTI_CommonInitStruct 指向 @ref FL_EXTI_CommonInitTypeDef 类型的结构体,它包含EXTI外设通用配置信息
  98. *
  99. * @retval ErrorStatus枚举值
  100. * -FL_FAIL 配置过程发生错误
  101. * -FL_PASS EXTI配置成功
  102. */
  103. FL_ErrorStatus FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
  104. {
  105. assert_param(IS_EXTI_CLK_SOURCE(EXTI_CommonInitStruct->clockSource));
  106. // 使能IO时钟寄存器总线时钟
  107. FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_PAD);
  108. // 使能并配置外部中断时钟源
  109. FL_RCC_EnableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);
  110. FL_RCC_SetEXTIClockSource(EXTI_CommonInitStruct->clockSource);
  111. return FL_PASS;
  112. }
  113. /**
  114. * @brief 复位EXTI通用配置设置
  115. *
  116. * @retval ErrorStatus枚举值
  117. * -FL_FAIL 发生错误
  118. * -FL_PASS EXTI通用设置复位成功
  119. */
  120. FL_ErrorStatus FL_EXTI_CommonDeinit(void)
  121. {
  122. // 关闭外部中断时钟源
  123. FL_RCC_DisableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);
  124. return FL_PASS;
  125. }
  126. /**
  127. * @brief 设置 EXTI_CommonInitStruct 为默认配置
  128. * @param EXTI_CommonInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_CommonInitTypeDef 结构体
  129. *
  130. * @retval None
  131. */
  132. void FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
  133. {
  134. EXTI_CommonInitStruct->clockSource = FL_RCC_EXTI_CLK_SOURCE_LSCLK;
  135. }
  136. /**
  137. * @brief EXTI配置设置
  138. *
  139. * @param extiLineX 外设入口地址
  140. * @param EXTI_InitStruct 指向 @ref FL_EXTI_InitTypeDef 类型的结构体,它包含EXTI外设配置信息
  141. *
  142. * @retval ErrorStatus枚举值
  143. * -FL_FAIL 配置过程发生错误
  144. * -FL_PASS EXTI配置成功
  145. */
  146. FL_ErrorStatus FL_EXTI_Init(uint32_t extiLineX, FL_EXTI_InitTypeDef *EXTI_InitStruct)
  147. {
  148. uint8_t extiLineId;
  149. uint32_t tmpExtiLineX;
  150. // 检查参数合法性
  151. assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
  152. assert_param(IS_EXTI_INPUT_GROUP(EXTI_InitStruct->input));
  153. assert_param(IS_EXTI_TRIG_EDGE(EXTI_InitStruct->triggerEdge));
  154. assert_param(IS_EXTI_FILTER(EXTI_InitStruct->filter));
  155. // 获取EXTI中断线对应id号
  156. tmpExtiLineX = extiLineX;
  157. for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
  158. // 设置中断线连接的IO
  159. setExtiLineFuncs[extiLineId](GPIO, EXTI_InitStruct->input << (2 * extiLineId));
  160. // 设置数字滤波
  161. EXTI_InitStruct->filter == FL_ENABLE ? FL_GPIO_EnableDigitalFilter(GPIO, extiLineX) : FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
  162. // 设置中断线触发边沿
  163. setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, EXTI_InitStruct->triggerEdge);
  164. // 延时需要大于1个32K的周期
  165. FL_DelayUs(50);
  166. // 清除外部中断标志
  167. FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
  168. // 清除中断挂起
  169. NVIC_ClearPendingIRQ(GPIO_IRQn);
  170. return FL_PASS;
  171. }
  172. /**
  173. * @brief 复位EXTI配置设置
  174. *
  175. * @retval ErrorStatus枚举值
  176. * -FL_FAIL 发生错误
  177. * -FL_PASS EXTI设置复位成功
  178. */
  179. FL_ErrorStatus FL_EXTI_DeInit(uint32_t extiLineX)
  180. {
  181. uint8_t extiLineId;
  182. uint32_t tmpExtiLineX;
  183. // 检查参数合法性
  184. assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
  185. // 获取EXTI中断线对应id号
  186. tmpExtiLineX = extiLineX;
  187. for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
  188. // 清除外部中断标志
  189. FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
  190. // 中断线触发边沿禁止
  191. setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE);
  192. // 禁止数字滤波
  193. FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
  194. return FL_PASS;
  195. }
  196. /**
  197. * @brief 设置 EXTI_InitStruct 为默认配置
  198. * @param EXTI_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_InitTypeDef 结构体
  199. *
  200. * @retval None
  201. */
  202. void FL_EXTI_StructInit(FL_EXTI_InitTypeDef *EXTI_InitStruct)
  203. {
  204. EXTI_InitStruct->filter = FL_DISABLE;
  205. EXTI_InitStruct->input = FL_GPIO_EXTI_INPUT_GROUP0;
  206. EXTI_InitStruct->triggerEdge = FL_GPIO_EXTI_TRIGGER_EDGE_RISING;
  207. }
  208. /**
  209. * @}
  210. */
  211. /**
  212. * @}
  213. */
  214. /*************************************************************END OF FILE************************************************************/