You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

459 lines
16 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32h7xx_ll_exti.c
  4. * @author MCD Application Team
  5. * @brief EXTI LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. #if defined(USE_FULL_LL_DRIVER)
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "stm32h7xx_ll_exti.h"
  22. #ifdef USE_FULL_ASSERT
  23. #include "stm32_assert.h"
  24. #else
  25. #define assert_param(expr) ((void)0U)
  26. #endif
  27. /** @addtogroup STM32H7xx_LL_Driver
  28. * @{
  29. */
  30. #if defined (EXTI)
  31. /** @defgroup EXTI_LL EXTI
  32. * @{
  33. */
  34. /* Private types -------------------------------------------------------------*/
  35. /* Private variables ---------------------------------------------------------*/
  36. /* Private constants ---------------------------------------------------------*/
  37. /* Private macros ------------------------------------------------------------*/
  38. /** @addtogroup EXTI_LL_Private_Macros
  39. * @{
  40. */
  41. #define IS_LL_EXTI_LINE_0_31(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U)
  42. #define IS_LL_EXTI_LINE_32_63(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_32_63) == 0x00000000U)
  43. #define IS_LL_EXTI_LINE_64_95(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_64_95) == 0x00000000U)
  44. #define IS_LL_EXTI_MODE(__VALUE__) (((__VALUE__) == LL_EXTI_MODE_IT) \
  45. || ((__VALUE__) == LL_EXTI_MODE_EVENT) \
  46. || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT))
  47. #define IS_LL_EXTI_TRIGGER(__VALUE__) (((__VALUE__) == LL_EXTI_TRIGGER_NONE) \
  48. || ((__VALUE__) == LL_EXTI_TRIGGER_RISING) \
  49. || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING) \
  50. || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING))
  51. /**
  52. * @}
  53. */
  54. /* Private function prototypes -----------------------------------------------*/
  55. /* Exported functions --------------------------------------------------------*/
  56. /** @addtogroup EXTI_LL_Exported_Functions
  57. * @{
  58. */
  59. /** @addtogroup EXTI_LL_EF_Init
  60. * @{
  61. */
  62. /**
  63. * @brief De-initialize the EXTI registers to their default reset values.
  64. * @retval An ErrorStatus enumeration value:
  65. * - SUCCESS: EXTI registers are de-initialized
  66. * - ERROR: not applicable
  67. */
  68. ErrorStatus LL_EXTI_DeInit(void)
  69. {
  70. /* Rising Trigger selection register set to default reset values */
  71. LL_EXTI_WriteReg(RTSR1, 0x00000000U);
  72. LL_EXTI_WriteReg(RTSR2, 0x00000000U);
  73. LL_EXTI_WriteReg(RTSR3, 0x00000000U);
  74. /* Falling Trigger selection register set to default reset values */
  75. LL_EXTI_WriteReg(FTSR1, 0x00000000U);
  76. LL_EXTI_WriteReg(FTSR2, 0x00000000U);
  77. LL_EXTI_WriteReg(FTSR3, 0x00000000U);
  78. /* Software interrupt event register set to default reset values */
  79. LL_EXTI_WriteReg(SWIER1, 0x00000000U);
  80. LL_EXTI_WriteReg(SWIER2, 0x00000000U);
  81. LL_EXTI_WriteReg(SWIER3, 0x00000000U);
  82. /* D3 Pending register set to default reset values */
  83. LL_EXTI_WriteReg(D3PMR1, 0x00000000U);
  84. LL_EXTI_WriteReg(D3PMR2, 0x00000000U);
  85. LL_EXTI_WriteReg(D3PMR3, 0x00000000U);
  86. /* D3 Pending clear selection register low to default reset values */
  87. LL_EXTI_WriteReg(D3PCR1L, 0x00000000U);
  88. LL_EXTI_WriteReg(D3PCR2L, 0x00000000U);
  89. LL_EXTI_WriteReg(D3PCR3L, 0x00000000U);
  90. /* D3 Pending clear selection register high to default reset values */
  91. LL_EXTI_WriteReg(D3PCR1H, 0x00000000U);
  92. LL_EXTI_WriteReg(D3PCR2H, 0x00000000U);
  93. LL_EXTI_WriteReg(D3PCR3H, 0x00000000U);
  94. /* Interrupt mask register set to default reset values */
  95. LL_EXTI_WriteReg(IMR1, 0x00000000U);
  96. LL_EXTI_WriteReg(IMR2, 0x00000000U);
  97. LL_EXTI_WriteReg(IMR3, 0x00000000U);
  98. /* Event mask register set to default reset values */
  99. LL_EXTI_WriteReg(EMR1, 0x00000000U);
  100. LL_EXTI_WriteReg(EMR2, 0x00000000U);
  101. LL_EXTI_WriteReg(EMR3, 0x00000000U);
  102. /* Clear Pending requests */
  103. LL_EXTI_WriteReg(PR1, EXTI_PR1_PR_Msk);
  104. LL_EXTI_WriteReg(PR2, EXTI_PR2_PR_Msk);
  105. LL_EXTI_WriteReg(PR3, EXTI_PR3_PR_Msk);
  106. #if defined(DUAL_CORE)
  107. /* Interrupt mask register set to default reset values for Core 2 (Coretx-M4)*/
  108. LL_EXTI_WriteReg(C2IMR1, 0x00000000U);
  109. LL_EXTI_WriteReg(C2IMR2, 0x00000000U);
  110. LL_EXTI_WriteReg(C2IMR3, 0x00000000U);
  111. /* Event mask register set to default reset values */
  112. LL_EXTI_WriteReg(C2EMR1, 0x00000000U);
  113. LL_EXTI_WriteReg(C2EMR2, 0x00000000U);
  114. LL_EXTI_WriteReg(C2EMR3, 0x00000000U);
  115. /* Clear Pending requests */
  116. LL_EXTI_WriteReg(C2PR1, EXTI_PR1_PR_Msk);
  117. LL_EXTI_WriteReg(C2PR2, EXTI_PR2_PR_Msk);
  118. LL_EXTI_WriteReg(C2PR3, EXTI_PR3_PR_Msk);
  119. #endif /* DUAL_CORE*/
  120. return SUCCESS;
  121. }
  122. /**
  123. * @brief Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct.
  124. * @param EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure.
  125. * @retval An ErrorStatus enumeration value:
  126. * - SUCCESS: EXTI registers are initialized
  127. * - ERROR: not applicable
  128. */
  129. ErrorStatus LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)
  130. {
  131. ErrorStatus status = SUCCESS;
  132. /* Check the parameters */
  133. assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31));
  134. assert_param(IS_LL_EXTI_LINE_32_63(EXTI_InitStruct->Line_32_63));
  135. assert_param(IS_LL_EXTI_LINE_64_95(EXTI_InitStruct->Line_64_95));
  136. assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand));
  137. assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode));
  138. /* ENABLE LineCommand */
  139. if (EXTI_InitStruct->LineCommand != DISABLE)
  140. {
  141. assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger));
  142. /* Configure EXTI Lines in range from 0 to 31 */
  143. if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE)
  144. {
  145. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_IT) == LL_EXTI_MODE_IT)
  146. {
  147. /* Enable IT on provided Lines for Cortex-M7*/
  148. LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31);
  149. }
  150. else
  151. {
  152. /* Disable IT on provided Lines for Cortex-M7*/
  153. LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
  154. }
  155. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_EVENT) == LL_EXTI_MODE_EVENT)
  156. {
  157. /* Enable event on provided Lines for Cortex-M7 */
  158. LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
  159. }
  160. else
  161. {
  162. /* Disable event on provided Lines for Cortex-M7 */
  163. LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
  164. }
  165. #if defined(DUAL_CORE)
  166. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_IT) == LL_EXTI_MODE_C2_IT)
  167. {
  168. /* Enable IT on provided Lines for Cortex-M4 */
  169. LL_C2_EXTI_EnableIT_0_31 (EXTI_InitStruct->Line_0_31);
  170. }
  171. else
  172. {
  173. /* Disable IT on provided Lines for Cortex-M4*/
  174. LL_C2_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
  175. }
  176. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_EVENT) == LL_EXTI_MODE_C2_EVENT)
  177. {
  178. /* Enable event on provided Lines for Cortex-M4 */
  179. LL_C2_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
  180. }
  181. else
  182. {
  183. /* Disable event on provided Lines for Cortex-M4*/
  184. LL_C2_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
  185. }
  186. #endif /* DUAL_CORE */
  187. if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
  188. {
  189. switch (EXTI_InitStruct->Trigger)
  190. {
  191. case LL_EXTI_TRIGGER_RISING:
  192. /* First Disable Falling Trigger on provided Lines */
  193. LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
  194. /* Then Enable Rising Trigger on provided Lines */
  195. LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
  196. break;
  197. case LL_EXTI_TRIGGER_FALLING:
  198. /* First Disable Rising Trigger on provided Lines */
  199. LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
  200. /* Then Enable Falling Trigger on provided Lines */
  201. LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
  202. break;
  203. case LL_EXTI_TRIGGER_RISING_FALLING:
  204. LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
  205. LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
  206. break;
  207. default:
  208. status = ERROR;
  209. break;
  210. }
  211. }
  212. }
  213. /* Configure EXTI Lines in range from 32 to 63 */
  214. if (EXTI_InitStruct->Line_32_63 != LL_EXTI_LINE_NONE)
  215. {
  216. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_IT) == LL_EXTI_MODE_IT)
  217. {
  218. /* Enable IT on provided Lines for Cortex-M7*/
  219. LL_EXTI_EnableIT_32_63(EXTI_InitStruct->Line_32_63);
  220. }
  221. else
  222. {
  223. /* Disable IT on provided Lines for Cortex-M7*/
  224. LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63);
  225. }
  226. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_EVENT) == LL_EXTI_MODE_EVENT)
  227. {
  228. /* Enable event on provided Lines for Cortex-M7 */
  229. LL_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63);
  230. }
  231. else
  232. {
  233. /* Disable event on provided Lines for Cortex-M7 */
  234. LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
  235. }
  236. #if defined(DUAL_CORE)
  237. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_IT) == LL_EXTI_MODE_C2_IT)
  238. {
  239. /* Enable IT on provided Lines for Cortex-M4 */
  240. LL_C2_EXTI_EnableIT_32_63 (EXTI_InitStruct->Line_32_63);
  241. }
  242. else
  243. {
  244. /* Disable IT on provided Lines for Cortex-M4 */
  245. LL_C2_EXTI_DisableIT_32_63 (EXTI_InitStruct->Line_32_63);
  246. }
  247. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_EVENT) == LL_EXTI_MODE_C2_EVENT)
  248. {
  249. /* Enable event on provided Lines for Cortex-M4 */
  250. LL_C2_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63);
  251. }
  252. else
  253. {
  254. /* Disable event on provided Lines for Cortex-M4 */
  255. LL_C2_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
  256. }
  257. #endif /* DUAL_CORE */
  258. if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
  259. {
  260. switch (EXTI_InitStruct->Trigger)
  261. {
  262. case LL_EXTI_TRIGGER_RISING:
  263. /* First Disable Falling Trigger on provided Lines */
  264. LL_EXTI_DisableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
  265. /* Then Enable IT on provided Lines */
  266. LL_EXTI_EnableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
  267. break;
  268. case LL_EXTI_TRIGGER_FALLING:
  269. /* First Disable Rising Trigger on provided Lines */
  270. LL_EXTI_DisableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
  271. /* Then Enable Falling Trigger on provided Lines */
  272. LL_EXTI_EnableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
  273. break;
  274. case LL_EXTI_TRIGGER_RISING_FALLING:
  275. LL_EXTI_EnableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
  276. LL_EXTI_EnableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
  277. break;
  278. default:
  279. status = ERROR;
  280. break;
  281. }
  282. }
  283. }
  284. /* Configure EXTI Lines in range from 64 to 95 */
  285. if (EXTI_InitStruct->Line_64_95 != LL_EXTI_LINE_NONE)
  286. {
  287. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_IT) == LL_EXTI_MODE_IT)
  288. {
  289. /* Enable IT on provided Lines for Cortex-M7*/
  290. LL_EXTI_EnableIT_64_95(EXTI_InitStruct->Line_64_95);
  291. }
  292. else
  293. {
  294. /* Disable IT on provided Lines for Cortex-M7*/
  295. LL_EXTI_DisableIT_64_95(EXTI_InitStruct->Line_64_95);
  296. }
  297. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_EVENT) == LL_EXTI_MODE_EVENT)
  298. {
  299. /* Enable event on provided Lines for Cortex-M7 */
  300. LL_EXTI_EnableEvent_64_95(EXTI_InitStruct->Line_64_95);
  301. }
  302. else
  303. {
  304. /* Disable event on provided Lines for Cortex-M7 */
  305. LL_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
  306. }
  307. #if defined(DUAL_CORE)
  308. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_IT) == LL_EXTI_MODE_C2_IT)
  309. {
  310. /* Enable IT on provided Lines for Cortex-M4 */
  311. LL_C2_EXTI_EnableIT_64_95 (EXTI_InitStruct->Line_64_95);
  312. }
  313. else
  314. {
  315. /* Disable IT on provided Lines for Cortex-M4 */
  316. LL_C2_EXTI_DisableIT_64_95 (EXTI_InitStruct->Line_64_95);
  317. }
  318. if((EXTI_InitStruct->Mode & LL_EXTI_MODE_C2_EVENT) == LL_EXTI_MODE_C2_EVENT)
  319. {
  320. /* Enable event on provided Lines for Cortex-M4 */
  321. LL_C2_EXTI_EnableEvent_64_95(EXTI_InitStruct->Line_64_95);
  322. }
  323. else
  324. {
  325. /* Disable event on provided Lines for Cortex-M4 */
  326. LL_C2_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
  327. }
  328. #endif /* DUAL_CORE */
  329. if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
  330. {
  331. switch (EXTI_InitStruct->Trigger)
  332. {
  333. case LL_EXTI_TRIGGER_RISING:
  334. /* First Disable Falling Trigger on provided Lines */
  335. LL_EXTI_DisableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
  336. /* Then Enable IT on provided Lines */
  337. LL_EXTI_EnableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
  338. break;
  339. case LL_EXTI_TRIGGER_FALLING:
  340. /* First Disable Rising Trigger on provided Lines */
  341. LL_EXTI_DisableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
  342. /* Then Enable Falling Trigger on provided Lines */
  343. LL_EXTI_EnableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
  344. break;
  345. case LL_EXTI_TRIGGER_RISING_FALLING:
  346. LL_EXTI_EnableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
  347. LL_EXTI_EnableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
  348. break;
  349. default:
  350. status = ERROR;
  351. break;
  352. }
  353. }
  354. }
  355. }
  356. else /* DISABLE LineCommand */
  357. {
  358. /* Disable IT on provided Lines for Cortex-M7*/
  359. LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
  360. LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63);
  361. LL_EXTI_DisableIT_64_95(EXTI_InitStruct->Line_64_95);
  362. /* Disable event on provided Lines for Cortex-M7 */
  363. LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
  364. LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
  365. LL_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
  366. #if defined(DUAL_CORE)
  367. /* Disable IT on provided Lines for Cortex-M4*/
  368. LL_C2_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
  369. LL_C2_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63);
  370. LL_C2_EXTI_DisableIT_64_95(EXTI_InitStruct->Line_64_95);
  371. /* Disable event on provided Lines for Cortex-M4 */
  372. LL_C2_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
  373. LL_C2_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
  374. LL_C2_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
  375. #endif /* DUAL_CORE */
  376. }
  377. return status;
  378. }
  379. /**
  380. * @brief Set each @ref LL_EXTI_InitTypeDef field to default value.
  381. * @param EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure.
  382. * @retval None
  383. */
  384. void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)
  385. {
  386. EXTI_InitStruct->Line_0_31 = LL_EXTI_LINE_NONE;
  387. EXTI_InitStruct->Line_32_63 = LL_EXTI_LINE_NONE;
  388. EXTI_InitStruct->Line_64_95 = LL_EXTI_LINE_NONE;
  389. EXTI_InitStruct->LineCommand = DISABLE;
  390. EXTI_InitStruct->Mode = LL_EXTI_MODE_IT;
  391. EXTI_InitStruct->Trigger = LL_EXTI_TRIGGER_FALLING;
  392. }
  393. /**
  394. * @}
  395. */
  396. /**
  397. * @}
  398. */
  399. /**
  400. * @}
  401. */
  402. #endif /* defined (EXTI) */
  403. /**
  404. * @}
  405. */
  406. #endif /* USE_FULL_LL_DRIVER */
  407. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/