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