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 /******************************************************************************************************************************************
24 * 函数名称: EXTI_Init()
25 * 功能说明: 指定引脚外部中断初始化
26 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
27 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
28 *           uint32_t mode      有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
29 * 输    出: 无
30 * 注意事项: 无
31 ******************************************************************************************************************************************/
EXTI_Init(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t mode)32 void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
33 {
34     EXTI_Close(GPIOx, n);           //配置关键寄存器前先关闭
35 
36     if(mode & 0x10)
37     {
38         GPIOx->INTLVLTRG |= (0x01 << n);            //电平触发
39 
40         if(mode & 0x01)
41             GPIOx->INTRISEEN |= (0x01 << n);                //高电平触发
42         else
43             GPIOx->INTRISEEN &= ~(0x01 << n);               //低电平触发
44     }
45     else
46     {
47         GPIOx->INTLVLTRG &= ~(0x01 << n);           //边沿触发
48 
49         if(mode & 0x02)
50         {
51             GPIOx->INTBE |= (0x01 << n);                //双边沿触发
52         }
53         else
54         {
55             GPIOx->INTBE &= ~(0x01 << n);               //单边沿触发
56 
57             if(mode & 0x01)
58                 GPIOx->INTRISEEN |= (0x01 << n);            //上升沿触发
59             else
60                 GPIOx->INTRISEEN &= ~(0x01 << n);           //下降沿触发
61         }
62     }
63 
64     GPIOx->INTCLR = (1 << n);       //清除掉因为模式配置可能产生的中断
65 }
66 
67 /******************************************************************************************************************************************
68 * 函数名称: EXTI_Open()
69 * 功能说明: 指定引脚外部中断打开(即使能)
70 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
71 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
72 * 输    出: 无
73 * 注意事项: 无
74 ******************************************************************************************************************************************/
EXTI_Open(GPIO_TypeDef * GPIOx,uint32_t n)75 void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
76 {
77     GPIOx->INTEN |= (0x01 << n);
78 }
79 
80 /******************************************************************************************************************************************
81 * 函数名称: EXTI_Close()
82 * 功能说明: 指定引脚外部中断关闭(即禁能)
83 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
84 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
85 * 输    出: 无
86 * 注意事项: 无
87 ******************************************************************************************************************************************/
EXTI_Close(GPIO_TypeDef * GPIOx,uint32_t n)88 void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
89 {
90     GPIOx->INTEN &= ~(0x01 << n);
91 }
92 
93 /******************************************************************************************************************************************
94 * 函数名称: EXTI_State()
95 * 功能说明: 指定引脚是否触发了中断
96 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
97 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
98 * 输    出: uint32_t  1 此引脚触发了中断    0 此引脚未触发中断
99 * 注意事项: 无
100 ******************************************************************************************************************************************/
EXTI_State(GPIO_TypeDef * GPIOx,uint32_t n)101 uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
102 {
103     return (GPIOx->INTSTAT >> n) & 0x01;
104 }
105 
106 /******************************************************************************************************************************************
107 * 函数名称: EXTI_RawState()
108 * 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
109 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
110 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
111 * 输    出: uint32_t  1 此引脚满足过/了中断触发条件    0 此引脚未满足过/了中断触发条件
112 * 注意事项: 无
113 ******************************************************************************************************************************************/
EXTI_RawState(GPIO_TypeDef * GPIOx,uint32_t n)114 uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
115 {
116     return (GPIOx->INTRAWSTAT >> n) & 0x01;
117 }
118 
119 /******************************************************************************************************************************************
120 * 函数名称: EXTI_Clear()
121 * 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
122 * 输    入: GPIO_TypeDef * GPIOx  指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
123 *           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
124 * 输    出: 无
125 * 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
126 ******************************************************************************************************************************************/
EXTI_Clear(GPIO_TypeDef * GPIOx,uint32_t n)127 void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
128 {
129     GPIOx->INTCLR = (0x01 << n);
130 }
131