1 /********************************** (C) COPYRIGHT  *******************************
2  * File Name          : ch32v10x_exti.c
3  * Author             : WCH
4  * Version            : V1.0.0
5  * Date               : 2020/04/30
6  * Description        : This file provides all the EXTI firmware functions.
7  * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
8  * SPDX-License-Identifier: Apache-2.0
9  ***************************************************************************************/
10 #include "ch32v10x_exti.h"
11 
12 /* No interrupt selected */
13 #define EXTI_LINENONE    ((uint32_t)0x00000)
14 
15 /*********************************************************************
16  * @fn      EXTI_DeInit
17  *
18  * @brief   Deinitializes the EXTI peripheral registers to their default
19  *        reset values.
20  *
21  * @return  none.
22  */
EXTI_DeInit(void)23 void EXTI_DeInit(void)
24 {
25     EXTI->INTENR = 0x00000000;
26     EXTI->EVENR = 0x00000000;
27     EXTI->RTENR = 0x00000000;
28     EXTI->FTENR = 0x00000000;
29     EXTI->INTFR = 0x000FFFFF;
30 }
31 
32 /*********************************************************************
33  * @fn      EXTI_Init
34  *
35  * @brief   Initializes the EXTI peripheral according to the specified
36  *        parameters in the EXTI_InitStruct.
37  *
38  * @param   EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure
39  *
40  * @return  none.
41  */
EXTI_Init(EXTI_InitTypeDef * EXTI_InitStruct)42 void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct)
43 {
44     uint32_t tmp = 0;
45 
46     tmp = (uint32_t)EXTI_BASE;
47     if(EXTI_InitStruct->EXTI_LineCmd != DISABLE)
48     {
49         EXTI->INTENR &= ~EXTI_InitStruct->EXTI_Line;
50         EXTI->EVENR &= ~EXTI_InitStruct->EXTI_Line;
51         tmp += EXTI_InitStruct->EXTI_Mode;
52         *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line;
53         EXTI->RTENR &= ~EXTI_InitStruct->EXTI_Line;
54         EXTI->FTENR &= ~EXTI_InitStruct->EXTI_Line;
55         if(EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)
56         {
57             EXTI->RTENR |= EXTI_InitStruct->EXTI_Line;
58             EXTI->FTENR |= EXTI_InitStruct->EXTI_Line;
59         }
60         else
61         {
62             tmp = (uint32_t)EXTI_BASE;
63             tmp += EXTI_InitStruct->EXTI_Trigger;
64             *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line;
65         }
66     }
67     else
68     {
69         tmp += EXTI_InitStruct->EXTI_Mode;
70         *(__IO uint32_t *)tmp &= ~EXTI_InitStruct->EXTI_Line;
71     }
72 }
73 
74 /*********************************************************************
75  * @fn      EXTI_StructInit
76  *
77  * @brief   Fills each EXTI_InitStruct member with its reset value.
78  *
79  * @param   EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure
80  *
81  * @return  none.
82  */
EXTI_StructInit(EXTI_InitTypeDef * EXTI_InitStruct)83 void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct)
84 {
85     EXTI_InitStruct->EXTI_Line = EXTI_LINENONE;
86     EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;
87     EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;
88     EXTI_InitStruct->EXTI_LineCmd = DISABLE;
89 }
90 
91 /*********************************************************************
92  * @fn      EXTI_GenerateSWInterrupt
93  *
94  * @brief   Generates a Software interrupt.
95  *
96  * @param   EXTI_Line - specifies the EXTI lines to be enabled or disabled.
97  *
98  * @return  none.
99  */
EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)100 void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)
101 {
102     EXTI->SWIEVR |= EXTI_Line;
103 }
104 
105 /*********************************************************************
106  * @fn      EXTI_GetFlagStatus
107  *
108  * @brief   Checks whether the specified EXTI line flag is set or not.
109  *
110  * @param   EXTI_Line - specifies the EXTI lines to be enabled or disabled.
111  *
112  * @return  The new state of EXTI_Line (SET or RESET).
113  */
EXTI_GetFlagStatus(uint32_t EXTI_Line)114 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)
115 {
116     FlagStatus bitstatus = RESET;
117     if((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET)
118     {
119         bitstatus = SET;
120     }
121     else
122     {
123         bitstatus = RESET;
124     }
125     return bitstatus;
126 }
127 
128 /*********************************************************************
129  * @fn      EXTI_ClearFlag
130  *
131  * @brief   Clears the EXTI's line pending flags.
132  *
133  * @param   EXTI_Line - specifies the EXTI lines to be enabled or disabled.
134  *
135  * @return  None
136  */
EXTI_ClearFlag(uint32_t EXTI_Line)137 void EXTI_ClearFlag(uint32_t EXTI_Line)
138 {
139     EXTI->INTFR = EXTI_Line;
140 }
141 
142 /*********************************************************************
143  * @fn      EXTI_GetITStatus
144  *
145  * @brief   Checks whether the specified EXTI line is asserted or not.
146  *
147  * @param   EXTI_Line - specifies the EXTI lines to be enabled or disabled.
148  *
149  * @return  The new state of EXTI_Line (SET or RESET).
150  */
EXTI_GetITStatus(uint32_t EXTI_Line)151 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
152 {
153     ITStatus bitstatus = RESET;
154     uint32_t enablestatus = 0;
155 
156     enablestatus = EXTI->INTENR & EXTI_Line;
157     if(((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET))
158     {
159         bitstatus = SET;
160     }
161     else
162     {
163         bitstatus = RESET;
164     }
165     return bitstatus;
166 }
167 
168 /*********************************************************************
169  * @fn      EXTI_ClearITPendingBit
170  *
171  * @brief   Clears the EXTI's line pending bits.
172  *
173  * @param   EXTI_Line - specifies the EXTI lines to be enabled or disabled.
174  *
175  * @return  none
176  */
EXTI_ClearITPendingBit(uint32_t EXTI_Line)177 void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
178 {
179     EXTI->INTFR = EXTI_Line;
180 }
181