SWM341_exti.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM341_exti.c
  3. * 功能说明: SWM341单片机的外部中断功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.0.0 2016年1月30日
  7. * 升级记录:
  8. *
  9. *******************************************************************************************************************************************
  10. * @attention
  11. *
  12. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  13. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  14. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  15. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  16. * -ECTION WITH THEIR PRODUCTS.
  17. *
  18. * COPYRIGHT 2012 Synwit Technology
  19. *******************************************************************************************************************************************/
  20. #include "SWM341.h"
  21. #include "SWM341_exti.h"
  22. /******************************************************************************************************************************************
  23. * 函数名称: EXTI_Init()
  24. * 功能说明: 指定引脚外部中断初始化
  25. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  26. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  27. * uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
  28. * 输 出: 无
  29. * 注意事项: 无
  30. ******************************************************************************************************************************************/
  31. void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
  32. {
  33. EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
  34. if(mode & 0x10)
  35. {
  36. GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
  37. if(mode & 0x01)
  38. GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
  39. else
  40. GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
  41. }
  42. else
  43. {
  44. GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
  45. if(mode & 0x02)
  46. {
  47. GPIOx->INTBE |= (0x01 << n); //双边沿触发
  48. }
  49. else
  50. {
  51. GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
  52. if(mode & 0x01)
  53. GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
  54. else
  55. GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
  56. }
  57. }
  58. GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
  59. }
  60. /******************************************************************************************************************************************
  61. * 函数名称: EXTI_Open()
  62. * 功能说明: 指定引脚外部中断打开(即使能)
  63. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  64. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  65. * 输 出: 无
  66. * 注意事项: 无
  67. ******************************************************************************************************************************************/
  68. void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
  69. {
  70. GPIOx->INTEN |= (0x01 << n);
  71. }
  72. /******************************************************************************************************************************************
  73. * 函数名称: EXTI_Close()
  74. * 功能说明: 指定引脚外部中断关闭(即禁能)
  75. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  76. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  77. * 输 出: 无
  78. * 注意事项: 无
  79. ******************************************************************************************************************************************/
  80. void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
  81. {
  82. GPIOx->INTEN &= ~(0x01 << n);
  83. }
  84. /******************************************************************************************************************************************
  85. * 函数名称: EXTI_State()
  86. * 功能说明: 指定引脚是否触发了中断
  87. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  88. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  89. * 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
  90. * 注意事项: 无
  91. ******************************************************************************************************************************************/
  92. uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
  93. {
  94. return (GPIOx->INTSTAT >> n) & 0x01;
  95. }
  96. /******************************************************************************************************************************************
  97. * 函数名称: EXTI_RawState()
  98. * 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
  99. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  100. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  101. * 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
  102. * 注意事项: 无
  103. ******************************************************************************************************************************************/
  104. uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
  105. {
  106. return (GPIOx->INTRAWSTAT >> n) & 0x01;
  107. }
  108. /******************************************************************************************************************************************
  109. * 函数名称: EXTI_Clear()
  110. * 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
  111. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  112. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  113. * 输 出: 无
  114. * 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
  115. ******************************************************************************************************************************************/
  116. void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
  117. {
  118. GPIOx->INTCLR = (0x01 << n);
  119. }