SWM320_exti.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_exti.c
  3. * 功能说明: SWM320单片机的外部中断功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2017年10月25日
  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 "SWM320.h"
  21. #include "SWM320_exti.h"
  22. /******************************************************************************************************************************************
  23. * 函数名称: EXTI_Init()
  24. * 功能说明: 指定引脚外部中断初始化
  25. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  26. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  27. * uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
  28. * 输 出: 无
  29. * 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
  30. * 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
  31. ******************************************************************************************************************************************/
  32. void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
  33. {
  34. EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
  35. if(mode & 0x10)
  36. {
  37. GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
  38. if(mode & 0x01)
  39. GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
  40. else
  41. GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
  42. }
  43. else
  44. {
  45. GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
  46. if(mode & 0x02)
  47. {
  48. GPIOx->INTBE |= (0x01 << n); //双边沿触发
  49. }
  50. else
  51. {
  52. GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
  53. if(mode & 0x01)
  54. GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
  55. else
  56. GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
  57. }
  58. }
  59. GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
  60. }
  61. /******************************************************************************************************************************************
  62. * 函数名称: EXTI_Open()
  63. * 功能说明: 指定引脚外部中断打开(即使能)
  64. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  65. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  66. * 输 出: 无
  67. * 注意事项: 无
  68. ******************************************************************************************************************************************/
  69. void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
  70. {
  71. GPIOx->INTEN |= (0x01 << n);
  72. }
  73. /******************************************************************************************************************************************
  74. * 函数名称: EXTI_Close()
  75. * 功能说明: 指定引脚外部中断关闭(即禁能)
  76. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  77. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  78. * 输 出: 无
  79. * 注意事项: 无
  80. ******************************************************************************************************************************************/
  81. void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
  82. {
  83. GPIOx->INTEN &= ~(0x01 << n);
  84. }
  85. /******************************************************************************************************************************************
  86. * 函数名称: EXTI_State()
  87. * 功能说明: 指定引脚是否触发了中断
  88. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  89. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  90. * 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
  91. * 注意事项: 无
  92. ******************************************************************************************************************************************/
  93. uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
  94. {
  95. return (GPIOx->INTSTAT >> n) & 0x01;
  96. }
  97. /******************************************************************************************************************************************
  98. * 函数名称: EXTI_RawState()
  99. * 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
  100. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  101. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  102. * 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
  103. * 注意事项: 无
  104. ******************************************************************************************************************************************/
  105. uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
  106. {
  107. return (GPIOx->INTRAWSTAT >> n) & 0x01;
  108. }
  109. /******************************************************************************************************************************************
  110. * 函数名称: EXTI_Clear()
  111. * 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
  112. * 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
  113. * uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  114. * 输 出: 无
  115. * 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
  116. ******************************************************************************************************************************************/
  117. void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
  118. {
  119. GPIOx->INTCLR = (0x01 << n);
  120. }